Interagindo entre Openlayers e Python


9

Eu tenho um site openlayers assim um que dá ao usuário a capacidade de desenhar polígonos e, em seguida, cria um arquivo GeoJSON. Eu quero processar este GeoJSON com um script python. O script python retorna no final uma string que deve ser retornada ao site e exibida como uma caixa de informações.

Que tipo de frameworks / aplicativos / etapas devo analisar para realizar este projeto?

Respostas:


5

Servidor: Você precisa de uma estrutura no lado do servidor, existem boas opções de python: Django, Flask, Bottle, webpy. Essa estrutura receberá um processo de solicitação (ajax) do GeoJson e retornará a string.
Depois que as informações entram na estrutura, você agora é "pitônico" e pode usar a ferramenta de sua preferência para ler e trabalhar com o GeoJSON, que pode ser, por exemplo, ligações Shapely ou Osgeo OGR Python . Se você escolher o Django, ele já vem com seus ajudantes de geometria - GeoDjango .

Cliente: no lado do cliente, você precisa de algo para facilitar a solicitação, receber a resposta e mostrar a caixa de informações mais fácil. Para isso, você pode usar estruturas / ferramentas como ExtJS , Jquery (UI) , Dojo , KendoUI

Pessoalmente, uso uma combinação de Django + ExtJS para realizar esse tipo de coisa. É uma combinação de carga pesada, quero dizer, tem muito mais recursos do que você precisa. Mas é tão fácil de usar e está tão bem documentado que eu não recomendaria outra coisa para começar. Depois de executar o tutorial básico de ambos (Django, Extjs), você possui informações suficientes para realizar a tarefa declarada na pergunta. Mais tarde, você pode tentar outras opções.

Aliás, o Extjs se gratuito apenas para projetos de código aberto, leve isso em consideração.

Btw2, para executar a estrutura python no servidor, você precisará de um servidor web com o wsgi. Minha opção é Nginx + uwsgi. Dê uma olhada na seção deploy da documentação do django.


6

A sugestão de Pablo para o Flask ( http://flask.pocoo.org/ ) está correta. A menos que você tenha outros requisitos não mencionados, o Django é um exagero.

Use o jQuery.post para enviar sua sequência GeoJSON para o seu aplicativo Flask, onde você a decodifica usando json.loads. O Shapely ( https://pypi.python.org/pypi/Shapely ) é muito mais simples de usar do que as ligações Python do OGR e possui 2 funções dedicadas à serialização do GeoJSON, portanto, use-o para operar em sua geometria GeoJSON. Digamos que você queira apenas "limpar" geometrias:

import json
from shapely.geometry import mapping, shape

# 'data' is a GeoJSON string.
geom = shape(json.loads(data))

# The 0 buffer cleaning trick.
cleaned = geom.buffer(0.0)

return json.dumps(mapping(cleaned))

No retorno de chamada de sucesso do jQuery.post, você obtém o GeoJSON retornado e faz o que quiser: mostre uma mensagem, redesenhe o recurso, qualquer que seja.


Obrigado por suas recomendações. Meu script python já usa as ligações Python do OGR. Então, acho que analisarei o jQuery no lado do cliente e o Flask, como você recomendou, no lado do servidor. Usarei as ligações Python do OGR para manipular a string GeoJSON dentro do meu script python (ele possui um driver GeoJSON).
ustroetz

Usar o driver GeoJSON do OGR em vez do módulo json interno e melhor do Python não é uma boa ideia.
precisa saber é o seguinte

Bem, eu quero processar a string GeoJSON com OGR. Então eu acho que faz sentido. Mas vou ver quando chegar lá.
ustroetz

1

Para representação de geometria no lado do cliente , o OpenLayers tem a capacidade de ler / gravar dados no formato e na projeção designados, que podem ser feitos através da classe OpenLayers.Format, conforme descrito aqui . Sugiro o formato GeoJSON para operações vetoriais como esta.

No link de exemplo, a geometria é lida, seu aplicativo deve levar em consideração o recurso / vetor

Para o lado do servidor, como Pablo sugeriu , existem algumas ligações para o django framework para python.

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.