python中的测地缓冲

2024-04-24 10:39:09 发布

您现在位置:Python中文网/ 问答频道 /正文

给定陆地多边形为ShapelyMultiPolygon,我想找到代表海岸线周围12海里缓冲区的(多)多边形。在

使用Shapelybuffer方法不起作用,因为它使用欧几里德计算。在

有人能告诉我如何在python中计算测地缓冲区吗?在


Tags: 方法代表多边形缓冲区海岸线陆地shapelybuffershapelymultipolygon
1条回答
网友
1楼 · 发布于 2024-04-24 10:39:09

这不是一个shapely问题,因为shapely在其文档中明确指出该库仅用于平面计算。但是,为了回答您的问题,您应该指定用于多边形的坐标系。 假设您使用的是WGS84投影(lat,lon),这是我在另一个SO问题(fix-up-shapely-polygon-object-when-discontinuous-after-map-projection)中找到的一个方法。您将需要pyproj库。在

import pyproj
from shapely.geometry import MultiPolygon, Polygon
from shapely.ops import transform as sh_transform
from functools import partial

wgs84_globe = pyproj.Proj(proj='latlong', ellps='WGS84')

def pol_buff_on_globe(pol, radius):
    _lon, _lat = pol.centroid.coords[0]
    aeqd = pyproj.Proj(proj='aeqd', ellps='WGS84', datum='WGS84',
                       lat_0=_lat, lon_0=_lon)
    project_pol = sh_transform(partial(pyproj.transform, wgs84_globe, aeqd), pol)
    return sh_transform( partial(pyproj.transform, aeqd, wgs84_globe),
                          project_pol.buffer(radius))

def multipol_buff_on_globe(multipol, radius):
    return MultiPolygon([pol_buff_on_globe(g, radius) for g in multipol])

pol_buff_on_globe函数执行以下操作。首先,建立一个以多边形质心为中心的方位等距投影。然后,将多边形的坐标系更改为该投影。然后在那里建立缓冲区,然后将缓冲多边形的坐标系改为WGS84坐标系。在

需要特别注意:

  • 您需要了解如何将所需距离转换为aeqd投影中使用的距离。在
  • 注意不要缓冲包括极(见上述SO问题)。在
  • 我们使用多边形的质心使投影居中这一事实应该可以保证答案是足够好的,但是如果您有特定的精度要求,则不应使用此解决方案,或者至少对您使用的典型多边形的误差进行表征。在

相关问题 更多 >