Eu herdei um portal da web bastante grande / complexo (interno) (executado no python 2.6.6), que possui alguns recursos de mapeamento, usando o Mapnik 2.2.0. O serviço da web começou recentemente a gerar 500 erros ao tentar criar alguns dos mapas exibidos, com o único erro:
$ Premature end of script headers: app.wsgi
Os mapas são gerados a partir de geojson que é passado como uma string (tendo sido criado a partir de um dicionário python); Rastreei até uma linha de código em a map.py
, que adiciona uma camada a um mapa:
data = mapnik.Ogr(file=json, layer='OGRGeoJSON')
quando eu comento essa linha de código (e o associado m.layers[-1].data = data
), a imagem é exibida no portal, mas obviamente sem essa camada. O json é válido (eu verifiquei em http://geojsonlint.com ).
Esforços de depuração
Usando um arquivo json separado
Eu queria ver se a chamada do JSON de uma fonte externa replicou o problema. Portanto, salvei a string json como um arquivo separado ( test.json
), no mesmo diretório que map.py
, e modifiquei a Ogr
chamada para
data = mapnik.Ogr(file='test.json', layer='OGRGeoJSON')
Ainda recebo um erro 500, mas com uma mensagem de erro um pouco mais detalhada:
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
Verificando o 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)
Então o json parece válido
Usando a linha de comando python
Eu também tentei executar o python interativamente no mesmo diretório que map.py
etest.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>
Mais informações
$ gdal-config --version
1.9.2
$ ogr2ogr --version
GDAL 1.9.2, released 2012/10/08
Isso retorna sem erros (então suponho que isso significa que o geojson é válido, confirmando meu teste anterior de execução do geojson por meio de http://geojsonlint.com ):
$ ogr2ogr testgeo.shp testgeo.json
Versão do SO
$ 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
Esses três esforços de depuração mostram que o json é válido e que a chamada funciona, exceto quando executada no webstack. Eu verifiquei as permissões e a propriedade de todos os arquivos e diretórios relevantes, e todos parecem ser o que eu esperava.
O que mais poderia estar causando o problema ?!
Atualização (2 semanas após fazer a pergunta original)
Eu entrei no trabalho hoje e pensei em ter outra chance de ver se eu poderia exibir algumas mensagens de erro (nova semana, novo começo). Mas, totalmente bizarro, o código não parece estar falhando (por enquanto, pelo menos). Não mudei nada e, até onde posso concluir, não houve alterações de hardware nos servidores.
Isto torna-se agora uma investigação do que fez porque ele, e se há algo que eu possa fazer para evitar que isso aconteça novamente ...
Respostas:
espere, parece que ele está esperando um arquivo ou um objeto parecido com um arquivo. quando você diz que tem um json incorporado em python, é todo o texto do json, não o caminho do arquivo?
A API do Mapnik está esperando um arquivo e ele será aberto e analisado por si só.
Verifique a referência: http://mapnik.org/docs/v2.1.0/api/python/mapnik-module.html#Ogr
Copiado de lá, para conclusão:
Este link é para documentos mais antigos (2.1), mas acho que a API não mudou.
Obviamente, isso pressupõe, pelos seus comentários, que você está usando a opção B, em vez de A.
fonte
.json
ou.geojson
; Eu nunca usei ogr2ogr - mas parece que ele precisa de um arquivo de entrada, o que eu não tenho. Quais bibliotecas devo verificar?