几何形状之间的测地距离 Python

3

有一个名为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 |

遗憾的是,Shapely距离函数计算的是欧几里得距离,而不是大圆弧距离。

另一种可行的策略是使用一个函数,计算从点A到线B [B1,B2,B3,...] 上所有点的大圆弧距离,并保留最小距离。也就是说: dist_A-B = min(geodist(A, B1), geodist(A, B2), geodist(A, B3), ....)

这个解决方案可以工作,但计算成本非常高,因为我们需要对数千个点与数千条线进行计算。 如果有任何其他更优化的方法来执行此计算,将会非常有帮助。


1
只是一个提醒:您可以使用pyprojgeopy来计算点之间的大圆距离,但我不知道如何高效地计算线串或多边形之间的大圆距离方法。 - martinfleis
我认为这是OP在问题的后半部分所指的,问题在于他们基本上正在计算第一个线串中所有点与线串2中所有点之间的距离。 - Andre.IDK
1个回答

2
如果你能将问题简化为计算到一组点的测地距离,那么一个基准点树将给出一个有效的解决方案。请参见我对类似问题的回答这里;其中包括使用python的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接