Software de mapeamento da Web para uma enorme série temporal raster?


11

Sou um usuário do ArcGIS Desktop que está entrando no mundo do mapeamento da web pela primeira vez. Seguindo os conselhos que encontrei aqui no GIS.SE, comecei com os tutoriais gratuitos do OpenGeo .

No entanto, comecei a perceber que a maioria das demos e exemplos eram voltados para dados vetoriais. Meu projeto principal envolve a exibição de uma série temporal de 300 quadros de rasters de 5000 x 5000 pixels. No meu computador desktop, eles são armazenados em um único binário BIP inteiro de 5000x5000x300 e 16 bits, que totaliza cerca de 8 GB. Meu objetivo é poder clicar em uma célula (de uma única varredura na série temporal) e exibir um gráfico mostrando os valores desse pixel na série temporal de 300 elementos. Os dados de varredura usados ​​para cada gráfico de série temporal devem ser armazenados sem perdas, embora os mapas de sobreposição clicados possam ser caches com perdas.

Existe algo que possa ser mais adequado para este projeto (para um desenvolvedor iniciante de GIS da web) do que o OpenGeo? Ou devo continuar com essa configuração?

Para referência, tenho experiência em programação em Python, Java e PHP. Eu não tenho muita experiência com SQL. Este é um projeto aberto, por isso tenho tempo de sobra para aprender novos idiomas, se necessário. Eu já tenho um servidor web, embora provavelmente precise mudar de host porque o GoDaddy parece não suportar o PostgreSQL sem obter um VPS.

Obrigado pela ajuda!

EDIT: (13 de janeiro) Ainda estou procurando informações sobre a melhor maneira de armazenar um raster BIP inteiro tridimensional de 16 bits e ser capaz de consultar com eficiência uma única "coluna" de dados no eixo z. Não quero convertê-lo para um formato de 32 bits (porque isso dobraria o tamanho do arquivo do formulário atual de 16 bits).


2
Você pode colocar o PostgreSQL / PostGIS no seu servidor da Web? - Recomendaria vivamente que você tenha seu próprio servidor, a menos que esteja procurando opções escalonáveis, então o Amazon AWS (AMI de bancos de dados relacionais EC2) aws.amazon.com/running_databases pode ser uma opção.
Mapperz

1
Meu host (GoDaddy) não suporta PostgreSQL de acordo com este tópico . Eu realmente não preciso de escalabilidade - este projeto é principalmente para permitir que alguns pesquisadores pares tenham acesso mais fácil aos meus dados do que enviar um arquivo de 8 GB e carregá-lo no ENVI.
dmahr 12/01/12

1
Se você está pensando em um novo host, não posso recomendar o webfaction o suficiente; eles oferecem o postgresql / postgis1.5, mas para a funcionalidade raster você provavelmente deseja o postgis2.0. Isso também é em hospedagem compartilhada.
DJQ

Respostas:


6

EDIT: (13 de janeiro) Ainda estou procurando informações sobre a melhor maneira de armazenar um raster BIP inteiro tridimensional de 16 bits e ser capaz de consultar com eficiência uma única "coluna" de dados no eixo z. Não quero convertê-lo para um formato de 32 bits (porque isso dobraria o tamanho do arquivo do formulário atual de 16 bits).

Consultar uma varredura desse tipo não deve realmente causar grandes problemas. Você pode ler dados binários diretamente usando todas as linguagens de programa e o acesso é rápido. Apenas certifique-se de armazenar seus dados em um formato de arquivo com todos os metadados em um arquivo separado. BIP é esse formato

por exemplo, em php, assumindo que o arquivo esteja na ordem principal das linhas (caso contrário, alterne xey), com $ x e $ y a posição em sua grade (contando de 0), $ nx, $ ny e $ nz o número de pixels em cada dimensão e $ nb o número de bytes por célula da grade:

$fp = fopen('yourfile.bil', 'r');

fseek ($fp, $nz*$nb*($y*$nx +$x))//this is a very fast operation
// read some data
$data = fread($fp, $nz*nb);//this is also very fast

Apenas certifique-se de acessar o pixel direito: a contagem começa no canto superior esquerdo ou não, ...

Algumas informações extras: depois de ler os dados, você deve convertê-los em flutuadores. Por exemplo:

$dataf=unpack("f*", $data);
print_r($dataf);

Caso seu host não suporte o upload de arquivos grandes, você pode, por exemplo, dividir seu arquivo bip em, por exemplo, 8 arquivos bip.

Mais algumas informações sobre como eu faria o resto do site: como seus dados são estáticos, você pode gerar um pequeno visualizador de mapa usando gdal2tiles e openlayers. http://www.gdal.org/gdal2tiles.html De fato, uma vez que você diz que "eu realmente não preciso de escalabilidade - este projeto é principalmente para permitir que alguns pesquisadores pares tenham acesso mais fácil aos meus dados do que o envio de um Arquivo de 8 GB e carregá-lo no ENVI. "Você pode até ficar sem usar uma caixa de ferramentas webgis: basta permitir que os usuários cliquem na imagem e capturem as coordenadas: http://www.emanueleferonato.com/2006/09/02/click -image-and-get-Coordinates-with-javascript /

(embora você deva encontrar uma maneira de apresentar bem sua imagem de 5000 x 5000)


Impressionante, este é um esclarecimento realmente útil. Um acompanhamento: devo guardar este binário no PostGIS? Eu só quero evitar a situação em que o servidor precisa extrair o arquivo binário inteiro do banco de dados antes de consultá-lo com PHP ou Python. Isso seria um passo proibitivamente lento.
dmahr

Não, o arquivo deve estar no sistema de arquivos. Não faz sentido usar um banco de dados. Mesmo abrir uma conexão provavelmente levará mais tempo que o código acima.
johanvdw

7

Isso se parece com três questões separadas: uma de infraestrutura, uma de arquitetura e outra de manipulação de eventos. Apresentarei uma abordagem possível, mas minha resposta é necessariamente geral.

A infraestrutura

Eu recomendo usar um serviço de hospedagem VPS como o Linode (www.linode.com) para o seu servidor. Isso fornece acesso total (ou seja, root) a um servidor mantido profissionalmente - sem preocupações com a falta de energia ou a perda de conexão com a Internet.

Arquitetura

Existem tantas opções aqui que podem ser realmente impressionantes. Como exemplo, eu corro alguns sistemas com GeoServer e OpenLayers. O GeoServer é atendido pelo Tomcat 7. O front end do OpenLayers / jQuery é atendido pelo Apache2. Você pode incluir o Postgres / PostGIS para armazenar dados vetoriais, mas essa não é uma boa opção para dados rasterizados. Você também pode configurar um sistema Python usando Django ou mesmo web.py (http://webpy.org/) para um controlador bastante simples. O GeoServer permite armazenar dados raster nos seguintes formatos:

  • ArcGrid - Formato de cobertura da grade de arco
  • GeoTIFF - Formato de arquivo de imagem marcado com informações geográficas
  • Gtopo30 - Formato de cobertura Gtopo30
  • ImageMosaic - plugin de mosaico de imagens
  • WorldImage - Um arquivo raster acompanhado por um arquivo de dados espaciais

Manipulação de eventos

Quando o usuário clica no mapa, você deseja exibir um gráfico de séries temporais dos dados do campo nesse ponto. Primeiro, configure um controlador, que pode ser escrito em Python ou Java, que escute solicitações de URL com latitude e longitude. Esse controlador retorna uma imagem estática renderizada no servidor ou dados json que o cliente (jQuery) pode transformar em um gráfico.

Em seguida, para obter os dados XY no mapa, você pode usar uma função como esta (consulte http://dev.openlayers.org/releases/OpenLayers-2.11/examples/click-handler.html ):

onClick: function(evt) {
    var clickSpot = evt.xy;
    // pass clickSpot to the controller ...
}

Espero que ajude.


Obrigado pela redação! Você já usou algum desses formatos de arquivo para fazer rasters tridimensionais com mais de 8 GB de tamanho? Eu sei que os GeoTIFFs não podem exceder 4 GB, por exemplo. E o software do servidor poderá consultar com eficiência uma única série de dados no eixo z?
dmahr

Dê uma olhada nas pirâmides de imagens . Isso pode ajudar com os problemas de tamanho do arquivo. Ao manipular o evento click, seu código (controlador) receberá os dados XY e, em seguida, procurará e extrairá o valor z de cada uma das 300 imagens com registro de data e hora. Isso é muito processamento e E / S de disco, por isso pode levar muito tempo. Se esse método de "força bruta" demorar muito, você poderá procurar algoritmos alternativos e / ou esquemas de armazenamento de séries temporais.
Katahdin

Sim, esse método de "força bruta" será mais lento do que eu prefiro (é ainda mais lento em um computador desktop). Acho que estou interessado em enquadrar todo o serviço de mapeamento da web em torno do melhor esquema de armazenamento alternativo que posso encontrar.
dmahr

1

Se eu entendi corretamente sua pergunta, eu criaria um serviço WMS de horário, por exemplo, com o MapServer .

Dessa forma, será fácil exibir a varredura correta para cada data / hora (com uma solicitação GetMap) e solicitar os valores para uma célula em um determinado intervalo de data / hora (com uma solicitação GetFeatureInfo).

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.