据我所知,匀称只使用笛卡尔坐标系。我在地球上有两点经纬度坐标。我需要在这两个点周围创建半径为 1 公里的缓冲区并找到该缓冲区相交的多边形。
但建
buffer = Point(54.4353,65.87343).buffer(0.001) 创建简单的圆,但在地球上的投影中它变成椭圆,但我需要两个半径为 1 公里的实圆。
我想,我需要将我的缓冲区转换为新的投影,然后将其相交,但现在不要这样做有多正确。
据我所知,匀称只使用笛卡尔坐标系。我在地球上有两点经纬度坐标。我需要在这两个点周围创建半径为 1 公里的缓冲区并找到该缓冲区相交的多边形。
但建
buffer = Point(54.4353,65.87343).buffer(0.001) 创建简单的圆,但在地球上的投影中它变成椭圆,但我需要两个半径为 1 公里的实圆。
我想,我需要将我的缓冲区转换为新的投影,然后将其相交,但现在不要这样做有多正确。
你需要按照你说的去做。为此,您将需要使用一个处理投影的库(这pyproj
是这里的选择)。在 python的测地线缓冲中有一个类似的问题
import pyproj
from shapely.geometry import MultiPolygon, Polygon, Point
from shapely.ops import transform as sh_transform
from functools import partial
wgs84_globe = pyproj.Proj(proj='latlong', ellps='WGS84')
def point_buff_on_globe(lat, lon, radius):
#First, you build the Azimuthal Equidistant Projection centered in the
# point given by WGS84 lat, lon coordinates
aeqd = pyproj.Proj(proj='aeqd', ellps='WGS84', datum='WGS84',
lat_0=lat, lon_0=lon)
#You then transform the coordinates of that point in that projection
project_coords = pyproj.transform(wgs84_globe, aeqd, lon, lat)
# Build a shapely point with that coordinates and buffer it in the aeqd projection
aeqd_buffer = Point(project_coords).buffer(radius)
# Transform back to WGS84 each coordinate of the aeqd buffer.
# Notice the clever use of sh_transform with partial functor, this is
# something that I learned here in SO. A plain iteration in the coordinates
# will do the job too.
projected_pol = sh_transform(partial(pyproj.transform, aeqd, wgs84_globe),
aeqd_buffer)
return projected_pol
该函数point_buff_on_globe
将为您提供一个以纬度为单位的多边形,该多边形是在以该点为中心的方位角等距投影中缓冲给定点的结果(根据您的要求,您可以做到最好。两个观察结果:
radius
参数的单位。我认为是以米为单位的,所以如果你需要一个 10 公里的缓冲区,你需要通过 10e3。但是,请检查一下!