8 votos

Mapnik fallando a través de un webstack

He heredado un portal web (interno) bastante grande/complejo (ejecutado bajo python 2.6.6), que tiene algunas capacidades de mapeo, usando Mapnik 2.2.0. El servicio web ha empezado recientemente a lanzar errores 500 cuando intenta crear algunos de los mapas que se muestran, con el único error:

$ Premature end of script headers: app.wsgi

Los mapas se generan a partir de geojson que se pasa como una cadena (habiendo sido creado a partir de un diccionario de python); he rastreado hasta 1 línea de código en un map.py que añade una capa a un mapa:

data = mapnik.Ogr(file=json, layer='OGRGeoJSON')

cuando comento esa línea de código (y la asociada m.layers[-1].data = data ) entonces la imagen se muestra en el portal, pero obviamente sin esta capa. El json es válido (lo he comprobado en http://geojsonlint.com ).


Esfuerzos de depuración

Usar un archivo json separado

Quería ver si al llamar al JSON desde una fuente externa se reproducía el problema. Por lo tanto, guardé la cadena json como un archivo separado ( test.json ), en el mismo directorio que map.py y modificó el Ogr llamar a

data = mapnik.Ogr(file='test.json', layer='OGRGeoJSON')

Todavía recibo un error 500, pero con un mensaje de error un poco más verboso:

datasource = mapnik.Ogr(file='testgeo.json', layer='OGRGeoJSON')
File /usr/lib64/python2.6/site-packages/mapnik/__init__.py, line 536, in Ogr
return CreateDatasource(keywords)
RuntimeError: OGR Plugin: Failed to read GeoJSON data

Comprobación del geojson

$ ogrinfo testgeo.json
ERROR 4: GeoJSON Driver doesn't support update.
Had to open data source read-only.
INFO: Open of `testgeo.json'
      using driver `GeoJSON' successful.
1: OGRGeoJSON (3D Polygon)

Así que el json parece válido


Uso de la línea de comandos de Python

También he probado a ejecutar python de forma interactiva en el mismo directorio que map.py y test.json :

$ python
Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mapnik
>>> mapnik.Ogr(file="testgeo.json", layer="OGRGeoJSON")
<mapnik.Datasource object at 0x7f6243c27398>

Más información

$ gdal-config --version
1.9.2

$ ogr2ogr --version
GDAL 1.9.2, released 2012/10/08

Esto devuelve sin errores (así que asumo que esto significa que el geojson es válido, confirmando mi prueba anterior de ejecutar el geojson a través de http://geojsonlint.com ):

$ ogr2ogr testgeo.shp testgeo.json

Versión del SO

$ lsb_release -a
LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description:    CentOS release 6.7 (Final)
Release:        6.7
Codename:       Final

Estos 3 esfuerzos de depuración muestran que el json es válido y que la llamada funciona, excepto cuando se ejecuta a través del webstack. He comprobado los permisos y la propiedad de todos los archivos y directorios relevantes, y todos parecen ser como yo esperaba.

¿Qué otra cosa podría estar causando el problema?


Actualización (2 semanas después de hacer la pregunta original)

Hoy he llegado al trabajo y he pensado en volver a mirar para ver si puedo sacar algunos mensajes de error (nueva semana, nuevo comienzo). Pero, extrañamente, el código no parece fallar (por ahora, al menos). He cambiado nada y, por lo que he podido comprobar, no ha habido cambios de hardware en los servidores.

Esto se convierte ahora en una investigación de lo que hizo causarlo, y si hay algo que pueda hacer para evitar que vuelva a ocurrir...

0 votos

No soy desarrollador pero a primera vista veo alguna diferencia en la definición de sintaxis OGR de los datos json (por ejemplo ' ' ' en lugar de ' " '). Además recuerdo que la extensión de archivo soportada por OGR es ".geojson" en lugar de ".json". Espero que os pueda ayudar en algo

0 votos

Desgraciadamente, cuando utilizo un archivo externo hace funcionan (independientemente de la extensión del archivo); es cuando el json está incrustado en el python como una cadena que ahora ha dejado de funcionar

0 votos

¿Has comprobado que utilizas la misma versión de python/ scripts mapnik para ejecutar mapnik.Ogr en la línea de comandos y en tu webstack? ¿Tal vez hay una implementación diferente y una actualización podría ayudar?

2voto

Jon Galloway Puntos 28243

Espera, parece que está esperando un archivo o un objeto similar a un archivo. cuando dices que tienes un json incrustado en python, ¿es el texto completo del json, no la ruta del archivo?

a = "/home/george/boundaries.json" # file-path
b = "{
    'type': 'FeatureCollection',
    'crs': {
      'type': 'name',
      'properties': {
        'name': 'EPSG:3857'
      }
    },
    'features': [{
      'type': 'Feature',
      'geometry': {
        'type': 'Point',
        'coordinates': [0, 0]
      }
    }, {
      'type': 'Feature',
      'geometry': {
        'type': 'LineString',
        'coordinates': [[4e6, -2e6], [8e6, 2e6]]
      }
    }]}" # json-content

La API de Mapnik está esperando un archivo y lo abrirá y analizará por sí mismo.

Comprueba la referencia: http://mapnik.org/docs/v2.1.0/api/python/mapnik-module.html#Ogr

Copiado de ahí, para completar:

from mapnik import Ogr, Layer
datasource = Ogr(base='/home/mapnik/data',file='rivers.geojson',layer='OGRGeoJSON') 
lyr = Layer('OGR Layer from GeoJSON file')
lyr.datasource = datasource

Este enlace es para documentos más antiguos (2.1), pero creo que la API no ha cambiado.

Por supuesto, esto es asumiendo, por tus comentarios, que estás usando la opción B, en lugar de la A.

0 votos

Lo siento, obviamente mi pregunta no es lo suficientemente clara. La solicitud original es usando una cadena json incrustada dentro de python - esto dejó de funcionar. Como parte de mis esfuerzos de depuración he extraído el json para que utilice un archivo externo. Esto sólo funciona cuando se llama en la línea de comandos de python, pero no a través de la webstack

0 votos

Oh ok. en un comentario dijiste que siempre funcionaría en archivos externos, sin importar la extensión. por eso pensé que estabas usando la opción B que mostré en la respuesta. ¿Puedes hacer un ogr2ogr para ver si todo está bien con tu json? ¿Qué versiones tienen tus bibliotecas subyacentes?

0 votos

Me refería a que cuando hacía pruebas con archivos externos no encontraba ninguna diferencia entre que la extensión del archivo fuera .json o .geojson Nunca he utilizado ogr2ogr - pero parece que necesita un archivo de entrada, que no tengo. ¿Qué bibliotecas debería comprobar?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X