你能在GeoDjango中原生地做Azimuthal Equidistant投影吗?

问题描述 投票:0回答:1

我正在努力转换一个我写的小项目,以找到形状文件在某个点的半径内的重叠边界,这个项目是我用Shapely和GeoPandas写的模拟项目,我想让它更适合生产。这个原始项目是我用Shapely和GeoPandas写的一个模拟项目,为了让这个项目更适合生产,我正在把它全部转换到GeoDjango中。

有一件事对这个程序至关重要,那就是在地图上创建一个圆的等距投影。我能够使用pyproj和functools用shapely对象来完成这个任务。

要知道,这个解决方案是在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对象,但它的结果是不正确的位置和形状。

下面是我用来投射上述函数中的shapely对象的代码。

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

下面是Django Admin中的输出,这张图片放大后可以显示形状,但位置是在南极洲的中间。给出的坐标是要显示在俄亥俄州。

django admin geo output

为了澄清一些问题,我的模型如下。

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个回答
0
投票

好了,我已经找到了解决这个问题的方法。我使用了shapely等距投影代码,并对其进行了扩展,将其转换回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解决方案,而是依赖于许多其他包。如果有人有原生的解决方案,我会非常喜欢。

© www.soinside.com 2019 - 2024. All rights reserved.