我有一个从gps设备创建的lat / lng点的pandas数据帧。
我的问题是如何为gps轨迹线中的每个点之间的距离生成距离列。
一些谷歌搜索给了我下面的半正方法,该方法使用iloc
选择的单个值工作,但我正在努力研究如何迭代方法输入的数据帧。
我以为我可以运行一个for循环,其中包含
的内容for i in len(df):
df['dist'] = haversine(df['lng'].iloc[i],df['lat'].iloc[i],df['lng'].iloc[i+1],df['lat'].iloc[i+1]))
但我收到错误TypeError: 'int' object is not iterable
。我也在考虑df.apply
,但我不确定如何获得适当的输入。任何帮助或提示。如何做到这一点将不胜感激。
样本DF
lat lng
0 -7.11873 113.72512
1 -7.11873 113.72500
2 -7.11870 113.72476
3 -7.11870 113.72457
4 -7.11874 113.72444
方法
def haversine(lon1, lat1, lon2, lat2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
c = 2 * math.asin(math.sqrt(a))
km = 6367 * c
return km
答案 0 :(得分:1)
lat lon dist2next
0 -7.11873 113.72512 0.013232
1 -7.11873 113.72500 0.026464
2 -7.11873 113.72476 0.020951
3 -7.11873 113.72457 0.014335
4 -7.11873 113.72444 NaN
使用pandas.rolling_apply可能是一种聪明的方法......但是为了快速解决方案,我会做这样的事情。
def haversine(loc1, loc2):
# convert decimal degrees to radians
lon1, lat1 = map(math.radians, loc1)
lon2, lat2 = map(math.radians, loc2)
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
c = 2 * math.asin(math.sqrt(a))
km = 6367 * c
return km
df['dist2next'] = np.nan
for i in df.index[:-1]:
loc1 = df.ix[i, ['lon', 'lat']]
loc2 = df.ix[i+1, ['lon', 'lat']]
df.ix[i, 'dist2next'] = haversine(loc1, loc2)
或者,如果你不想像这样修改你的半身像功能,你可以使用df.ix [i,' lon']一次一个地选择一个或多个, df.ix [i,' lat'],df.ix [i + 1,' lon]等。
答案 1 :(得分:0)
我建议使用更快的变量循环通过df这样的
df_shift = df.shift(1)
df = df.join(df_shift, l_suffix="lag_")
log = []
for rows in df.itertuples():
log.append(haversine(rows.lng ,rows.lat, rows.lag_lng, rows.lag_lat))
pd.DataFrame(log)