我正在尝试使用Geopandas对.shp
中的某些数据进行地理处理。
我想在几何边缘找到一个点,给出一个轴承和一个初始点。
如何以优化的方式完成此操作,因为算法将处理大量迭代(大约每点十个)?
答案 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)