Module Python pour stocker et interroger les coordonnées géographiques
y a-t-il un module Python où je peux créer des objets avec une coordonnée de localisation géographique (latitude et longitude), et interroger tous les objets pour ceux qui sont à une distance de 5km (rayon) d'une coordonnée donnée?
j'ai essayé de stocker la latitude et la longitude comme des clés dans des dictionnaires (car elles sont indexées par clé) et d'utiliser des algorithmes de recherche de distance pour les interroger. Mais ça ressemble à un horrible piratage.
essentiellement quelque chose comme PostGIS pour PostgreSQL, mais tout dans ma Python application mémoire.
6 réponses
Oui, essayez geopy.
import geopy
import geopy.distance
pt1 = geopy.Point(48.853, 2.349)
pt2 = geopy.Point(52.516, 13.378)
dist = geopy.distance.distance(pt1, pt2).km
# 878.25
ensuite, vous pouvez interroger vos listes de points:
[pt for pt in points if geopy.distance.distance(orig, pt).km < 5.]
je sais que ce n'est pas exactement ce que vous vouliez, mais vous pouvez utiliser GeoDjango
l'approche habituelle dans le SIG est de créer un tampon autour du point d'intérêt et d'interroger l'intersection. Comme le suggère @RyanDalton, si vous prévoyez de faire beaucoup de choses de géolocalisation, utilisez Shapely, API GIS pour Python. Il est bon de connaître Shapely même si vous voulez toujours un indice spatial (voir ci-dessous). Voici comment créer des tampons dans bien faite:
distance = 3
center = Point(1, 1)
pts = [Point(1.1, 1.2),Point(1.2,1.2)]
center_buf = a.buffer(distance)
#filters the points list according to whether they are contained in the list
contained = filter(center_buf.contains,pts)
Vous indexez vos points vous-même (disons par longitude par exemple) si vous n'avez pas beaucoup. Sinon, vous pouvez aussi utiliser le paquet Rtree, vérifier le lien appelé à l'Aide de Rtree comme un cheapo spatiale de la base de données!
votre idée de dictionnaire ne sonne pas si mal, Bien que vous aurez besoin de vérifier les points qui tombent sous 'voisins' des clés de dictionnaire aussi bien.
si vous ne pouvez pas trouver le bon outil, et comme les algorithmes de codage, vous pouvez implémenter un arbre de partition spatiale binaire qui afaik est une façon moins hacky de réaliser une chose similaire.
vous pouvez utiliser SQLite qui a un Rtree extension pour faire exactement ce genre de stockage et d'interrogation. Cette approche est utile si vos données est plus grand que la mémoire que vous souhaitez utiliser ou vous voulez enregistrer et manipuler des données entre le programme s'exécute. Le code de stockage et de requête réel est en C, ce qui signifie qu'il doit être compilé, mais l'avantage est une performance supplémentaire sur les solutions Python pures comme geopy. Pysqlite ou APSW fonctionneront pour L'accès SQLite. (Divulgation: je suis l'auteur de L'APSW.)
Avez-vous regardé Galbées? Il a quelques méthodes pour interroger des objets à distance. Jetez un oeil à l' Prédicats Spatiaux Binaires. C'est peut-être juste ce que vous cherchez.