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?
fonte
Respostas:
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:
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.
fonte
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.
fonte