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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.