Saya telah mewarisi portal web (internal) yang cukup besar / kompleks (dijalankan dengan python 2.6.6), yang memiliki beberapa kemampuan pemetaan, menggunakan Mapnik 2.2.0. Layanan web baru-baru ini mulai melemparkan 500 kesalahan ketika mencoba membuat beberapa peta yang ditampilkan, dengan satu-satunya kesalahan:
$ Premature end of script headers: app.wsgi
Peta dihasilkan dari geojson yang dilewatkan sebagai string (dibuat dari kamus python); Saya telah melacaknya hingga 1 baris kode dalam map.py
, yang menambahkan lapisan ke peta:
data = mapnik.Ogr(file=json, layer='OGRGeoJSON')
ketika saya berkomentar bahwa baris kode (dan yang terkait m.layers[-1].data = data
) maka gambar ditampilkan pada portal, tetapi jelas tanpa lapisan ini. Json ini valid (saya telah memeriksanya di http://geojsonlint.com ).
Upaya debugging
Menggunakan file json terpisah
Saya ingin melihat apakah memanggil JSON dari sumber eksternal mereplikasi masalah. Karena itu saya menyimpan string json sebagai file terpisah ( test.json
), di direktori yang sama dengan map.py
, dan memodifikasi Ogr
panggilan
data = mapnik.Ogr(file='test.json', layer='OGRGeoJSON')
Saya masih mendapatkan 500 kesalahan, tetapi dengan pesan kesalahan yang sedikit lebih verbose:
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
Memeriksa 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)
Jadi json itu tampaknya valid
Menggunakan baris perintah python
Saya juga telah mencoba menjalankan python secara interaktif di direktori yang sama dengan map.py
dantest.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>
Info lebih lanjut
$ gdal-config --version
1.9.2
$ ogr2ogr --version
GDAL 1.9.2, released 2012/10/08
Ini kembali tanpa kesalahan (jadi saya berasumsi bahwa ini berarti geojson itu valid, mengonfirmasi pengujian saya sebelumnya untuk menjalankan geojson melalui http://geojsonlint.com ):
$ ogr2ogr testgeo.shp testgeo.json
Versi OS
$ 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
Ini 3 upaya debugging menunjukkan bahwa json tersebut adalah sah dan bahwa karya-karya panggilan, kecuali ketika itu dijalankan melalui webstack tersebut. Saya telah memeriksa izin dan kepemilikan semua file dan direktori yang relevan, dan semuanya sepertinya seperti yang saya harapkan.
Apa lagi yang menyebabkan masalah ini ?!
Pembaruan (2 minggu setelah mengajukan pertanyaan asli)
Saya mulai bekerja hari ini dan berpikir saya akan mencari celah lain untuk melihat apakah saya dapat mengusir beberapa pesan kesalahan (minggu baru, awal baru). Tetapi, benar-benar aneh, kode itu tampaknya tidak gagal (untuk saat ini, setidaknya). Saya tidak mengubah apa pun , dan sejauh yang bisa saya kumpulkan, tidak ada perubahan perangkat keras pada server.
Ini sekarang menjadi penyelidikan apa memang menyebabkan itu, dan apakah ada sesuatu yang bisa saya lakukan untuk mencegah hal itu terjadi lagi ...
Jawaban:
tunggu, sepertinya menunggu file atau objek seperti file. ketika Anda mengatakan Anda memiliki json yang tertanam dalam python, itu adalah keseluruhan teks json, bukan path file?
Mapnik API mengharapkan file dan akan membukanya dan menguraikannya dengan sendirinya.
Periksa referensi: http://mapnik.org/docs/v2.1.0/api/python/mapnik-module.html#Ogr
Disalin dari sana, untuk penyelesaian:
Tautan ini untuk dokumen lama (2.1) tetapi dugaan saya adalah bahwa API tidak berubah.
Tentu saja, ini dengan asumsi, dari komentar Anda, bahwa Anda menggunakan opsi B, bukannya A.
sumber
.json
atau.geojson
; Saya tidak pernah menggunakan ogr2ogr - tetapi sepertinya butuh input file, yang saya tidak punya. Perpustakaan mana yang harus saya periksa?