如何基于上下车坐标计算距离,为DataFrame新增distance字段
问题场景
我有一张包含上车、下车坐标的表格,想要在dataframe中新增名为distance的变量存储两点距离。我是数据科学领域新人,目前是参考网上其他代码尝试调整实现逻辑,之前搜索了相关方法但一直没有成功实现。
表格为包含上下车经纬度列的结构化表格,每行对应一条行程记录。
我写的下方代码运行出错,我不清楚该如何正确将角度转换为弧度,非常希望能获得正确的实现方向。
def haversine_np(lon1, lat1, lon2, lat2): """ Calculate the great circle distance between two points on the earth (specified in decimal degrees) All args must be of equal length. """ lon1, lat1, lon2, lat2 = map(np.radians, [pickup_longitude, pickup_latitude, dropoff_longitude, dropoff_latitude]) dlon = lon2 - lon1 dlat = lat2 - lat1 a = np.sin(dlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2.0)**2 c = 2 * np.arcsin(np.sqrt(a)) km = 6367 * c return km data['distance'] = haversine_np(data['lon1'],data['lat1'],data['lon2'],data['lat2'])
运行报错为变量未定义类错误。
错误原因&解决方法
- 核心错误是
haversine_np函数定义时的形参为lon1、lat1、lon2、lat2,但函数内部做弧度转换时没有使用传入的形参,反而调用了未定义的全局变量pickup_longitude、pickup_latitude等,直接触发变量未定义报错。 - 角度转弧度的逻辑本身没有问题,只需要把转弧度时的变量列表替换为函数接收的形参即可正常运行。
修正后可用代码
import numpy as np import pandas as pd def haversine_np(lon1, lat1, lon2, lat2): """ 计算地球上两点的大圆距离,输入坐标为十进制度格式 所有输入参数长度需保持一致 """ # 替换为函数接收的形参完成弧度转换 lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2]) dlon = lon2 - lon1 dlat = lat2 - lat1 a = np.sin(dlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2.0)**2 c = 2 * np.arcsin(np.sqrt(a)) # 地球半径取值6367km,返回结果单位为km km = 6367 * c return km # 传入DataFrame中对应上下车经纬度的列名即可生成distance列 data['distance'] = haversine_np(data['lon1'], data['lat1'], data['lon2'], data['lat2'])
内容的提问来源于stack exchange,提问作者Simon Cairns
相关产品推荐
相关产品推荐

