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

for循环调用geopy.distance.geodesic计算轨迹点间距报错如何解决

问题解决方法

错误原因

geopy.distance.geodesic() 的入参规则是接收2个坐标对,每个坐标对为 (纬度, 经度) 格式的可迭代对象。你原代码中将四个经纬度数值单独作为参数传入,方法会误将每个数值识别为独立的坐标点,因此触发单值构造Point的报错。

代码修改方案

方案1:最小改动适配原循环逻辑

只需要调整geodesic的传参格式,同时把距离转换为你需要的单位(比如米、千米),避免存储geopy的Distance对象:

import geopy.distance

current_trip_id = ""
trip3["geopy_distance"] = 0

for index,row in trip3.iterrows():
    if row["trip_id"] == current_trip_id:
        final_pos = (row["latitude"], row["longitude"])
        # 调整传参:两个坐标元组作为入参,.m表示返回米为单位的数值,也可以用.km返回千米
        my_dist = geopy.distance.geodesic(initial_pos, final_pos).m
        trip3.loc[index, "geopy_distance"] = my_dist
    current_trip_id = row["trip_id"]
    initial_pos = (row["latitude"], row["longitude"])

方案2:更高效的pandas分组实现(避免循环,适合大数据量)

用groupby按行程分组后移位得到前一个点的坐标,批量计算:

import geopy.distance
import pandas as pd

# 按trip_id分组,将每个行程的经纬度后移一位得到上一个观测点的坐标
trip3['prev_lat'] = trip3.groupby('trip_id')['latitude'].shift(1)
trip3['prev_lon'] = trip3.groupby('trip_id')['longitude'].shift(1)

# 定义批量计算距离的函数
def calc_distance(row):
    if pd.isna(row['prev_lat']):
        return 0
    return geopy.distance.geodesic((row['prev_lat'], row['prev_lon']), (row['latitude'], row['longitude'])).m

# 应用函数得到结果
trip3['geopy_distance'] = trip3.apply(calc_distance, axis=1)

# 可选:删除中间生成的辅助列
trip3.drop(['prev_lat', 'prev_lon'], axis=1, inplace=True)

单位说明

你可以根据需要调整返回的距离单位:

  • .m:返回米
  • .km:返回千米
  • .mi:返回英里
  • .ft:返回英尺

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 17:27:03