根据点和方位查找 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)
我正在尝试使用 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)