【发布时间】:2014-03-16 17:57:19
【问题描述】:
我有一个位置和塔的列表。我试图找出每个位置最近的塔是什么。我想出了一种可行的方法,但我很确定这是一种非常低效的方法。
我将如何以更 Pythonic 的方式做到这一点?
我有大约 4,000 个地点和 11,000 座塔。我目前:
- 循环遍历每个位置
- 查找到所有塔的距离
- 按距离排序
- 取最近的一个,然后将其附加到“nearest_tower”数据框。
代码如下:
nearest_tower = pd.DataFrame()
for i, location_rows in d[["Name", "Lat", "Long"]].T.iteritems():
tower_coords["Distance_km"] = tower_coords.apply(lambda row: distance_on_unit_sphere(location_rows ["Lat"], location_rows ["Long"], row['DIGITAL_LATITUDE'], row['DIGITAL_LONGITUDE'])*6373, axis=1)
a = tower_coords.sort(['Distance_km'], ascending = 1)[:1][["SITE_NUMBER", "DIGITAL_LATITUDE", "DIGITAL_LONGITUDE", "Distance_km"]]
a["Location_Name"] = location_rows ["Name"]
a["Location_Lat"] = location_rows ["Lat"]
a["Location_Long"] = location_rows ["Long"]
nearest_tower = nearest_tower.append(a)
print(i)
Tower_coords 如下所示:
SITE_NUMBER DIGITAL_LATITUDE DIGITAL_LONGITUDE
1 67.21 -30.432
...
【问题讨论】:
-
什么是 tower_coords?那是什么样子的?
-
如果将与本地塔的距离放在一起,那么您可以简单地从最近的塔上弹出。但可能还有更有效的数据结构来解决这个问题,比如@Hbcdev 提到的 k-d 树
-
@usethedeathstar 添加的文件示例,它只显示了一个塔的经纬度
-
没有考虑距离的数字高度?你如何计算距离?我猜不是ECEF坐标? distance_on_unit_sphere 是如何工作的,它是从哪里来的?
-
我使用了这个页面上的函数johndcook.com/python_longitude_latitude.html - 我收集的粗略计算,假设是球形奶牛。
标签: python loops pandas nearest-neighbor