首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用geopanda或shapely在同一地理数据框架中查找最近的点

如何使用geopanda或shapely在同一地理数据框架中查找最近的点
EN

Stack Overflow用户
提问于 2019-06-10 13:08:40
回答 2查看 5.4K关注 0票数 4

我有一个geodataframe,显示了表示为点几何的大约25个位置。我正在尝试想出一个脚本,它遍历每个点,识别最近的位置,并返回最近位置的名称和距离。

如果我在shapely.ops库中使用nearest_points(geom1,geom2)有不同的地理数据帧,我可以很容易地做到这一点。然而,我所有的位置都存储在一个geodataframe中。我正在尝试循环,这就是我遇到麻烦的地方。

下面是我的示例文件:

代码语言:javascript
复制
geofile = gpd.GeoDataFrame([[0, 'location A', Point(55, 55)],
                            [1, 'location B', Point(66, 66)],
                            [2, 'Location C', Point(99, 99)],
                            [3, 'Location D', Point(11, 11)]],
                           columns=['ID','Location','geometry'])

下面是我创建的循环,但没有用。

代码语言:javascript
复制
for index, row in geofile.iterrows():
    nearest_geoms=nearest_points(row, geofile)
    print('location:' + nearest_geoms[0])
    print('nearest:' + nearest_geoms[1])
    print('-------')

我得到了这个错误:

代码语言:javascript
复制
AttributeError: 'Series' object has no attribute '_geom'

然而,我认为我的问题超出了错误原因,因为我必须以某种方式排除我正在循环的行,因为它将自动作为最近的位置返回,因为它就是那个位置。

我对一个位置的最终结果如下:

代码语言:javascript
复制
([0,'location A','location B', '5 miles', Point(55,55)], columns=['ID','Location','Nearest', 'Distance',geometry'])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-11 03:23:36

shapely的nearest_points函数比较形状的几何形状。若要将单个点几何图形与多个其他点几何图形进行比较,可以使用.unary_union与生成的MultiPoint几何图形进行比较。是的,在每个行操作中,丢弃相应的点,这样它就不会与自身进行比较。

代码语言:javascript
复制
import geopandas as gpd
from shapely.geometry import Point
from shapely.ops import nearest_points

df = gpd.GeoDataFrame([[0, 'location A', Point(55,55)], 
                       [1, 'location B', Point(66,66)],
                       [2, 'Location C', Point(99,99)],
                       [3, 'Location D' ,Point(11,11)]], 
                      columns=['ID','Location','geometry'])
df.insert(3, 'nearest_geometry', None)

for index, row in df.iterrows():
    point = row.geometry
    multipoint = df.drop(index, axis=0).geometry.unary_union
    queried_geom, nearest_geom = nearest_points(point, multipoint)
    df.loc[index, 'nearest_geometry'] = nearest_geom

结果是

代码语言:javascript
复制
    ID  Location    geometry        nearest_geometry
0   0   location A  POINT (55 55)   POINT (66 66)
1   1   location B  POINT (66 66)   POINT (55 55)
2   2   Location C  POINT (99 99)   POINT (66 66)
3   3   Location D  POINT (11 11)   POINT (55 55)

票数 10
EN

Stack Overflow用户

发布于 2021-11-25 00:27:14

这是另一种基于scipy.spatial.distance.cdist的方法。通过使用numpy掩码数组来避免iterrows

代码语言:javascript
复制
import geopandas as gpd
from scipy.spatial import distance
import numpy.ma as ma

df = gpd.GeoDataFrame([[0, 'location A', Point(55,55)], 
                       [1, 'location B', Point(66,66)],
                       [2, 'Location C', Point(99,99)],
                       [3, 'Location D' ,Point(11,11)]], 
                      columns=['ID','Location','geometry'])

coords = np.stack(df.geometry.apply(lambda x: [x.x, x.y]))
distance_matrix = ma.masked_where((dist := distance.cdist(*[coords] * 2)) == 0, dist)
df["closest_ID"] = np.argmin(distance_matrix, axis=0)
df = df.join(df.set_index("ID").geometry.rename("nearest_geometry"), on="closest_ID")
df.drop("closest_ID", axis=1)

# Out:
   ID    Location               geometry           nearest_geometry
0   0  location A  POINT (55.000 55.000)  POINT (66.00000 66.00000)
1   1  location B  POINT (66.000 66.000)  POINT (55.00000 55.00000)
2   2  Location C  POINT (99.000 99.000)  POINT (66.00000 66.00000)
3   3  Location D  POINT (11.000 11.000)  POINT (55.00000 55.00000)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56520780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档