特定纬度/经度从纬度/经度的csv列表中计算最近点

问题描述 投票:0回答:1

需要高效的python代码(使用熊猫)的帮助,以找出哪辆车在什么时间经过的时间最接近identity_sw =(35.7158,-120.7640)。我在确定欧几里得距离以在df以下进行排序并打印哪个车辆及其对应的时间最接近identity_sw时遇到麻烦。所有时间均为HH:MM:SS.SS(假设以下时间为12小时)。

我的时间转换功能-

def time_convert(str_time):                                                   
values = str_time.split(':')                                                         
mins = 60*(float(values[0]) - 12) + float(values[1]) + 1.0/60 * float(values[2])     
mins = round(mins, 4)                                                                
return mins    

我的csv数据框-

vehicle time    lat[D.DDD]  lon[D.DDD]
veh_1   17:19.5 35.7167809  -120.7645652
veh_1   17:19.5 35.7167808  -120.7645652
veh_1   17:19.7 35.7167811  -120.7645648
veh_1   17:20.1 35.7167812  -120.7645652
veh_2   17:20.4 35.7167813  -120.7645647
veh_2   17:20.7 35.7167813  -120.7645646
veh_3   17:22.6 35.7167807  -120.7645651
veh_3   17:23.4 35.7167808  -120.7645652
veh_4   17:24.1 35.7167803  -120.7645653
veh_4   17:25.0 35.7167806  -120.7645658
veh_5   17:25.9 35.7167798  -120.7645659
veh_5   17:26.6 35.7167799  -120.7645658
python csv pandas dataframe euclidean-distance
1个回答
0
投票

因此,一开始,我建议您使用Geopy之类的库来进行计算点之间距离的繁重工作。其次,我建议使用GeoPandas存储地理信息。稍后再讨论。

假设您的距离函数称为distance(您自己编写代码,或根据需要从Geopy获取它),这将在一定程度上帮助您加快速度。请注意,即使以下实现使用vectorize库中的vectorize,也仍然是循环。另外,以下是伪代码,您将必须对其进行修改才能使用。

numpy

推荐GeoPandas的原因很简单。如果您有大量要搜索的点,比如说每辆车每分钟或每秒钟都会留下一条点的踪迹,那么上述答案将需要很长时间才能计算出来。如果要将数据存储在GeoPandas中,则可以使用GeoPandas中的import numpy as np def dist_calc(point, list_of_points): dist = np.vectorize(lambda x: distance(point, x)) return dist(list_of_points) # Now you can call it simply using: df['points'] = list(zip(df['lat'], df['lon'])) df.groupby('vehicle')['points'].transform(dist_calc, point=incident_sw) buffer工具来限制事件周围的搜索空间。在这种情况下,您将围绕事件构建合理的大小缓冲区,并且仅搜索落入该缓冲区内的那些车辆点。这将有助于加快您的代码。

我建议您花一天的时间来熟悉GeoPandas的所有功能,然后再继续。


使用来自geopy的great_circle

buffer
© www.soinside.com 2019 - 2024. All rights reserved.