De cette manière, supposons que vous souhaitiez déterminer le point le plus proche à une latitude / longitude spécifiée à partir d'une liste contenant un tuple de nombres représentant la latitude / longitude.
geo_pts = [
(35.60, 139.71),
(35.58, 139.82),
#Ce qui suit est omis
]
Une implémentation naïve qui calcule tout dans la liste.
import math
def find(geo_pts, target):
return max(geo_pts, key=lambda p: dist(p, target))
def dist(p1, p2):
return math.sqrt(sum((x1 - x2) ** 2 for x1, x2 in zip(p1, p2)))
Tel est le comportement. Il a fallu environ 20 ms pour trouver environ 15 000 points sur l'instance EC2 t2.medium d'AWS.
print(find(geo_pts, (35.6, 139.7)))
# => (35.60, 139.71)
Au fait, si vous voulez obtenir n morceaux, vous pouvez utiliser heapq.nlargest
.
https://pypi.org/project/geoindex/
def main():
geo_pts = [
#Lire comme un tableau
]
index = GeoGridIndex(precision=4)
for x in geo_pts:
index.add_point(GeoPoint(x[0], x[1]))
prev = time.time()
print(find(index, (35.6, 139.7)))
# => (Point(35.687659999999994, 139.71178), 9.80482739300054)
print(time.time() - prev)
def find(index, target):
return next(index.get_nearest_points(GeoPoint(*target), 10, 'km'))
Dans l'instance EC2 t2.medium d'AWS, la valeur a été renvoyée dans environ 4 ms dans cette implémentation.
À propos, l'unité de taille de cellule de l'argument de GeoGridIndex
est km, et si precision = 4
est spécifié, il peut être recherché dans la plage de rayon 40/2 = 20 km. Je n'ai pas fait de vérification supplémentaire car mes exigences étaient justes avec un rayon de 20 km.
Precision | Cell size |
---|---|
1 | 5000 |
2 | 1260 |
3 | 156 |
4 | 40 |
5 | 4.8 |
6 | 1.22 |
7 | 0.152 |
8 | 0.038 |
Recommended Posts