根据点和方位,在Geopandas几何边上找到内部距离

时间:2017-09-01 16:18:43

标签: python shapefile geopandas

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

我想在几何边缘找到一个点,给出一个轴承和一个初始点。

如何以优化的方式完成此操作,因为算法将处理大量迭代(大约每点十个)?

Image

1 个答案:

答案 0 :(得分:1)

这取决于你是否想要坚持lon / lat,或者你可以切换到像UTM这样的投影坐标系;以及bearing到底是什么意思。假设投影坐标和compass bearing(北方时钟度:0-360)的一种可能方法是在轴承方向画一条线,该线足够长以与多边形相交并计算坐标。路口。

让我们说我们有一个GeoDataFrame,其中包含柏林某区的Polygon:

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)

enter image description here