如何计算两个数据集内各站点间的最小距离?(附问题代码)
问题分析与解决建议
你的代码无法运行的核心问题是遍历对象错误:你把数据集转成字典后,循环遍历的是字典的键(比如site_id、latitude这类列名),而不是每个站点的坐标对,geopy.distance需要的是单个坐标元组((纬度, 经度)),不是整列数据,所以会报错。
修正步骤与代码示例
- 首先确保
dataset1和dataset2是Pandas DataFrame(取消注释你代码里的pd.DataFrame转换行,或者直接使用原始的DataFrame) - 遍历
dataset1的每个站点,提取其坐标,再与dataset2的所有站点坐标计算距离,筛选出最小值 - 将最小距离存入
dataset1的新列中
修正后的代码:
from geopy import distance import pandas as pd # 确保数据集是DataFrame(如果原始dataset1/dataset2已经是DataFrame,这两行可以省略) dataset1 = pd.DataFrame({ 'site_id': dataset1['site_id'], 'latitude': dataset1['latitude'], 'longitude': dataset1['longitude'] }) dataset2 = pd.DataFrame({ 'site_id': dataset2['site_id'], 'latitude': dataset2['latitude'], 'longitude': dataset2['longitude'] }) # 新增一列存储最小距离 dataset1['min_distance_to_dataset2'] = 0.0 # 遍历dataset1的每个站点 for idx, row in dataset1.iterrows(): # 获取当前站点的坐标 current_coord = (row['latitude'], row['longitude']) min_dist = float('inf') # 初始化最小距离为无穷大 # 遍历dataset2的所有站点计算距离 for _, d_row in dataset2.iterrows(): target_coord = (d_row['latitude'], d_row['longitude']) dist_km = distance.distance(current_coord, target_coord).km # 更新最小距离 if dist_km < min_dist: min_dist = dist_km # 将最小距离存入新列 dataset1.loc[idx, 'min_distance_to_dataset2'] = min_dist print(f"站点{row['site_id']}到dataset2的最近距离: {min_dist:.2f} km") # 查看结果 print(dataset1)
优化建议(针对大数据集)
如果你的数据集行数较多,双重循环会非常慢,推荐使用scipy.spatial.distance.cdist批量计算距离矩阵,再取每行的最小值,效率会提升很多:
from geopy.distance import geodesic from scipy.spatial.distance import cdist import pandas as pd # 提取坐标数组 coords1 = dataset1[['latitude', 'longitude']].values coords2 = dataset2[['latitude', 'longitude']].values # 批量计算距离矩阵(注意geodesic需要转换为函数传入) distance_matrix = cdist(coords1, coords2, lambda u, v: geodesic(u, v).km) # 取每行的最小值,即每个站点的最近距离 dataset1['min_distance_to_dataset2'] = distance_matrix.min(axis=1)
内容的提问来源于stack exchange,提问作者S L
相关产品推荐
相关产品推荐

