我正在努力转换一个我写的小项目,以找到形状文件在某个点的半径内的重叠边界,这个项目是我用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中的输出,这张图片放大后可以显示形状,但位置是在南极洲的中间。给出的坐标是要显示在俄亥俄州。
为了澄清一些问题,我的模型如下。
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点和缓冲区得到正确的位置 但它显示为椭圆形 因为它不是等距离的 如果有人有任何建议或提示,我将非常感激听到他们的意见!
好了,我已经找到了解决这个问题的方法。我使用了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解决方案,而是依赖于许多其他包。如果有人有原生的解决方案,我会非常喜欢。