У меня похожая проблема, и кажется, что использование SciPy cKDTree для быстрого поиска ближайших точек вместе с GeoPy для расчета географического расстояния работает нормально.
In [1]: import numpy as np
In [2]: from scipy.spatial import cKDTree
In [3]: from geopy import Point, distance
In [4]: points = np.random.sample((100000, 2)) * 180 - 90 # make 100k random lat-long points
In [5]: index = cKDTree(points)
In [6]: %time lat_long_dist, inds = index.query(points[234], 20)
CPU times: user 118 µs, sys: 164 µs, total: 282 µs
Wall time: 248 µs
In [7]: points_geopy = [Point(*p) for p in points]
In [8]: %time geo_dists = [distance.great_circle(points_geopy[234], points_geopy[i]) for i in inds]
CPU times: user 244 µs, sys: 218 µs, total: 462 µs
Wall time: 468 µs
In [9]: geo_dists
Out[9]:
[Distance(0.0),
Distance(29.661520907955524),
...
Distance(156.5471729956897),
Distance(144.7528417712309)]
Немного дополнительной работы необходимо, чтобы получить все точки в радиусе.
Я попробовал STRtree Shapely, но получил намного худшую производительность (я установил с pip install shapely[vectorized]
).