根据点和方位查找 Geopandas 几何边缘内部的距离

Find distance inside on a Geopandas geometry edge, based on points and bearing

我正在尝试使用 Geopandas 对 .shp 中的一些数据进行地理处理。

给定方位角和其中的初始点,我想在几何边上找到一个点。

我如何以优化的方式执行此操作,因为该算法将处理大量迭代(大约:每个点十次)?

这取决于你是想坚持lon/lat还是可以像UTM那样切换到投影坐标系;以及 bearing 的确切含义。假设投影坐标和 compass bearing(从北顺时针方向:0-360)的一种可能方法是在方位方向画一条线,该线的长度足以与多边形相交并计算路口。

假设我们有一个 GeoDataFrame,其中包含柏林某个地区的多边形:

berlin
# 
#    bbox_east  bbox_north  bbox_south  bbox_west   geometry    place_name
# 0 13.429402   52.540407   52.504037   13.36586    POLYGON ((389163.2519209321 5821873.324153989,...   Mitte, Berlin, Deutschland

计算几何体的质心x/y(可以是任意点,这里我用质心表示):

x = berlin.centroid.geometry.item().x
y = berlin.centroid.geometry.item().y

以下函数可以计算新点的坐标:

from shapely.geometry import LineString, LinearRing

def find_point(polygon, x, y , bearing):

    east, south, west, north = polygon.bounds
    line_length = max(abs(east-west), abs(north-south)) * 2

    new_x = x + (np.sin(np.deg2rad(bearing)) * line_length)
    new_y = y + (np.cos(np.deg2rad(bearing)) * line_length)

    l = LineString([[x,y], [new_x, new_y]])
    lr = LinearRing(polygon.exterior.coords)
    intersections = lr.intersection(l)

    return intersections.x, intersections.y

用我们的输入数据试试:

x_, y_ = find_point(berlin.geometry[0], x, y, 120)

fig, ax = plt.subplots()

berlin.plot(ax=ax)
plt.scatter(x_, y_)
plt.scatter(x,y)