python 中的测地线缓冲

Geodesic buffering in python

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

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

有人可以告诉我如何计算 python 中的测地线缓冲区吗?

这不是一个 shapely 问题,因为 shapely 在其文档中明确说明该库仅用于平面计算。不过,为了回答您的问题,您应该指定用于多面体的坐标系。 假设您使用的是 WGS84 投影(纬度、经度),这是我在另一个 SO 问题 () 中找到的方法。您将需要 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 问题)。
  • 我们使用多边形的质心来使投影居中这一事实应该保证答案足够好,但是如果您有特定的精度要求,则不应使用此解决方案,或者至少对您正在使用的典型多边形的错误。