Mapnik scheitert an einem Webstack

8

Ich habe ein ziemlich großes / komplexes (internes) Webportal (ausgeführt unter Python 2.6.6) geerbt, das mit Mapnik 2.2.0 einige Zuordnungsfunktionen bietet. Der Webdienst hat vor kurzem begonnen, 500 Fehler auszulösen, wenn er versucht, einige der angezeigten Karten mit dem einzigen Fehler zu erstellen:

$ Premature end of script headers: app.wsgi

Die Karten werden aus Geojson generiert, das als Zeichenfolge übergeben wird (erstellt aus einem Python-Wörterbuch). Ich habe es bis zu einer Codezeile in a aufgespürt map.py, die einer Karte einen Layer hinzufügt:

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

Wenn ich diese Codezeile (und die zugehörige m.layers[-1].data = data) auskommentiere, wird das Bild auf dem Portal angezeigt, aber offensichtlich ohne diese Ebene. Der json ist gültig (ich habe ihn auf http://geojsonlint.com überprüft ).


Debugging-Bemühungen

Verwenden einer separaten JSON-Datei

Ich wollte sehen, ob das Aufrufen des JSON von einer externen Quelle das Problem repliziert. Ich habe daher die JSON-Zeichenfolge als separate Datei ( test.json) im selben Verzeichnis wie gespeichert map.pyund den OgrAufruf in geändert

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

Ich erhalte immer noch einen Fehler von 500, aber mit einer etwas ausführlicheren Fehlermeldung:

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

Überprüfung des 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)

Der Json scheint also gültig zu sein


Verwenden der Python-Befehlszeile

Ich habe auch versucht, Python interaktiv im selben Verzeichnis wie map.pyundtest.json auszuführen :

$ 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>

Weitere Informationen

$ gdal-config --version
1.9.2

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

Dies wird ohne Fehler zurückgegeben (daher gehe ich davon aus, dass dies bedeutet, dass der Geojson gültig ist, was meinen früheren Test zum Ausführen des Geojson über http://geojsonlint.com bestätigt ):

$ ogr2ogr testgeo.shp testgeo.json

OS Version

$ 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

Diese 3 Debugging Bemühungen zeigen , dass die json ist gültig und dass der Anruf funktioniert, ausnehmen , wenn es durch die webstack laufen gelassen. Ich habe die Berechtigungen und den Besitz aller relevanten Dateien und Verzeichnisse überprüft, und alle scheinen so zu sein, wie ich es erwartet hätte.

Was könnte das Problem sonst noch verursachen?!


Update (2 Wochen nach der ursprünglichen Frage)

Ich bin heute zur Arbeit gekommen und dachte, ich hätte noch einen Riss, um zu sehen, ob ich einige Fehlermeldungen herausholen könnte (neue Woche, Neuanfang). Aber absolut bizarr scheint der Code nicht zu versagen (zumindest vorerst). Ich habe nichts geändert , und soweit ich das beurteilen kann, wurden keine Hardwareänderungen an den Servern vorgenommen.

Dies wird nun zu einer Untersuchung dessen, was es verursacht hat und ob ich irgendetwas tun kann, um zu verhindern, dass es wieder passiert ...

ChrisW
quelle
Ich bin kein Entwickler, aber auf den ersten Blick sehe ich einen Unterschied in der OGR-Synthax-Definition der JSON-Daten (z. B. '' 'anstelle von' "'). Außerdem erinnere ich mich, dass die von OGR unterstützte Dateierweiterung" .geojson "ist. anstelle von ".json". Hoffe, es kann Ihnen
irgendwie
Wenn ich eine externe Datei verwende, funktioniert dies leider (unabhängig von der Dateierweiterung). Wenn der
JSON
Haben Sie überprüft, dass Sie dieselbe Version von Python / Mapnik-Skripten verwenden, um mapnik.Ogr in der Befehlszeile und in Ihrem Webstack auszuführen? Vielleicht gibt es eine andere Implementierung und ein Update könnte helfen?
Ulrich
Ja, es ist in allen Fällen Mapnik 2.2.0 und Python 2.6.6
ChrisW
1
Auf welchem ​​Betriebssystem wird dies bereitgestellt? Einmal hatte ich einen seltsamen Fehler wegen der Berechtigungen. Dies war die grobe Struktur: Ordner A> Ordner B (wobei B Kind von A ist). Dann hatte ich alle Berechtigungen für Ordner B erteilt, aber nicht für A. Da A für den Prozess nicht zugänglich war, schlug alles andere fehl (ich hatte -R als Option verwendet). Wenn ich mich nicht irre, war dies auf RHEL. Überprüfen Sie noch einmal, ob es vielleicht eine Sache ist.
George Silva

Antworten:

2

Warten Sie, es sieht so aus, als würde eine Datei oder ein dateiähnliches Objekt erwartet. Wenn Sie sagen, dass Sie einen JSON in Python eingebettet haben, ist es der gesamte JSON-Text, nicht der Dateipfad?

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

Die Mapnik-API erwartet eine Datei und öffnet sie und analysiert sie selbst.

Überprüfen Sie die Referenz: http://mapnik.org/docs/v2.1.0/api/python/mapnik-module.html#Ogr

Von dort zur Vervollständigung kopiert:

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

Dieser Link ist für ältere Dokumente (2.1), aber ich vermute, dass sich die API nicht geändert hat.

Dies setzt natürlich voraus, dass Sie in Ihren Kommentaren Option B anstelle von A verwenden.

George Silva
quelle
Entschuldigung, meine Frage ist offensichtlich nicht klar genug. Die ursprüngliche Anwendung wird mit einem JSON - String in Python eingebettet - das funktioniert nicht mehr. Im Rahmen meiner Debugging-Bemühungen habe ich den JSON extrahiert, damit er eine externe Datei verwendet. Dies funktioniert nur, wenn Sie es in der Python-Befehlszeile aufrufen, aber nicht über den Webstack
ChrisW
Oh ok. In einem Kommentar sagten Sie, dass es immer mit externen Dateien funktionieren würde, unabhängig von der Erweiterung. Deshalb dachte ich, Sie würden die in der Antwort gezeigte Option BI verwenden. Können Sie ein ogr2ogr machen, um zu sehen, ob mit Ihrem json alles in Ordnung ist? Welche Versionen sind Ihre zugrunde liegenden Bibliotheken?
George Silva
Ich meinte, als ich mit externen Dateien testete, fand ich keinen Unterschied zwischen der Dateierweiterung .jsonoder .geojson; Ich habe noch nie ogr2ogr verwendet - aber es scheint, dass es eine Eingabedatei benötigt, die ich nicht habe. Welche Bibliotheken soll ich überprüfen?
ChrisW
GDAL / OGR. Versuchen Sie, Ihre JSON-Datei mit ogr2ogr in ein Shapefile zu konvertieren. Wenn alles in Ordnung ist, ist dies ein Hinweis darauf, dass das Problem nicht in GDAL / OGR liegt, das von mapnik verwendet wird. Sind die Berechtigungen der Datei alle in Ordnung? Dies läuft jetzt auf das Debuggen hinaus. Ich habe mapnik einmal in einem Webserver verwendet, um eine Karte zu erstellen, und hatte dieses Problem nie.
George Silva