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.py
und den Ogr
Aufruf 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.py
undtest.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 ...
Antworten:
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?
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:
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.
quelle
.json
oder.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?