-1

据我所知,匀称只使用笛卡尔坐标系。我在地球上有两点经纬度坐标。我需要在这两个点周围创建半径为 1 公里的缓冲区并找到该缓冲区相交的多边形。

但建

buffer = Point(54.4353,65.87343).buffer(0.001) 创建简单的圆,但在地球上的投影中它变成椭圆,但我需要两个半径为 1 公里的实圆。

我想,我需要将我的缓冲区转换为新的投影,然后将其相交,但现在不要这样做有多正确。

4

1 回答 1

3

你需要按照你说的去做。为此,您将需要使用一个处理投影的库(这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将为您提供一个以纬度为单位的多边形,该多边形是在以该点为中心的方位角等距投影中缓冲给定点的结果(根据您的要求,您可以做到最好。两个观察结果:

  1. 我不记得radius参数的单位。我认为是以米为单位的,所以如果你需要一个 10 公里的缓冲区,你需要通过 10e3。但是,请检查一下!
  2. 小心使用这个与半径到宽或彼此相距很远的点。当这些点靠近您使投影居中的点时,投影效果很好。
于 2017-07-04T12:22:28.297 回答