我有一个包含美国快餐店经纬度数据的大列表。对于每个快餐店,我想知道在5英里范围内有多少其他快餐店。我可以使用Geopy和Pandas计算如下(DataFrame中的每一行表示不同的快餐店):
import pandas as pd
import geopy.distance
df = pd.DataFrame({'Fast Food Place':[1,2,3], 'Lat':[33,34,35], 'Lon':[42,43,44]})
for index1, row1 in df.iterrows():
num_fastfood = 0
for index2, row2 in df.iterrows():
# calculate distance in miles between longitude and latitude
dist = geopy.distance.VincentyDistance(row1[['Lat','Lon']],
row2[['Lat','Lon']]).miles
# if fast food is within 5 miles, increment num_fastfood
if dist < 5: # if less than five miles
num_fastfood = num_fastfood + 1
df.loc[index1, 'num_fastfood_5miles'] = num_fastfood - 1 # (subtract 1 to exclude self)
但是在非常大的数据集上(例如50,000行),这种方法非常慢。我考虑使用KDTree进行搜索,但想知道其他人是否有更快捷的方法?
tree = KDTree(my_lat_long)
然后循环遍历nnDist
吗? - user1566200query_ball_tree
来获取半径内的所有点:tree = KDTree(my_lat_long); within_5 = tree.query_ball_tree(tree, radius=5)
。然后展开嵌套列表并计数。 - Paul Brodersenquery_radius
,我没有看到query_ball_tree
。感谢您的帮助。如果您回答了我的问题,我会标记它为已解决。 - user1566200