如何将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
相关产品推荐
相关产品推荐

