Mapnik gagal melalui webstack

8

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 Ogrpanggilan

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

ChrisW
sumber
Saya bukan pengembang tetapi pada pandangan pertama saya melihat beberapa perbedaan dalam definisi OGR synthax dari data json (misalnya '' 'bukan' ''). Selanjutnya saya ingat bahwa ekstensi file yang didukung OGR adalah ".geojson" alih-alih ".json". Semoga ini dapat membantu Anda dalam beberapa hal
MickyInTheSky
Sayangnya, ketika saya menggunakan file eksternal itu tidak bekerja (terlepas dari ekstensi file); itu ketika json tertanam dalam python sebagai string yang sekarang telah berhenti berfungsi
ChrisW
Sudahkah Anda memeriksa, Anda menggunakan versi skrip python / mapnik yang sama untuk mengeksekusi mapnik.Ogr di commandline dan webstack Anda? Mungkin ada implementasi yang berbeda dan pembaruan bisa membantu?
Ulrich
Ya, itu Mapnik 2.2.0 dan Python 2.6.6 dalam semua kasus
ChrisW
1
OS apa yang digunakan ini? Pernah saya mengalami bug aneh, karena izin. ini adalah struktur kasar: folder A> folder B (di mana B adalah anak dari A). Kemudian, saya telah memberikan semua izin ke folder B, tetapi tidak A. Karena A tidak dapat diakses ke proses, semuanya gagal (saya telah menggunakan -R sebagai opsi). Jika saya tidak salah, ini ada di RHEL. Periksa itu, mungkin, itu hal.
George Silva

Jawaban:

2

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?

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

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:

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

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.

George Silva
sumber
Maaf, pertanyaan saya jelas tidak cukup jelas. Aplikasi asli yang menggunakan string json tertanam dalam python - ini berhenti bekerja. Sebagai bagian dari upaya debug saya, saya mengekstrak json untuk membuatnya menggunakan file eksternal. Ini hanya bekerja ketika Anda menyebutnya pada baris perintah python, tetapi tidak melalui webstack yang
ChrisW
Oh oke. pada komentar Anda mengatakan bahwa itu akan selalu berfungsi pada file eksternal, terlepas dari ekstensi. itu sebabnya saya pikir Anda menggunakan opsi yang ditunjukkan BI dalam jawaban. Bisakah Anda melakukan ogr2ogr untuk melihat apakah semuanya baik-baik saja dengan json Anda? Apa versi pustaka dasar Anda?
George Silva
Maksud saya, ketika saya menguji dengan file eksternal saya tidak menemukan perbedaan antara apakah ekstensi file itu .jsonatau .geojson; Saya tidak pernah menggunakan ogr2ogr - tetapi sepertinya butuh input file, yang saya tidak punya. Perpustakaan mana yang harus saya periksa?
ChrisW
GDAL / OGR. coba konversi file json Anda menjadi, katakanlah, sebuah shapefile, menggunakan ogr2ogr. jika semuanya berjalan dengan baik, ini merupakan indikasi bahwa masalahnya bukan pada GDAL / OGR, yang digunakan oleh mapnik. semua izin file oke? ini turun ke debugging sekarang. Saya pernah menggunakan mapnik di server web untuk menghasilkan peta, dan tidak pernah memiliki masalah ini.
George Silva