Melhor design para o protótipo Open Source Python / PostGIS

9

Estou escrevendo um aplicativo Web com uso intensivo de dados que é entregue através do apache. Minha pergunta é sobre a melhor forma de organizar o processamento, pois existem várias opções.

Tenho à minha disposição OpenLayers / JQuery / Javascript, PostGIS / Postgresql (com pgsql), python / psycopg2, php.

O banco de dados contém cerca de 3 milhões de linhas e o protótipo atualmente é executado da seguinte maneira:

  • O usuário clica em um ponto na janela OpenLayers

  • A coordenada é enviada como uma solicitação AJAX para uma função python no servidor

  • Atualmente, meu aplicativo não tem estado

  • O psycopg2 do Python é usado para chamar um procedimento armazenado pgsql e um amplo conjunto de valores WKT (e um campo de dados) são retornados ao módulo python

  • O campo de dados é usado para categorizar os registros WKT em python da seguinte maneira: todos os valores WKT são categorizados em um dos 5 grupos. Cerca de 1% dos valores WKT são realmente modificados.

  • Os cinco conjuntos / grupos de WKT são armazenados em buffer para criar cinco polígonos distintos. Atualmente, chamo um procedimento armazenado no banco de dados para fazer isso. Por sua vez, apenas usa ST_BUFFER. (Eu considerei usar o Shapely, mas não tenho certeza de que haverá uma vantagem de desempenho, pois a biblioteca GEOS é usada nos dois casos ...)

  • Finalmente, os 5 valores de texto WKT são agrupados em uma sequência JSON e enviados de volta ao OpenLayers para renderização em cinco camadas.

Estou descobrindo que os gargalos são a pesquisa espacial inicial e o estágio final de armazenamento em buffer.

Eu acho que a pergunta é:

Existe uma maneira melhor de organizar as coisas? Por exemplo, TODO o processamento de dados deve ser feito no PostgreSQL (por exemplo, com cursores) e isso seria bom em termos de manutenção e desempenho? Seria melhor usar um servidor de mosaico para evitar a transmissão de longas seqüências WKT para o Web client? Como você abordaria isso?

John Steedman
fonte
Os buffers sempre têm a mesma distância ou são baseados na entrada do usuário? O procedimento armazenado em buffer opera com dados enviados pelo python ou pela tabela original? Também seria útil ter uma idéia do que você está tentando alcançar.
Matthew Snape
Matthew - Estou tentando criar polígonos de tempo de condução. Eu sei algo sobre polígonos côncavos, mas queria tentar dessa maneira, principalmente para obter melhor precisão. Os polígonos são buffers de 200 m de MultiLinestrings (ou seja: estradas). Atualmente, estou brincando com a idéia de pré-armazenar todas as estradas no banco de dados, mas ainda preciso mesclá-las. \ n #
John Steedman
De maneira mais geral, pretendo optar por uma arquitetura que equilibra um processamento geográfico bastante intensivo com uma interface de usuário da web responsiva: não tão rápida quanto o Google, é claro, mas reconhecível em termos das expectativas dos usuários de hoje! Isso é para alguns usuários avançados.
22412 John Steedman

Respostas:

3

Gargalo de buffer

Ao usar ST_Buffer, você pode reduzir a complexidade da forma resultante adicionando uma opção num_seg_quarter_circle menor. Isso deve reduzir a quantidade de processamento ao armazenar em buffer e nas operações subseqüentes.

Na documentação do PostGIS:

insira a descrição da imagem aqui

Geralmente no PostGIS, você obtém melhor desempenho se executar consultas em tabelas indexadas corretamente existentes. Isso fornece acesso fácil a várias otimizações (como cluster). Considere processar o 1% que muda separadamente e mesclar os dois no final.

Matthew Snape
fonte
2

Sem pensar em arquitetura, para todos os aplicativos de mapeamento da Web, você deseja executar o processamento antecipadamente. Isso significa que, se possível, os buffers devem ser pré-calculados, todos os seus dados devem estar no SRS de saída, etc. Obviamente, alguns dados e cálculos precisam ser dinâmicos.

Sugiro que, além do Python, você analise o MapServer e o Geoserver para fazer os cálculos e produzir a saída. Ambos poderiam produzir blocos de imagem ou saída GeoJSON. Ambos os aplicativos podem usar o PostGIS como back-end.

DavidF
fonte
Obrigado David. Isso soa como uma boa política que eu tenho desviado para mim. Vou procurar no GeoServer blocos de imagens. Eu usei python / mapnik no passado para isso.
9788 John Steedman
A outra coisa que acabei de descobrir é que o retorno de linhas por meio de um procedimento armazenado é muito, (muito, muito) lento.
31412 John Steedman