Python-Modul für das speichern und Abfragen von Geo-Koordinaten
Gibt es ein Python-Modul, wo ich die Objekte erstellen, die mit einem geografischen Standort-Koordinate (Breitengrad und Längengrad) und Abfrage aller Objekte, für diejenigen, die innerhalb eines 5-km-Distanz (d.h. der radius) zu einer gegebenen Koordinate?
Ich versucht habe zu speichern Längen-und Breitengrad als Schlüssel in dictionaries (wie Sie sind indiziert durch Taste) und verwenden Sie etwas Abstand finden von algorithmen zur Abfrage Ihnen. Aber dies fühlt sich wie eine schreckliche hack.
Im wesentlichen so etwas wie PostGIS für PostgreSQL, aber alle in meiner Python-app-Speicher.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, versuchen geopy.
danach können Sie die Abfrage von Listen von Punkten:
points
? Die ist nicht ganz so effizient wie PostGIS Indizierung der Punkte - vielleicht ist die Datenbank-Ansatz wäre effizienter.Ich weiß, das ist nicht genau das, was du gemeint hast, aber man könnte GeoDjango mit einer in-memory SQLite Datenbank. Es ist eine vollständige Reihe von GIS-tools ausgesetzt, wie eine Web-Anwendung, die macht es ein Schweizer Armee-Messer für die schnelle Entwicklung von GIS-Anwendungen, vor allem für kleine ad-hoc-Abfragen.
Ist die übliche Vorgehensweise im GIS erstellen Sie einen Puffer um den Punkt von Interesse und Abfrage der Kreuzung. Wie @RyanDalton schlägt, wenn Sie planen, tun eine Menge von geolocation Zeug, verwenden Formschöne, die GIS-API für Python. Es ist gut zu wissen, Formschöne auch wenn Sie immer noch wollen, einen räumlichen index (siehe unten). Hier ist, wie werden Puffer geschaffen, in Formschönen:
Du kann index Ihre Punkte selbst (sagen wir mal durch Länge zum Beispiel), wenn Sie nicht haben viele. Ansonsten können Sie auch das Rtree-Paket, überprüfen Sie den link aufgerufen Mit Rtree als cheapo Geo-Datenbank!
Ihrem Wörterbuch die Idee klingt nicht schlecht, aber Sie müssen die check-Punkte, die fallen unter 'benachbarten' dictionary-Schlüssel als gut.
Wenn Sie nicht finden können, das richtige Werkzeug, und wie Verschlüsselungsalgorithmen, die Sie umsetzen konnte ein binary space partition tree, die, soweit ich weiß, ist ein weniger hacky so erreichen wir eine ähnliche Sache.
Können Sie verwenden SQLite, welches einen Rtree Erweiterung für genau diese Art der Speicherung und Abfragen. Dieser Ansatz ist nützlich, wenn Ihre Daten größer ist als der Speicher, den Sie verwenden möchten, oder Sie wollen speichern und Bearbeiten von Daten zwischen Programm läuft. Die eigentliche Speicherung und-Abfrage-code ist in C, was bedeutet, es muss kompiliert werden, aber der Vorteil ist die zusätzliche Leistung über die Reine Python-Lösungen wie geopy. Entweder pysqlite oder APSW Arbeit wird für die SQLite-Zugriff. (Offenlegung: ich bin der APSW Autor.)
Ich habe ein ähnliches problem, und es scheint, dass mit SciPy's cKDTree für die schnelle nearest-Punkte-lookups zusammen mit GeoPy für geografische Distanz, die Berechnung funktioniert einwandfrei.
Die ein wenig zusätzliche Arbeit ist notwendig, um alle Punkte innerhalb eines radius.
Habe ich versucht Shapely ist STRtree, bekam aber weit schlechter Leistung (installierte ich mit
pip install shapely[vectorized]
).Haben Sie sich Formschöne? Es hat einige Methoden zur Abfrage von Objekten in einer Entfernung. Werfen Sie einen Blick auf die Binäre Räumliche Prädikate. Es könnte nur sein, was Sie suchen.