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

如何基于上下车坐标计算距离,为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:48:03