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

如何将Haversine距离函数应用于DataFrame计算固定点到多坐标的距离

批量计算坐标点到固定点位距离的实现方案

首先导入所需依赖:

import pandas as pd
from math import radians, sin, cos, asin, sqrt

你可以根据数据量大小选择以下两种实现方式:

方法1:apply逐行计算(适合小数据集,代码简单易维护)

直接复用你已有的哈弗辛距离函数,配合pandas的apply方法逐行计算:

# 固定坐标参数
lat_fix = 48.167
lon_fix = -99.648

# 你的原始距离计算函数
def dist(lat1, long1, lat2, long2):
    # 角度转弧度
    lat1, long1, lat2, long2 = map(radians, [lat1, long1, lat2, long2])
    # 哈弗辛公式计算
    dlon = long2 - long1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    # 地球半径取6371公里,返回公里单位的距离
    km = 6371 * c
    return km

# 批量计算,结果存入新列distance_km
coordinates_df['distance_km'] = coordinates_df.apply(
    lambda row: dist(lat_fix, lon_fix, row['Latitude'], row['Longitude']),
    axis=1
)

运行后直接打印coordinates_df即可查看每个点位对应的距离结果。

方法2:向量化运算(适合数千条及以上的大数据集,运算效率更高)

使用numpy的向量化运算替代逐行遍历,运算速度比apply方法快5~10倍:

import numpy as np

def vectorized_dist(lat1, lon1, lat_arr, lon_arr):
    # 批量转换为弧度
    lat1 = np.radians(lat1)
    lon1 = np.radians(lon1)
    lat_arr = np.radians(lat_arr)
    lon_arr = np.radians(lon_arr)
    
    dlon = lon_arr - lon1
    dlat = lat_arr - lat1
    a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat_arr) * np.sin(dlon/2)**2
    c = 2 * np.arcsin(np.sqrt(a))
    km = 6371 * c
    return km

# 直接对整列进行运算,不需要逐行遍历
coordinates_df['distance_km'] = vectorized_dist(lat_fix, lon_fix, coordinates_df['Latitude'], coordinates_df['Longitude'])

提示:如果需要返回英里单位的距离,将公式中的地球半径参数6371替换为3956即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:09:03