PostGIS WKT Raster
Buenas pessoal,
Como estão as coisas? Hoje vamos conversar um pouquinho sobre o WKT Raster.
O WKT Raster é um projeto para implementar suporte aos famosos grids, rasters, imagens ao PostGIS. WKT vem de Well Known Text (algo como "texto bem conhecido").
O projeto já tem código compilado e funcionando e tomei a semana para testá-lo de acordo. A implementação veio da especificação desenvolvida por Pierre Racine. O projeto tem como objetivo integrar-se perfeitamente ao engine do PostGIS já existente, sendo possível executar operações espaciais / álgebra de mapas, carregar rasters multi-bandas, entre outras coisas deliciosas.
Este projeto é muito interessante, pois podemos armazenar os rasters dentro do banco de dados, garantindo ou excluindo acesso à quem realmente precisa, ao invés de ficarmos com milhares de cópias por aí (imagine um escritório com 20 analistas GIS - qual é quantidade de informações duplicadas), sem saber ao certo qual é a mais atual ou com melhor qualidade - enfim, nos garante todas as vantagens do armazenamento centralizado em banco de dados. Não necessariamente precisamos armazenar os dados no PostgreSQL, podemos deixá-los em HD e adicionar somente os metadados e acessá-los da mesma forma, caso você esteja preocupado com disco
. Em suma, é demais!
Vamos comentar com instalar essa belezinha no seu PostgreSQL - em Windows XP. Linux users, sorry.
Pré-requisitos
Sempre existem né?
- PostgreSQL/PostGIS instalado. O PostGIS deve 1.4 ou maior, determinando também a versão do PostgreSQL: 8.3 ou maior;
- Python;
- GDAL/python;
- WKT Raster;
Instalação
1) Instale o Python, 2.5 ou 2.6. Estou usando o 2.5, que foi instalado junto com o ArcGIS. Portanto, se você tem esta instação específica, não se preocupe. Esta instalação é bem simples. Dois cliques, pá pum, está instalado.
2) Instale os GDAL bindings. Para fazer isso é só descompactar a pasta zipada e colocá-la no diretório que mais lhe agradar. Coloquei a minha pasta (gdalwin32-1.6) no diretório C:.
2.1) Vá em Painel de Controle > Sistema > Avançado > Variáveis de Ambiente. Procure a variável PATH. Ela é composta de vários diretórios separados por um ponto-e-vírgula, correto? Adicione o diretório C:gdalwin32-1.6bin nesta listinha e adicione um ; no final. Claro, se você pos a pasta do gdal em outro diretório, faça as alterações pertinentes.
2.2 ) Ainda em variáveis de ambiente, adicione uma nova variável, chamada GDAL_DATA e adicione o caminho C:gdalwin32-1.6data como caminho. Como esta variável de ambiente é usada somente pelo GDAL, não se preocupe em colocar o ;. Mas se colocar também não faz mal. Dê OK para salvar as variáveis de ambiente. Os bindings do GDAL para Python já estão instalados. Você pode acessá-los e utilizar o GDAL para um monte de coisas, como converter coordenadas de rasters, reprojetá-los, etc. tudo usando uma linha de comando.
3) Descompacte o pacote do WKT Raster.
3.1) Copie o arquivo rtpostgis.dll para a pasta lib do PostgreSQL. Geralmente é algo como C:Program FilesPostgreSQL8.xlib;
3.2) Copie os arquivos gdal2wktraster.py e libgdal.dll para a pasta bin da sua instalação do PostgreSQL. Fácil né?
3.3) Vamos instalar os comandos e funções do Wkt Raster no nosso banco agora. Abra o PgAdmin3 ou o console sql do Postgres e conecte-se ao banco de dados alvo. Feito isso, rode os comandos que se encontram na pasta sharecontrib do pacote WktRaster. Feito isso, teste se o WKT Raster está funcionando apropriadamente usando o comando SQL:
SELECT postgis_raster_lib_build_date(),postgis_raster_lib_version();
Caso o comando tenha sucesso, tudo foi instalado com sucesso.
A instalação termina aqui. Mas como carregar um raster para dentro de nosso banco de dados? Podemos utilizar a ferramenta em Python desenvolvida para este propósito, o script gdal2wktraster.py
Carregar um raster para o banco de dados
Esta ferramenta é uma aplicação em linha de comando, bastante fácil de utilizar. O resultado dela é um script .sql que você pode rodar pelo console sql ou pelo PgAdmin3.
Abra um console DOS e digite:
python "CaminhoParaOArquivogdal2wktraster.py" --help
Isto lhe deve dar todas as opções da ferramenta.
Algumas:
- -t nome da tabela à ser criada no PostGIS, e.g. -t teste_raster;
- -o nome do arquivo de saída, e.g. -o srtm.sql;
- -k especifica o tamanho tile. Esta opção é muito importante, pois divide seu raster original em diversos registros cada um com este tamanho, em pixels. e.g. -k 90x90; Caso você não utilize esta opção, seu raster original ocupará apenas um único registro da tabela. Se você utilizá-la, você diz ao PostGIS: pegue este raster, fatie-o em pedaços de tal tamanho e insira-os nesta tabela!
- -f especifica o nome da coluna do tipo raster. e.g. -f grid;
- -r esta é a opção mais importante de todas, com ela especificamos o arquivo original à ser carregado. e.g. -r "CaminhoDoArquivoRasterarquivo.tif";
Exemplo de um comando completo
C:Python25python.exe "C:Program FilesPostgreSQL8.3bingdal2wktraster.py" - r "C:srtm.tif" -k 90x90 -f grid -t srtm -o srtm.sql
Esta ferramenta é bem fácil de utilizar e gera um SQL limpinho, só faltando rodá-lo dentro do banco de dados.
Estou desenvolvendo algumas ferramentinhas de análise espacial, em especial ferramentas para extração automática de feições - algumas já estão prontas, outras ainda no forno, mas logo logo falo sobre elas! Esta é a página oficial do WKT Raster.
O que acharam?
Abraços!
Related posts:
July 31st, 2010 - 16:04
Oi George.
O WKTRaster vai ser uma bomba. Podes dizer como se faz para construir um mosaico dentro do PostGIS a partir de várias imagens no disco? E como se mantém a performance com pirâmides? Podemos actualizar parte do mosaico, por exemplo com uma nova imagem adicional?
Abraço,
Duarte
[Translate]
July 31st, 2010 - 18:06
Olá Duarte, tudo bom? Primeiro, obrigado pelo comentário.
A ferramenta gdal2wktraster pode carregar diversos rasters de uma única vez utilizando os caracteres curinga disponívels (* e ? se não me engano) – que devem funcionar como um curinga greedy e um curinga local, respectivamente.
Algo como gdal2wktraster -r srtm0?.tif – deveria carregar todos os rasters que tenham o prefixo srtm0x. O curing “guloso” deve ser utilizado como *.tif, por exemplo.
A opção que controle o nível das pirâmides é -l.
Quanto à perfomance: não sei ainda lhe dizer, mas me pareceu bem eficiente a carga de dados, quanto as queries. Processamento, como eu disse, é outra história – ainda não existem funções de baixo nível para executá-los, mas em SQL é possível, com uma velocidade quase aceitável.
Para inserir um novo grid à mesma tabela (um quadrícula nova de uma carta topográfica por exemplo) você utiliza as opções disponíveis no gdal2wktraster, que irá gerar um único insert para você.
[Translate]