Mapnik falhando através de um webstack

8

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 Ogrchamada 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.pyetest.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 ...

ChrisW
fonte
Não sou desenvolvedor, mas, à primeira vista, vejo alguma diferença na definição de sintaxe OGR dos dados json (por exemplo, '' 'em vez de' "'). Além disso, lembro que a extensão de arquivo suportada pelo OGR é" .geojson " . em vez de ".json" a esperança pode ajudá-lo de alguma forma
MickyInTheSky
Infelizmente, quando eu uso um arquivo externo que faz o trabalho (independentemente da extensão de arquivo); que é quando o json está embutido no python como uma string que já parou de funcionar
ChrisW
Você verificou, usa a mesma versão dos scripts python / mapnik para executar o mapnik.Ogr na linha de comando e no seu webstack? Talvez haja uma implementação diferente e uma atualização possa ajudar?
22816 ulrich
Sim, é o Mapnik 2.2.0 e o Python 2.6.6 em todos os casos
ChrisW 02/02
1
Em que sistema operacional está sendo implantado? Uma vez eu tive um bug estranho acontecendo, por causa das permissões. essa era a estrutura aproximada: pasta A> pasta B (onde B é filho de A). Então, eu tinha dado todas as permissões para a pasta B, mas não A. Como A não estava acessível para o processo, todo o resto falhou (eu usei -R como uma opção). Se não me engano, isso foi no RHEL. Verifique novamente que, talvez, é uma coisa.
George Silva

Respostas:

2

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 = "/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

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:

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

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.

George Silva
fonte
Desculpe, minha pergunta obviamente não é clara o suficiente. O aplicativo original está usando uma string json incorporada no python - isso parou de funcionar. Como parte dos meus esforços de depuração, extraí o json para que ele use um arquivo externo. Isso só funciona quando você chamá-lo na linha de comando python, mas não através do webstack
ChrisW
Ah ok. em um comentário, você disse que sempre funcionaria em arquivos externos, independentemente da extensão. por isso pensei que você estivesse usando a opção BI mostrada na resposta. Você pode fazer um ogr2ogr para ver se está tudo bem com o seu json? Quais versões são suas bibliotecas subjacentes?
George Silva
Eu quis dizer que quando estava testando com arquivos externos, não encontrei nenhuma diferença entre a extensão do arquivo .jsonou .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?
ChrisW
GDAL / OGR. tente converter seu arquivo json para, digamos, um shapefile, usando ogr2ogr. se tudo der certo, é uma indicação de que o problema não está no GDAL / OGR, que é usado pelo mapnik. as permissões do arquivo estão todas ok? isso se resume à depuração agora. Uma vez eu usei o mapnik em um servidor da web para gerar um mapa e nunca tive esse problema.
George Silva