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.py
y modifiqué la Ogr
llamada 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.py
ytest.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 ...
Respuestas:
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?
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:
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.
fuente
.json
o.geojson
; Nunca he usado ogr2ogr, pero parece que necesita un archivo de entrada, que no tengo. ¿Qué bibliotecas debo verificar?