【问题标题】:Can you do Azimuthal Equidistant projections natively in GeoDjango?您可以在 GeoDjango 中本地进行方位角等距投影吗?
【发布时间】:2020-06-09 20:51:30
【问题描述】:

我正在转换我编写的一个小项目,以在某个点的半径内找到形状文件的重叠边界。这个原始项目是我使用 Shapely 和 GeoPandas 编写的模型项目,为了使其更适合生产,我将其全部转换为 GeoDjango。

对于这个程序来说,有一件事很重要,那就是在地图上创建一个圆的等距投影。我能够使用 pyproj 和 functools 对形状匀称的对象做到这一点。

让大家知道这个解决方案是在 stackoverflow 上找到的,不是我原来的解决方案。

from shapely import geometry
from functools import partial

def createGeoCircle(lat, lng, mi):
    proj_wgs84 = pyproj.Proj(init='epsg:4326')
    aeqd_proj = '+proj=aeqd +lat_0={lat} +lon_0={lng} +x_0=0 +y_0=0'
    project = partial(
        pyproj.transform,
        pyproj.Proj(aeqd_proj.format(lat=lat, lng=lng)),
        proj_wgs84)
    buf = geometry.Point(0, 0).buffer(mi * 1.60934 * 1000)

    circle = transform(project, buf)
    return circle

我尝试再次使用此解决方案并从 shapely 对象创建 geoDjango MultiPolygon 对象,但它导致放置和形状不正确。

这是我用来投射来自上述函数的匀称物体的代码。

shape_model(geometry=geos.MultiPolygon(geos.GEOSGeometry(createGeoCircle(41.378397, -81.2446768, 1).wkt)), state="CircleTest").save()

这是 Django Admin 中的输出。这张图片放大显示形状,但位置在南极洲的中部。给出的坐标是为了显示在俄亥俄州。

为了澄清一些事情,我的模型如下:

class shape_model(geo_models.Model):
    state    = geo_models.CharField('State Territory ID', max_length=80)
    aFactor  = geo_models.FloatField()
    bFactor  = geo_models.FloatField()
    geometry = geo_models.MultiPolygonField(srid=4326)

我可以通过简单地使用 geodjango 点和缓冲区来获得正确的位置,但它显示为椭圆形,因为它不是等距的。如果有人有任何建议或提示,我将不胜感激!

【问题讨论】:

    标签: python django gis postgis geodjango


    【解决方案1】:

    好的,我已经找到了解决这个问题的方法。我使用了匀称的等距投影代码并将其扩展以将其转换回 EPSG:4326。更新后的功能如下:

    def createGeoCircle(lat, lng, mi):
        point = geometry.Point(lat, lng)
    
        local_azimuthal_projection = f"+proj=aeqd +lat_0={lat} +lon_0={lng} +x_0=0 +y_0=0"
        proj_wgs84 = pyproj.Proj('epsg:4326')
    
        wgs84_to_aeqd = partial(
            pyproj.transform,
            proj_wgs84,
            pyproj.Proj(local_azimuthal_projection),
        )
    
        aeqd_to_wgs84 = partial(
            pyproj.transform,
            pyproj.Proj(local_azimuthal_projection),
            proj_wgs84,
        )
    
        point_transformed = transform(wgs84_to_aeqd, point)
    
        buffer = point_transformed.buffer(mi * 1.60934 * 1000)
    
        buffer_wgs84 = transform(aeqd_to_wgs84, buffer)
    
        return json.dumps(geometry.mapping(buffer_wgs84))
    

    我还从这个函数中转储几何映射,因此现在可以将它直接加载到 geos MultiPolygon 中,而不是使用对象的 wkt。我将圆圈加载到模型中并使用以下内容保存:

    shape_model(geometry=geos.MultiPolygon(geos.GEOSGeometry(createGeoCircle(41.378397, -81.2446768, 1))), state="CircleTest", aFactor=1.0, bFactor=1.0).save()

    仅供参考,这不是原生 geodjango 解决方案,它依赖于许多其他软件包。如果有人有本机解决方案,我会非常喜欢!

    【讨论】:

      猜你喜欢
      • 2016-06-04
      • 2023-02-25
      • 2020-11-04
      • 2012-02-10
      • 2014-02-28
      • 2019-05-22
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      相关资源
      最近更新 更多