You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于距离计算匹配两个DataFrame间经纬度点的最近位置

经纬度点位最近邻匹配实现

针对两类带经纬度信息的点位,按空间距离最近规则做关联匹配,以下是可直接复用的实现方案。

示例输入数据

import pandas as pd
import numpy as np
from sklearn.neighbors import BallTree

# 计量设备点位数据集
df_device = pd.DataFrame({
    'device_id': [1, 2],
    'lat': [32, 55],
    'long': [-89, -8]
})

# 站点点位数据集
df_station = pd.DataFrame({
    'station_id': [10, 20],
    'lat': [33, 56],
    'long': [-88.23, -7]        
})

实现代码

采用BallTree做球面距离最近邻查询,适配经纬度的球面空间特性,计算效率远高于暴力遍历,适合万级以上点位的匹配场景:

# Haversine距离计算要求输入为弧度单位,先做角度转弧度
device_coords = np.deg2rad(df_device[['lat', 'long']].values)
station_coords = np.deg2rad(df_station[['lat', 'long']].values)

# 构建站点点位的球面距离索引
tree = BallTree(station_coords, metric='haversine')
# 查询每个设备点距离最近的1个站点,返回弧度距离、对应站点在df_station中的索引
dist_rad, nearest_idx = tree.query(device_coords, k=1)

# 关联匹配结果,距离转换为公里单位(地球平均半径取6371km)
df_result = df_device.copy()
df_result['nearest_station_id'] = df_station.iloc[nearest_idx.flatten()]['station_id'].values
df_result['station_lat'] = df_station.iloc[nearest_idx.flatten()]['lat'].values
df_result['station_long'] = df_station.iloc[nearest_idx.flatten()]['long'].values
df_result['distance_km'] = dist_rad.flatten() * 6371

输出效果

运行后得到的匹配结果和预期一致:

device_id  lat  long  nearest_station_id  station_lat  station_long  distance_km
0          1   32   -89                  10        33.0        -88.23   133.925263
1          2   55    -8                  20        56.0         -7.00   128.010711

预期输出参考截图:
点位最近邻匹配结果示例

补充说明

  • 若点位集中在极小范围区域、对距离精度要求低,也可直接用欧氏距离计算,省略弧度转换步骤
  • 若需要匹配每个点位最近的N个站点,只需修改query方法的k参数为对应数值即可
  • 若数据集小于1000条,也可以用scipy的distance.cdist暴力计算所有点对距离取最小值,逻辑更直观但大数据量下性能差

内容的提问来源于stack exchange,提问作者Sadcow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:09:27