在GeoPandas中计算两个点GeoDataFrame之间的所有距离。

9

这是一个相当简单的案例,但我迄今为止没有找到任何简单的方法来完成它。想法是获取定义在一个GeoDataFrame中的所有点与另一个GeoDataFrame中定义的所有点之间的一组距离。

import geopandas as gpd
import pandas as pd

# random coordinates
gdf_1 = gpd.GeoDataFrame(geometry=gpd.points_from_xy([0, 0, 0], [0, 90, 120]))
gdf_2 = gpd.GeoDataFrame(geometry=gpd.points_from_xy([0, 0], [0, -90]))
print(gdf_1)
print(gdf_2)

#  distances are calculated elementwise
print(gdf_1.distance(gdf_2))

此功能可以产生两个 GeoDataFrame 中具有相同索引的点之间的逐元素距离(同时还会出现警告,因为这两个 GeoSeries 的索引不相同,这也是我的情况)。

                geometry
0    POINT (0.000 0.000)
1   POINT (0.000 90.000)
2  POINT (0.000 120.000)
                    geometry
0    POINT (0.00000 0.00000)
1  POINT (0.00000 -90.00000)
/home/seydoux/anaconda3/envs/chelyabinsk/lib/python3.8/site-packages/geopandas/base.py:39: UserWarning: The indices of the two GeoSeries are different.
  warn("The indices of the two GeoSeries are different.")
0      0.0
1    180.0
2      NaN

问题是:如何获取所有点到点的距离序列(或至少是gdf_1gdf_2的唯一索引组合,因为它是对称的)。

编辑


1
你有搜索过吗?我记得有很多关于计算两组坐标(大地或其他)之间距离的问题/答案,这些坐标存储在数组、列表和数据框中。你的问题可能太宽泛或重复了,而且也许与请求其他库的主题不符。 - wwii
是的,我会将所有相关帖子放在问题中。这里没有针对我提出的组合情况的答案。 - Leonard
你正在尝试解决的问题是将一个函数应用于两个数据框之间所有坐标的组合吗?而你卡住的部分是如何获取这些组合? - wwii
没错,@wwii。我在想(1)是否已经存在这样的函数或者(2)如何将两个数据框之间的所有坐标组合起来。 - Leonard
我没有安装geopandas, 所以无法确定distance方法是否可以进行广播操作,但你可以尝试这个方法:gdf_1['geometry'].distance(gdf_2['geometry'].values[:,None]) - wwii
显示剩余2条评论
1个回答

13

你需要对第一个gdf中的每个几何体都进行操作,以获取到所有第二个gdf中的几何体之间的距离。

import geopandas as gpd
import pandas as pd

# random coordinates
gdf_1 = gpd.GeoDataFrame(geometry=gpd.points_from_xy([0, 0, 0], [0, 90, 120]))
gdf_2 = gpd.GeoDataFrame(geometry=gpd.points_from_xy([0, 0], [0, -90]))

gdf_1.geometry.apply(lambda g: gdf_2.distance(g))
      0      1
0    0.0   90.0
1   90.0  180.0
2  120.0  210.0

1
这太慢了:/ - Intelligent-Infrastructure
这对于多边形来说非常慢 - 它计算了我认为是两个区域(两个边界)之间的最小距离 - 这不是我所需要的。我将几何图形更改为质心,然后它立即起作用 :) - Intelligent-Infrastructure

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