我正在尝试学习如何以这种方式创建路径并重新排列和旋转数据。 我正在练习的样本数据看起来像这样。
ID Time Latitude Longitude
1 2:00 60.092033 20.765083
1 3:00 60.097300 20.672767
1 4:00 60.125550 20.593650
1 5:00 60.115233 20.505367
1 6:00 60.103800 20.425850
1 7:00 60.113750 20.335717
1 8:00 60.115683 20.303683
1 9:00 60.114817 20.305500
1 10:00 60.077983 20.316917
1 11:00 60.034500 20.305317
这些是给定时间内对象的纬度和经度。我有几个目标坐标,我想检查该对象是否在那些目标坐标内。我使用半径为2 km,如果物体在2km以内,那么我想从起始坐标转到当前坐标并使其像路径一样。第一次旋转结束后,第二次旋转开始。
我正在使用hasrsine libray来计算两个不同坐标之间的距离(km)。
lat = df['Latitude'].values
long = df['Longitude'].values
CurrentCoordinates = zip(lat, long)
TargetedCoordinates = [60.103900, 20.415850]
for i, j in CurrentCoordinates
print(haversine((i, j), TargetedCoordinates))
这给了我每个当前坐标和目标坐标之间的所有距离。
任何建议都会很棒。 谢谢
答案 0 :(得分:1)
如果我理解正确,您希望将原始数据框中的每个坐标与每个目标坐标进行比较,并在相应距离小于2 km时获取指标的数据框。
这是一种方法。关键因素是scipy.spatial.distance.cdist
,可以计算成对距离。
import pandas as pd
import numpy as np
from scipy.spatial.distance import cdist
from haversine import haversine
df = pd.read_csv(
pd.compat.StringIO(
"""ID Time Latitude Longitude
1 2:00 60.092033 20.765083
1 3:00 60.097300 20.672767
1 4:00 60.125550 20.593650
1 5:00 60.115233 20.505367
1 6:00 60.103800 20.425850
1 7:00 60.113750 20.335717
1 8:00 60.115683 20.303683
1 9:00 60.114817 20.305500
1 10:00 60.077983 20.316917
1 11:00 60.034500 20.305317"""
),
sep=r" +",
)
targets = pd.DataFrame(
[[60.103900, 20.415850], [60.403900, 20.715850]], columns=["Latitude", "Longitude"]
)
res_data = (
cdist(
df[["Latitude", "Longitude"]],
targets[["Latitude", "Longitude"]],
metric=haversine,
)
< 2
)
res_df = pd.DataFrame(
res_data,
index=df[["Latitude", "Longitude"]].round(3).apply(tuple, axis=1),
columns=targets[["Latitude", "Longitude"]].round(3).apply(tuple, axis=1),
)
结果:
(60.104, 20.416) (60.404, 20.716)
(60.092, 20.765) False False
(60.097, 20.673) False False
(60.126, 20.594) False False
(60.115, 20.505) False False
(60.104, 20.426) True False
(60.114, 20.336) False False
(60.116, 20.304) False False
(60.115, 20.306) False False
(60.078, 20.317) False False
(60.034, 20.305) False False