Interaction entre Openlayers et Python

9

J'ai un site Web openlayers comme celui- ci qui donne à l'utilisateur la possibilité de dessiner des polygones, puis crée un fichier GeoJSON. Je veux traiter ce GeoJSON avec un script python. Le script python renvoie à la fin une chaîne qui doit être retournée au site Web et affichée sous forme de boîte d'informations.

Quel type de frameworks / applications / étapes dois-je étudier pour réaliser ce projet?

ustroetz
la source

Réponses:

5

Serveur: Vous avez besoin d'un framework côté serveur, il existe de bonnes options python: Django, Flask, Bottle, webpy. Ce framework recevra un processus de requête (ajax) le GeoJson et retourne la chaîne.
Une fois que les informations sont entrées dans le framework, vous êtes maintenant "pythonic" et pouvez utiliser l'outil de votre préférence pour lire et travailler avec GeoJSON, qui pourrait être par exemple des liaisons Shapely ou Osgeo OGR Python . Si vous choisissez Django, il est déjà livré avec ses aides à la géométrie - GeoDjango .

Client: Du côté client, vous avez besoin de quelque chose pour vous faciliter la tâche de faire la demande, recevoir la réponse et afficher la boîte d'informations plus facilement. Pour cela, vous pouvez utiliser des frameworks / outils comme ExtJS , Jquery (UI) , Dojo , KendoUI

Personnellement, j'utilise une combinaison de Django + ExtJS pour accomplir ce genre de chose. C'est une combinaison de charges lourdes, je veux dire, elle a beaucoup plus de ressources que vous n'en avez besoin. Mais il est si facile à utiliser et si bien documenté que je ne recommanderais pas autre chose pour commencer. Après avoir fait le tutoriel de base des deux (Django, Extjs), vous avez suffisamment d'informations pour accomplir la tâche indiquée sur la question. Plus tard, vous pourrez essayer d'autres options.

Btw, Extjs si gratuit uniquement pour les projets open source, en tenir compte.

Btw2, pour exécuter le framework python sur le serveur, vous aurez besoin d'un serveur web avec wsgi. Mon option est Nginx + uwsgi. Jetez un œil à la section de déploiement de la documentation de django.

Pablo
la source
6

La suggestion de Pablo de Flask ( http://flask.pocoo.org/ ) est juste. Sauf si vous avez d'autres exigences non mentionnées, Django est exagéré.

Utilisez jQuery.post pour envoyer votre chaîne GeoJSON à votre application Flask, où vous la décodez à l'aide de json.loads. Shapely ( https://pypi.python.org/pypi/Shapely ) est beaucoup plus simple à utiliser que les liaisons Python d'OGR et dispose de 2 fonctions dédiées à la sérialisation de GeoJSON, alors utilisez-le pour opérer sur votre géométrie GeoJSON. Supposons que vous souhaitiez simplement "nettoyer" les géométries:

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))

Dans le rappel de réussite de jQuery.post, vous obtenez le GeoJSON retourné et faites tout ce que vous voulez: afficher un message, redessiner la fonctionnalité, peu importe.

sgillies
la source
Merci pour vos recommandations. Mon script python utilise déjà les liaisons Python d'OGR. Je pense donc que j'examinerai jQuery côté client et Flask, comme vous l'avez recommandé, côté serveur. J'utiliserai les liaisons Python d'OGR pour gérer la chaîne GeoJSON dans mon script python (il a un pilote GeoJSON).
ustroetz
Utiliser le pilote GeoJSON d'OGR au lieu du module json intégré et amélioré de Python n'est pas une bonne idée.
sgillies
Eh bien, je veux traiter la chaîne GeoJSON avec OGR. Je pense donc que cela a du sens. Mais je verrai une fois que j'y arriverai.
ustroetz
1

Pour la représentation géométrique côté client , OpenLayers a la capacité de lire / écrire des données dans un format et une projection désignés qui peuvent être effectués via OpenLayers.Format class comme décrit ici .Je suggère le format GeoJSON pour des opérations vectorielles comme celle-ci.

Dans votre exemple de lien, la géométrie est lue, votre application doit prendre en compte la fonction / le vecteur

Pour le côté serveur, comme l'a suggéré Pablo , il existe des liaisons pour le framework django pour python.

Myra
la source