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

