Mapnik falla a través de una pila web

8

Heredé un portal web bastante grande / complejo (interno) (ejecutado bajo python 2.6.6), que tiene algunas capacidades de mapeo, usando Mapnik 2.2.0. El servicio web recientemente comenzó a arrojar 500 errores 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 (creado a partir de un diccionario de Python); Lo rastreé hasta 1 línea de código en a map.py, que agrega 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), 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

Usando un archivo json separado

Quería ver si llamar al JSON desde una fuente externa replicaba el problema. Por lo tanto, guardé la cadena json como un archivo separado ( test.json), en el mismo directorio map.pyy modifiqué la Ogrllamada 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 detallado:

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

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

Entonces el json parece válido


Usando la línea de comando de Python

También he intentado ejecutar python de forma interactiva en el mismo directorio que map.pyytest.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>

Informacion adicional

$ gdal-config --version
1.9.2

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

Esto vuelve sin errores (así que supongo 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 sistema operativo

$ 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. Verifiqué los permisos y la propiedad de todos los archivos y directorios relevantes, y todos parecen ser como esperaba.

¿Qué más podría estar causando el problema?


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

Llegué a trabajar hoy y pensé que tendría otra oportunidad para ver si podía sacar algunos mensajes de error (nueva semana, nuevo comienzo). Pero, por extraño que parezca, el código no parece estar fallando (al menos por ahora). No he cambiado nada , y hasta donde puedo deducir, no ha habido cambios de hardware en los servidores.

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

ChrisW
fuente
No soy desarrollador, pero a primera vista veo alguna diferencia en la definición de OGR Synthax de los datos json (por ejemplo, '' 'en lugar de' "'). Además, recuerdo que la extensión de archivo compatible con OGR es" .geojson " en lugar de ".json". Espero que pueda ayudarte de alguna manera
MickyInTheSky
Por desgracia, cuando se utiliza un archivo externo que hace el trabajo (independientemente de la extensión del archivo); es cuando el json está incrustado en el pitón como una cadena que ahora ha dejado de funcionar
ChrisW 02 de
¿Ha verificado que usa la misma versión de los scripts python / mapnik para ejecutar mapnik.Ogr en la línea de comandos y su webstack? ¿Quizás haya una implementación diferente y una actualización podría ayudar?
Ulrich
Sí, es Mapnik 2.2.0 y Python 2.6.6 en todos los casos
ChrisW
1
¿En qué sistema operativo se está implementando? Una vez tuve un error extraño, debido a los permisos. esta era la estructura aproximada: carpeta A> carpeta B (donde B es hijo de A). Luego, le di todos los permisos a la carpeta B, pero no a A. Como el proceso no era accesible para A, todo lo demás falló (había usado -R como opción). Si no me equivoco, esto fue en RHEL. Vuelva a comprobar que, tal vez, es una cosa.
George Silva

Respuestas:

2

espera, parece que está esperando un archivo o un objeto similar a un archivo. cuando dices que tienes un json incrustado en python, ¿es todo el texto 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

Mapnik API está esperando un archivo y lo abrirá y analizará solo.

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

Copiado de allí, 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 antiguos (2.1), pero supongo que la API no cambió.

Por supuesto, esto supone que, mediante sus comentarios, está utilizando la opción B, en lugar de A.

George Silva
fuente
Lo siento, mi pregunta obviamente no es lo suficientemente clara. La aplicación original está utilizando una cadena json incrustada en python; esto dejó de funcionar. Como parte de mis esfuerzos de depuración, extraje el json para que use un archivo externo. Esto solo funciona cuando lo llamas en la línea de comando de Python, pero no a través del webstack
ChrisW
oh ok en un comentario dijiste que siempre funcionaría en archivos externos, independientemente de la extensión. Por eso pensé que estaba usando la opción que BI mostró en la respuesta. ¿Puedes hacer un ogr2ogr para ver si todo está bien con tu json? ¿Qué versiones son sus bibliotecas subyacentes?
George Silva
Quise decir que cuando estaba probando con archivos externos no encontré ninguna diferencia entre si la extensión del archivo era .jsono .geojson; Nunca he usado ogr2ogr, pero parece que necesita un archivo de entrada, que no tengo. ¿Qué bibliotecas debo verificar?
ChrisW
GDAL / OGR. intente convertir su archivo json a, digamos, un archivo de forma, usando ogr2ogr. Si todo va bien, es una indicación de que el problema no está en GDAL / OGR, que es utilizado por mapnik. los permisos del archivo están todos bien? esto se reduce a la depuración ahora. Una vez usé mapnik en un servidor web para generar un mapa, y nunca tuve este problema.
George Silva