Mapnik échoue à travers une webstack

8

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' Ograppel à

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.pyettest.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 ...

ChrisW
la source
Je ne suis pas développeur mais à première vue, je vois une différence dans la définition OGR synthax des données json (par exemple '' 'au lieu de' "'). De plus, je me souviens que l'extension de fichier prise en charge par OGR est" .geojson " au lieu de ".json". J'espère que cela peut vous aider d'une manière ou d'une autre
MickyInTheSky
Malheureusement, lorsque j'utilise un fichier externe , il fait le travail (quel que soit l'extension de fichier); c'est quand le json est intégré dans le python en tant que chaîne qu'il a maintenant cessé de fonctionner
ChrisW
Avez-vous vérifié, vous utilisez la même version des scripts python / mapnik pour exécuter mapnik.Ogr dans la ligne de commande et votre webstack? Peut-être y a-t-il une implémentation différente et une mise à jour pourrait aider?
ulrich
Oui, c'est Mapnik 2.2.0 et Python 2.6.6 dans tous les cas
ChrisW
1
Quel est le système d'exploitation sur lequel cela est déployé? Une fois, j'ai eu un bug bizarre, à cause des autorisations. c'était la structure approximative: dossier A> dossier B (où B est enfant de A). Ensuite, j'avais donné toutes les autorisations au dossier B, mais pas A. Puisque A n'était pas accessible au processus, tout le reste a échoué (j'avais utilisé -R en option). Si je ne me trompe pas, c'était sur RHEL. Vérifiez bien que c'est peut-être une chose.
George Silva

Réponses:

2

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?

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

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:

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

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.

George Silva
la source
Désolé, ma question n'est évidemment pas assez claire. L'application originale est en utilisant une chaîne JSON intégrée dans python - ce a cessé de fonctionner. Dans le cadre de mes efforts de débogage, j'ai extrait le json pour lui faire utiliser un fichier externe. Cela ne fonctionne que lorsque vous l'appelez sur la ligne de commande python, mais pas via la pile Web
ChrisW
Ah d'accord. sur un commentaire, vous avez dit que cela fonctionnerait toujours sur des fichiers externes, quelle que soit l'extension. c'est pourquoi je pensais que vous utilisiez l'option BI indiquée dans la réponse. Pouvez-vous faire un ogr2ogr pour voir si tout va bien avec votre json? Quelles versions sont vos bibliothèques sous-jacentes?
George Silva
Je voulais dire que lorsque je testais avec des fichiers externes, je n'ai trouvé aucune différence entre si l'extension de fichier était .jsonou .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?
ChrisW
GDAL / OGR. essayez de convertir votre fichier json en un fichier de formes, en utilisant ogr2ogr. si tout va bien, c'est une indication que le problème n'est pas dans GDAL / OGR, qui est utilisé par mapnik. les autorisations du fichier sont toutes ok? cela revient au débogage maintenant. J'ai déjà utilisé mapnik dans un serveur Web pour générer une carte, et je n'ai jamais eu ce problème.
George Silva