【发布时间】:2020-09-09 07:08:31
【问题描述】:
拥有一个 dfA,其中包含一个名为 geometry 的列,具有以下几何形状:
d = {'id': [1, 2], 'geometry': ['POINT (-70.66000 -33.45000)', 'POINT (-74.08000 4.60000)']}
dfA = pd.DataFrame(data=d)
dfA
| | id | geometry |
|---|----|-----------------------|
| 0 | 1 | POINT (-70.66 -33.45) |
| 1 | 2 | POINT (-74.08 4.6) |
我想计算 dfB 几何列的每个几何形状的最小测地距离:
d = {'id': [1, 2, 3], 'geometry': ['LINESTRING (-58.66000 -34.58000, -59.66000 -35.58000)', 'LINESTRING (-47.91000 -15.78000, -48.91000 -16.78000)', 'POINT (-66.86000 10.48000)']}
dfB = pd.DataFrame(data=d)
dfB
| | id | geometry |
|---|----|-------------------------------------------|
| 0 | 1 | LINESTRING (-58.66 -34.58, -59.66 -35.58) |
| 1 | 2 | LINESTRING (-47.91 -15.78, -48.91 -16.78) |
| 2 | 3 | POINT (-66.86 10.48) |
我尝试按照以下步骤使用 Python shapely 和 geopandas 库进行此计算:
from shapely import wkt
import geopandas as gpd
dfA['geometry'] = dfA['geometry'].apply(wkt.loads)
dfA = gpd.GeoDataFrame(dfA, geometry='geometry')
dfB['geometry']= dfB['geometry'].apply(wkt.loads)
for i, value in dfB.iterrows():
e = dfB.iloc[i]['id']
dfA[str(e)] = dfA['geometry'].distance(dfB.iloc[i]['geometry'])
dfA
| | id | geometry | 1 | 2 | 3 |
|---|----|-----------------------|-------------|-------------|-------------|
| 0 | 1 | POINT (-70.66 -33.45) | 11,20432506 | 27,40349248 | 44,09404608 |
| 1 | 2 | POINT (-74.08 4.6) | 42,10521108 | 33,0247377 | 9,311433832 |
不幸的是,匀称距离函数计算的是欧几里得距离而不是测地线距离。
要遵循的另一个策略是使用一个函数来计算从点 A 到线 B [B1、B2、B3、...] 上所有点的测地线距离并保持最小距离。也就是说: dist_A-B = min(geodist(A, B1), geodist(A, B2), geodist(A, B3), ....)
此解决方案有效,但计算成本非常高,因为我们正在讨论从数千个点对数千条线进行计算。 执行此计算的任何其他更优化的方法都会有很大帮助。
【问题讨论】:
-
请注意:您可以使用
pyproj或geopy计算点之间的测地线距离,但我不知道线串或多边形之间的有效测地线距离方法。 -
我认为这就是 OP 在问题的后半部分所指的,这里的问题是他们基本上是在计算第一个线串中所有点与线串 2.
标签: python distance geopandas shapely geodesic-sphere