Schnelle Python-GIS-Bibliothek, die Großkreisabstand und Polygon unterstützt

9

Ich habe nach einer geografischen Bibliothek für Python gesucht. Ich muss Folgendes tun können:

  1. Mit Großkreisdistanz die Entfernung zwischen 2 Punkten (in Metern) berechnen (keine Linerdistanzberechnung)
  2. Überprüfen Sie, ob sich ein Punkt in einem Polygon befindet
  3. Führen Sie 1 und 2 ein paar tausend Mal pro Sekunde durch

Am Anfang habe ich diesen Beitrag angesehen: Python-Modul für Geo-Koordinaten speichern und abfragen und geopy verwenden. Ich habe 2 Probleme festgestellt:

  1. Geopy unterstützt keine Polygone
  2. Hohe CPU-Auslastung von geoPy (für die Berechnung der Entfernung zwischen einem Punkt und relativen 5000 Punkten benötigt man etwa 140ms CPU)

Ich habe weiter gesucht und gefunden Beste Python GIS-Bibliothek? und Ссылка . Es sah vielversprechend aus, da Geos den C-Code erfüllten, der schneller und formschöner sein sollte, um Polygone zu unterstützen. Das Problem ist, dass Geos / OGR anstelle von Sphere lineare Entfernungsberechnungen durchführt. Dies beseitigt alle anderen geosbasierten Module (wie GEODjango und formschön). Fehle ich hier etwas? Ich glaube nicht, dass ich die erste Person bin, die mit Python GIS-Berechnungen durchführt und genaue Ergebnisse erzielen will.

    
asafm 10.06.2013, 10:43
quelle

2 Antworten

1

AKTUALISIEREN

Gehen wir jetzt weiter, um die anderen 576 Funktionen in dieser Bibliothek zu beenden, ohne die zwei abgeschlossenen Polygonfunktionen, die drei Sphärenentfernungsalgorithmen und zwei neue, eine angle_box_2d und angle_contains_ray_2d. Auch habe ich auf die C-Version umgeschaltet, so dass keine externen Geräte benötigt werden, vereinfacht die Arbeit. Setze die alte C ++ - Version in das Verzeichnis old_c ++, so dass sie immer noch da ist.

Getestete Leistung, ist identisch wie unten in der Antwort aufgeführt.

UPDATE 2

Also nur ein kurzes Update, ich habe noch nicht die ganze Bibliothek fertig (ich bin nur etwa 15% des Weges durch), aber ich habe diese ungetesteten Funktionen hinzugefügt, falls Sie sie sofort brauchen github, um den alten Punkt in Polygon- und Kugelentfernungsalgorithmen hinzuzufügen.

%Vor%

Diejenigen, die ich oben kommentiert habe, werden wahrscheinlich nicht funktionieren, die anderen vielleicht, aber wieder - polygon & amp; Kugelabstände definitiv. Und Sie können Meter, Kilometer, Meilen, nautische Meilen angeben, es spielt keine Rolle auf den sphärischen Distanzen, die Ausgabe ist in den gleichen Einheiten wie die Eingabe - die Algorithmen sind für die Einheiten agnostisch.

Ich stelle das heute Morgen zusammen, so dass es derzeit nur den Punkt im Polygon, den Punkt im konvexen Polygon und drei verschiedene Arten von Algorithmen für die sphärische Distanz liefert, aber zumindest die, die Sie angefordert haben, können Sie jetzt verwenden. Ich weiß nicht, ob es einen Namenskonflikt mit irgendeiner anderen Python-Bibliothek gibt, ich bekomme diese Tage nur peripher mit Python, also, wenn es einen besseren Namen dafür gibt, bin ich offen für Vorschläge.

Auf GitHub: Ссылка

Es ist nur eine Python-Brücke zu den hier beschriebenen und implementierten Funktionen:

Ссылка

Die GEOMETRY-Bibliothek ist eigentlich ziemlich gut, also denke ich, dass es nützlich sein wird, all diese Funktionen für Python zu überbrücken, was ich wahrscheinlich heute Abend tun werde.

Bearbeiten: ein paar andere Dinge

  1. Da die mathematischen Funktionen tatsächlich in C ++ kompiliert sind, müssen Sie natürlich sicherstellen, dass sich die gemeinsame Bibliothek im Pfad befindet. Sie können die Datei "geometry.py" so ändern, dass sie auf die Stelle verweist, an der Sie diese freigegebene Bibliothek einfügen möchten.
  2. Nur für Linux kompiliert, wurden die .o und .so auf x86_64 fedora kompiliert.
  3. Die sphärischen Abstandsalgorithmen erwarten Radianten, daher müssen Sie den dezimalen Breitengrad / Längengrad zum Beispiel in Radianten umrechnen, wie in geometry.py gezeigt.

Wenn Sie dies unter Windows brauchen, lassen Sie es mich wissen, es sollte nur ein paar Minuten dauern, bis es in Visual Studio funktioniert. Aber wenn nicht jemand fragt, werde ich es wahrscheinlich jetzt einfach in Ruhe lassen.

Hoffe, das hilft!

Rgds .... Hoonto / Matt

(new commit: SHA: 4fa2dbbe849c09252c7bd931edfe8db478de28e6 - einige Dinge, wie Radiantenumwandlungen und auch die Rückgabetypen für die Py-Funktionen behoben. Außerdem wurden einige grundlegende Leistungstests hinzugefügt, um sicherzustellen, dass die Bibliothek ordnungsgemäß funktioniert.)

Testergebnisse In jeder Iteration ruft ein Aufruf von sphere_distance1 und ein Aufruf von polygon_contains_point_2d auf, sodass 2 Aufrufe an die Bibliotheksgesamtmenge erfolgt.

  • ~ 0.062s: 2000 Iterationen, 4000 Aufrufe
  • ~ 0.603s: 20000 Iterationen, 40000 Aufrufe
  • ~ 0,905s: 30000 Iterationen, 60000 Aufrufe
  • ~ 1.198s: 40000 Iterationen, 80000 Aufrufe
hoonto 18.06.2013, 17:53
quelle
0

Wenn die sphärische Berechnung ausreicht, würde ich einfach numpy für die Entfernung und matplotlib für die Polygonprüfung verwenden (wie Sie ähnliche Vorschläge in stackoverflow finden).

%Vor%

Wenn Sie mehr tun möchten, ist das Quantum GIS-Toolset wahrscheinlich einen Blick wert: PyQGIS Developer Cookbook (docs .qgis.org) .

    
thoku 19.06.2013 10:57
quelle