Bestes Design für Open Source Python / PostGIS-Prototyp

9

Ich schreibe eine datenintensive Webanwendung, die über Apache bereitgestellt wird. Meine Frage ist, wie die Verarbeitung am besten arrangiert werden kann, da es mehrere Optionen gibt.

Ich habe OpenLayers / JQuery / Javascript, PostGIS / Postgresql (mit pgsql), Python / Psycopg2, PHP zur Verfügung.

Die Datenbank enthält ungefähr 3 Millionen Zeilen und der Prototyp läuft derzeit wie folgt:

  • Der Benutzer klickt auf einen Punkt im OpenLayers-Fenster

  • Die Koordinate wird als AJAX-Anforderung an eine Python-Funktion auf dem Server gesendet

  • Derzeit ist meine Bewerbung zustandslos

  • Pythons psycopg2 wird verwendet, um eine gespeicherte pgsql-Prozedur aufzurufen, und ein größerer Satz von WKT-Werten (und ein Datenfeld) werden an das Python-Modul zurückgegeben

  • Das Datenfeld wird verwendet, um die WKT-Datensätze in Python wie folgt zu kategorisieren: Alle WKT-Werte werden in eine von 5 Gruppen eingeteilt. Etwa 1% der WKT-Werte werden tatsächlich geändert.

  • Die fünf Sätze / Gruppen von WKT werden gepuffert, um fünf verschiedene Polygone zu erstellen. Ich rufe derzeit eine gespeicherte Prozedur in der Datenbank auf, um dies zu tun. Dies wiederum verwendet nur ST_BUFFER. (Ich habe überlegt, Shapely zu verwenden, bin mir aber nicht sicher, ob es einen Leistungsvorteil gibt, da in beiden Fällen die GEOS-Bibliothek verwendet wird ...)

  • Schließlich werden die 5 WKT-Textwerte in eine JSON-Zeichenfolge eingeschlossen und zum Rendern als fünf Ebenen an OpenLayers zurückgesendet.

Ich stelle fest, dass die Engpässe die anfängliche räumliche Suche und die letzte Pufferstufe sind.

Ich denke die Frage ist:

Gibt es eine bessere Möglichkeit, Dinge zu arrangieren? Sollte beispielsweise die gesamte Datenverarbeitung in PostgreSQL erfolgen (z. B. mit Cursorn), und ist dies eine gute Sache in Bezug auf Wartung und Leistung? Wäre es besser, einen Kachelserver zu verwenden, um zu vermeiden, dass lange WKT-Zeichenfolgen an den Webclient übergeben werden? Wie würden Sie es ansprechen?

John Steedman
quelle
Sind die Puffer immer gleich groß oder basieren sie auf Benutzereingaben? Arbeiten Sie mit gespeicherten Prozeduren gegen Daten, die von Python oder der Originaltabelle gesendet wurden? Es wäre auch nützlich, eine Vorstellung davon zu haben, was Sie erreichen wollen.
Matthew Snape
Matthew - Ich versuche, Drivetime-Polygone zu erstellen. Ich weiß etwas über konkave Polygone, wollte es aber auf diese Weise ausprobieren, hauptsächlich aus Gründen der Genauigkeit. Die Polygone sind 200-Meter-Puffer von MultiLinestrings (dh Straßen). Ich spiele derzeit mit der Idee, alle Straßen in der Datenbank vorab zu puffern, aber ich muss sie noch zusammenführen. \ n #
John Steedman
Ganz allgemein möchte ich mich für eine Architektur entscheiden, die eine recht intensive Geoverarbeitung mit einer reaktionsschnellen Webbenutzeroberfläche in Einklang bringt: natürlich nicht so schnell wie Google, aber anhand der heutigen Nutzererwartungen erkennbar! Dies ist für einige Power-User.
John Steedman

Antworten:

3

Pufferengpass

Wenn Sie ST_Buffer verwenden, können Sie die Komplexität der resultierenden Form reduzieren, indem Sie eine niedrigere Option num_seg_quarter_circle hinzufügen. Dies sollte den Verarbeitungsaufwand beim Puffern und bei nachfolgenden Vorgängen verringern.

Aus der PostGIS-Dokumentation:

Geben Sie hier die Bildbeschreibung ein

Im Allgemeinen erzielen Sie in PostGIS eine bessere Leistung, wenn Sie Abfragen für vorhandene ordnungsgemäß indizierte Tabellen ausführen. Auf diese Weise haben Sie einfachen Zugriff auf verschiedene Optimierungen (z. B. Clustering). Erwägen Sie, die 1%, die sich separat ändern, zu verarbeiten und die beiden am Ende zusammenzuführen.

Matthew Snape
quelle
2

Wenn Sie überhaupt nicht an Architektur denken, möchten Sie für alle Web-Mapping-Anwendungen so viel wie möglich im Voraus verarbeiten. Dies bedeutet, dass, wenn Sie können, Puffer vorberechnet werden sollten, alle Ihre Daten im Ausgabe-SRS usw. sein sollten. Natürlich müssen einige Daten und Berechnungen dynamisch sein.

Ich schlage vor, dass Sie sich über Python hinaus MapServer und Geoserver ansehen, um die Berechnungen durchzuführen und die Ausgabe zu erstellen. Beide könnten Bildkacheln oder GeoJSON-Ausgaben erzeugen. Beide Anwendungen können PostGIS als Backend verwenden.

DavidF
quelle
Danke, David. Das klingt nach einer guten Politik, die ich mir selbst zugewandt habe. Ich werde in GeoServer nach Bildkacheln suchen. Ich habe in der Vergangenheit Python / Mapnik dafür verwendet.
John Steedman
Die andere Sache, die ich gerade herausgefunden habe, ist, dass das Zurückgeben von Zeilen über eine gespeicherte Prozedur sehr, (sehr, sehr) langsam ist.
John Steedman