Interactuando entre Openlayers y Python


9

Tengo un sitio web openlayers como esta uno que le da al usuario la capacidad de dibujar polígonos y luego crea un archivo GeoJSON. Quiero procesar este GeoJSON con un script de Python. El script de Python devuelve al final una cadena que debe devolverse al sitio web y mostrarse como un cuadro de información.

¿Qué tipo de marcos / aplicaciones / pasos debería considerar para lograr este proyecto?

Respuestas:


5

Servidor: necesita un marco en el lado del servidor, hay buenas opciones de Python: Django, Flask, Bottle, webpy. Ese marco recibirá un proceso de solicitud (ajax) del GeoJson y devolverá la cadena.
Después de que la información ingresa al marco, ahora eres "pitón" y puedes usar la herramienta que prefieras para leer y trabajar con GeoJSON, que podría ser, por ejemplo, enlaces de Python de Shapely o Osgeo OGR . Si elige Django, ya viene con sus ayudantes de geometría: GeoDjango .

Cliente: En el lado del cliente, necesita algo para hacer los pasos necesarios para hacer la solicitud, recibir la respuesta y mostrar el cuadro de información más fácilmente. Para eso, puede usar marcos / herramientas como ExtJS , Jquery (UI) , Dojo , KendoUI

Personalmente, uso una combinación de Django + ExtJS para lograr este tipo de cosas. Es una combinación de carga pesada, quiero decir, tiene muchos más recursos de los que necesita. Pero es tan fácil de usar y está tan bien documentado que no recomendaría otra cosa para comenzar. Después de hacer el tutorial básico de ambos (Django, Extjs) tiene suficiente información para realizar la tarea indicada en la pregunta. Más tarde puedes probar otras opciones.

Por cierto, Extjs si es gratis solo para proyectos de código abierto, tenlo en cuenta.

Por cierto, para ejecutar el marco de Python en el servidor necesitará un servidor web con wsgi. Mi opción es Nginx + uwsgi. Eche un vistazo a la sección de implementación de la documentación de django.


6

La sugerencia de Pablo de Flask ( http://flask.pocoo.org/ ) es correcta. A menos que tenga otros requisitos no mencionados, Django es excesivo.

Use jQuery.post para enviar su cadena GeoJSON a su aplicación Flask, donde la decodifica usando json.loads. Shapely ( https://pypi.python.org/pypi/Shapely ) es mucho más simple de usar que los enlaces Python de OGR y tiene 2 funciones dedicadas a serializar GeoJSON, así que úselo para operar en su geometría GeoJSON. Digamos que solo quieres "limpiar" las geometrías:

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

En la devolución de llamada exitosa de jQuery.post, obtienes el GeoJSON devuelto y haces lo que quieras: mostrar un mensaje, volver a dibujar la función, lo que sea.


Gracias por tus recomendaciones. Mi script de Python ya utiliza los enlaces Python de OGR. Así que creo que buscaré en jQuery en el lado del Cliente y en Flask, como me recomendó, en el lado del Servidor. Usaré los enlaces Python de OGR para manipular la cadena GeoJSON dentro de mi script python (tiene un controlador GeoJSON).
ustroetz

Usar el controlador GeoJSON de OGR en lugar del módulo json incorporado y mejor de Python no es una buena idea.
sgillies

Bueno, quiero procesar la cadena GeoJSON con OGR. Entonces creo que tiene sentido. Pero lo veré una vez que llegue.
ustroetz

1

Para la representación de geometría en el lado del cliente , OpenLayers tiene la capacidad de leer / escribir datos en formato y proyección designados que se pueden hacer a través de OpenLayers. Clase de formato como se describe aquí . Sugiero el formato GeoJSON para operaciones vectoriales como esta.

En su enlace de ejemplo, se lee la geometría, su aplicación debe tener en cuenta la función / vector

Para el lado del servidor, como sugirió Pablo , hay algunos enlaces para django framework para python.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.