J'ai hérité d'un portail Web assez grand / complexe (interne) (exécuté sous python 2.6.6), qui a des capacités de cartographie, en utilisant Mapnik 2.2.0. Le service Web a récemment commencé à générer 500 erreurs lorsqu'il essaie de créer certaines des cartes affichées, avec la seule erreur:
$ Premature end of script headers: app.wsgi
Les cartes sont générées à partir de geojson qui est passé sous forme de chaîne (ayant été créé à partir d'un dictionnaire python); Je l'ai suivi jusqu'à 1 ligne de code dans a map.py
, ce qui ajoute une couche à une carte:
data = mapnik.Ogr(file=json, layer='OGRGeoJSON')
lorsque je commente cette ligne de code (et le code associé m.layers[-1].data = data
), l'image est affichée sur le portail, mais évidemment sans cette couche. Le json est valide (je l'ai vérifié sur http://geojsonlint.com ).
Efforts de débogage
Utilisation d'un fichier json distinct
Je voulais voir si l'appel du JSON à partir d'une source externe reproduisait le problème. J'ai donc enregistré la chaîne json dans un fichier séparé ( test.json
), dans le même répertoire que map.py
, et modifié l' Ogr
appel à
data = mapnik.Ogr(file='test.json', layer='OGRGeoJSON')
J'obtiens toujours une erreur 500, mais avec un message d'erreur légèrement plus détaillé:
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
Vérification du 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)
Donc, le json semble valide
Utilisation de la ligne de commande python
J'ai également essayé d'exécuter python de manière interactive dans le même répertoire que map.py
ettest.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>
Plus d'infos
$ gdal-config --version
1.9.2
$ ogr2ogr --version
GDAL 1.9.2, released 2012/10/08
Cela revient sans erreur (donc je suppose que cela signifie que le geojson est valide, confirmant mon test précédent de l'exécution du geojson via http://geojsonlint.com ):
$ ogr2ogr testgeo.shp testgeo.json
Version du système d'exploitation
$ 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
Ces 3 efforts de débogage montrent que le json est valide et que l'appel fonctionne, sauf lorsqu'il est exécuté via la pile Web. J'ai vérifié les autorisations et la propriété de tous les fichiers et répertoires pertinents, et ils semblent tous être comme je m'y attendais.
Quoi d'autre pourrait être à l'origine du problème?!
Mise à jour (2 semaines après avoir posé la question d'origine)
Je suis entré au travail aujourd'hui et j'ai pensé que j'aurais une autre fissure à regarder pour voir si je pouvais taquiner certains messages d'erreur (nouvelle semaine, nouveau départ). Mais, tout à fait bizarrement, le code ne semble pas échouer (pour le moment du moins). Je n'ai rien changé , et pour autant que je sache, il n'y a eu aucun changement matériel sur les serveurs.
Cela devient maintenant une enquête sur ce qui l' a causé et si je peux faire quelque chose pour empêcher que cela ne se reproduise ...
Réponses:
attendez, on dirait qu'il attend un fichier ou un objet de type fichier. quand vous dites que vous avez un json intégré dans python, c'est tout le texte json, pas le chemin du fichier?
L'API Mapnik attend un fichier et l'ouvrira et l'analysera par lui-même.
Vérifiez la référence: http://mapnik.org/docs/v2.1.0/api/python/mapnik-module.html#Ogr
Copié de là, pour l'achèvement:
Ce lien est pour les anciens documents (2.1) mais je suppose que l'API n'a pas changé.
Bien sûr, cela suppose, d'après vos commentaires, que vous utilisez l'option B, au lieu de A.
la source
.json
ou.geojson
; Je n'ai jamais utilisé ogr2ogr - mais il semble qu'il ait besoin d'un fichier d'entrée, que je n'ai pas. Quelles bibliothèques dois-je vérifier?