0
我正在嘗試使用Geopandas對.shp
中的某些數據進行地理處理。根據點和軸承在Geopandas幾何邊緣內找到距離
我想在幾何邊緣找到一個點,給定一個軸承和一個初始點。
如何以優化的方式來做到這一點,因爲算法會處理大量迭代(大約每點10個點)?
我正在嘗試使用Geopandas對.shp
中的某些數據進行地理處理。根據點和軸承在Geopandas幾何邊緣內找到距離
我想在幾何邊緣找到一個點,給定一個軸承和一個初始點。
如何以優化的方式來做到這一點,因爲算法會處理大量迭代(大約每點10個點)?
這取決於你是否要堅持經度/緯度或您可以切換到投影座標系統,如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)
正是我一直在尋找。事實上,該算法接收WGS84中的數據,然後將其轉換爲UTM。軸承正是你所回答的! 我正在嘗試學習Python到地理處理,並對wind fetch和wave-oriented分析進行一些計算,有時,除了某些庫的文檔外,很難找到信息。 非常感謝您的幫助! –