【发布时间】:2021-11-19 22:03:44
【问题描述】:
目前,我使用以下代码来查找最近的给定地理点 -
def get_closest_stops(lat, lng, data=db.STOPS):
def distance(lat1, lon1, lat2, lon2):
p = 0.017453292519943295
a = 0.5 - cos((lat2-lat1)*p)/2 + cos(lat1*p)*cos(lat2*p) * (1-cos((lon2-lon1)*p)) / 2
return 12742 * asin(sqrt(a))
v = {'lat': lat, 'lng': lng}
return sorted(data.values(), key=lambda p: distance(v['lat'],v['lng'],p['lat'],p['lng']), reverse=False)
这里是db.STOPS:
STOPS = {
'1282': {'lat': 59.773368, 'lng': 30.125112, 'image_osm': '1652229/464dae0763a8b1d5495e', 'name': 'name 1', 'descr': ''},
'1285': {'lat': 59.941117, 'lng': 30.271756, 'image_osm': '965417/63af068831d93dac9830', 'name': 'name 2', 'descr': ''},
...
}
dict 包含大约 7000 条记录,搜索速度很慢。 有什么方法可以加快搜索速度? 我只需要 5 个结果。我可以重新排序字典。如果需要,我什至可以创建字典的副本。
【问题讨论】:
-
R-树。您的数据库可能已经支持它
-
对不起,@Marat。这不是数据库,只是纯 python dict。
-
然后按照增加曼哈顿距离的顺序进行迭代(计算起来超级便宜),保持 5 个最近点的简短列表。一旦曼哈顿距离高于短名单中的最远点,就停止。您介意为此使用 Pandas 吗?
-
第二个想法,仅仅将 Pandas 带到桌面上可能会因为矢量化而实现 10 倍的加速
-
我在 Google App Engine 上运行代码,不确定那里是否支持 Pandas cloud.google.com/appengine/docs/standard/python/tools/…。
标签: python python-2.7 sorting dictionary geo