Interaktion zwischen Openlayern und Python

9

Ich habe eine Webseite Openlayers wie diese ein , die dem Benutzer die Möglichkeit Polygone zu zeichnen gibt und erstellt dann eine GeoJSON Datei. Ich möchte dieses GeoJSON mit einem Python-Skript verarbeiten. Das Python-Skript gibt am Ende eine Zeichenfolge zurück, die an die Website zurückgegeben und als Infobox angezeigt werden soll.

Welche Art von Frameworks / Apps / Schritten sollte ich prüfen, um dieses Projekt durchzuführen?

ustroetz
quelle

Antworten:

5

Server: Sie benötigen ein Framework auf der Serverseite, es gibt gute Python-Optionen: Django, Flask, Bottle, Webpy. Dieses Framework empfängt einen (Ajax-) Anforderungsprozess des GeoJson und gibt die Zeichenfolge zurück.
Nachdem die Informationen in das Framework eingegeben wurden, sind Sie jetzt "pythonisch" und können das von Ihnen bevorzugte Tool zum Lesen und Arbeiten mit GeoJSON verwenden, z. B. Shapely- oder Osgeo OGR-Python-Bindungen . Wenn Sie sich für Django entscheiden, wird es bereits mit seinen Geometrie-Helfern geliefert - GeoDjango .

Client: Auf der Client-Seite benötigen Sie etwas, um die Schritte zum Erstellen der Anfrage, zum Empfangen der Antwort und zum Anzeigen der Infobox zu vereinfachen. Dafür können Sie Frameworks / Tools wie ExtJS , Jquery (UI) , Dojo , KendoUI verwenden

Persönlich verwende ich eine Kombination aus Django + ExtJS, um so etwas zu erreichen. Es ist eine schwere Lastkombination, ich meine, sie hat weit mehr Ressourcen als Sie brauchen. Aber es ist so einfach zu bedienen und so gut dokumentiert, dass ich keine andere Sache empfehlen würde, um loszulegen. Nachdem Sie das grundlegende Tutorial von beiden (Django, Extjs) durchgeführt haben, verfügen Sie über genügend Informationen, um die in der Frage angegebene Aufgabe auszuführen. Später können Sie andere Optionen ausprobieren.

Übrigens, Extjs, wenn nur für Open Source-Projekte kostenlos, berücksichtigen Sie dies.

Übrigens, um das Python-Framework auf dem Server auszuführen, benötigen Sie einen Webserver mit wsgi. Meine Option ist Nginx + uwsgi. Schauen Sie sich den Abschnitt zur Bereitstellung in der Django-Dokumentation an.

Pablo
quelle
6

Pablos Vorschlag für Flask ( http://flask.pocoo.org/ ) ist richtig. Sofern Sie keine anderen nicht erwähnten Anforderungen haben, ist Django übertrieben.

Verwenden Sie jQuery.post, um Ihre GeoJSON-Zeichenfolge an Ihre Flask-App zu senden, wo Sie sie mit json.loads dekodieren. Shapely ( https://pypi.python.org/pypi/Shapely ) ist viel einfacher zu verwenden als die Python-Bindungen von OGR und verfügt über zwei Funktionen für die Serialisierung von GeoJSON. Verwenden Sie diese Funktion, um Ihre GeoJSON-Geometrie zu bearbeiten. Angenommen, Sie möchten nur Geometrien "reinigen":

import json
from shapely.geometry import mapping, shape

# 'data' is a GeoJSON string.
geom = shape(json.loads(data))

# The 0 buffer cleaning trick.
cleaned = geom.buffer(0.0)

return json.dumps(mapping(cleaned))

Im Erfolgsrückruf von jQuery.post erhalten Sie den zurückgegebenen GeoJSON und können tun, was Sie wollen: eine Nachricht anzeigen, die Funktion neu zeichnen, was auch immer.

sgillies
quelle
Vielen Dank für Ihre Empfehlungen. Mein Python-Skript verwendet bereits die Python-Bindungen von OGR. Ich denke also, ich werde mich auf der Client-Seite mit jQuery und auf der Serverseite mit Flask befassen, wie Sie es empfohlen haben. Ich werde die Python-Bindungen von OGR verwenden, um die GeoJSON-Zeichenfolge in meinem Python-Skript zu verarbeiten (es hat einen GeoJSON-Treiber).
Ustroetz
Die Verwendung des GeoJSON-Treibers von OGR anstelle des in Python integrierten und besseren JSON-Moduls ist keine gute Idee.
Sgillies
Nun, ich möchte den GeoJSON-String mit OGR verarbeiten. Also ich denke es macht Sinn. Aber ich werde sehen, wenn ich dazu komme.
Ustroetz
1

Für die Darstellung der Geometrie auf der Clientseite bietet OpenLayers die Möglichkeit, Daten in einem bestimmten Format und einer bestimmten Projektion zu lesen / schreiben. Dies kann über die hier beschriebene OpenLayers.Format-Klasse erfolgen. Für solche Vektoroperationen empfehle ich das GeoJSON-Format.

In Ihrem Beispiellink wird die Geometrie gelesen. Ihre App sollte Feature / Vektor berücksichtigen

Für die Serverseite gibt es , wie Pablo vorgeschlagen hat , einige Bindungen für das Django-Framework für Python.

Myra
quelle