Importando Raster ao PostGIS

PostGIS RasterNo artigo anterior apresentei um breve tutorial de instalação do PostGre/GIS no ubuntu, incluindo a habilitação das funções para armazenamento, manuseio e processamento de dados geográficos matriciais. Pretendo, então, nesta publicação, apresentar a ferramenta “raster2pgsql”, que serve para a inserção do dados raster (também chamados de matriciais) georreferenciado ao banco de dados do PostGIS, bem como apresentar alguns elementos fundamentais para o bom trabalho com tais dados.

Há várias ferramentas já desenvolvidas em softwares livres de SIG, como o plugin “Load raster to PostGIS” , desenvolvido para o Quantum GIS que visam facilitar esse processo de importação dos dados. Contudo, a maioria ainda não apresenta perfeito funcionamento. Isso se torna ainda mais grave pelo fato de a gestão de dados matriciais no PostGIS ser ainda novo e por isso, poucos já possuem seus banco de dados habilitados para tal. Assim, fica difícil para o usuário saber quando o erro apresentado se deve ao mal funcionamento do plug-in ou pelo fato de seu banco ainda não ter habilitação para armazenamento de dados matriciais.

O início do desenvolvimento das funções voltadas para os dados matriciais para PostGIS se deu independente do projeto oficial e que só foi incorporado a este na ocasião do lançamento da versão PostGIS 2.0. Mas por ser um projeto novo e, até certo ponto, pouco divulgado, poucos sabem que há um script .sql específico a ser executado na criação do banco de dados espaciais que habilita tais funções (caso tenha interesse, basta acessar o artigo anterior para informações). Vale ressaltar que a mesma já foi apresentada na revista FOSSGIS Brasil.

Darei início a este tutorial, partindo do princípio que vocês já está com um banco de dados espaciais no PostGIS criado e com todos os scripts e habilitações feitas (inclusive para dados matriciais, claro).

Vamos, então, ao que interessa:
O processo de importação do raster ao banco, se dá em dois passos:
No primeiro, converte-se o raster em um arquivo “.sql”. E é justamente a ferramenta “raster2pgsql” que faz esta conversão.

1- PROCESSO DE TRANSFORMAÇÃO DO ARQUIVO MATRICIAL EM SQL:

Para exemplificar, uma vez com o terminal do Ubuntu aberto e no diretório onde o arquivo matricial a ser convertido se encontra, executamos o comando com a seguinte estrutura:

raster2pgsql opcoes_raster arquivoraster.tiff nome_schema.nome_tabela>nome_arq_saida.sql

Com o comando exemplificado, estamos utilizando a ferramenta “raster2pgsql” para converter o arquivo “arquivoraster.tiff” para “nome_arq_saida.sql”, mas já definindo em que esquema do banco de dados o raster será importado e o nome da tabela a ser usado.
As “opcoes_raster”, por sua vez são parâmetros básicos e fundamentais para que a importação seja bem sucedida.

De todos os parâmetros evidencio aqui, apenas alguns:
-c : Define que a tabela onde serão armazenados os dados deverá ser criada;
-a : Define que os dados serão anexados a uma tabela já existente;
-d : Deleta a tabelas e a cria novamente para inserir os dados;

Parâmetros de restrições aos dados, como:
-C : Aplica restrições que garantem a inserção correta dos dados na coluna “rast” (que é a coluna que contem a geometria e os valores dos pixels.

Parâmetros de processamento de dados:
-s 4326 Define o sistema de coordenadas do dado matricial (é fundamental que seja o mesmo SRID do arquivo de imagem, pois não se trata de conversão de sistemas!
No exemplo dado tal id (4326) se refere ao sistema geográfico com datum wgs84. SRID = Spatial Reference System Identifyer, ou id do Sistema de Referência Espacial.
-b 1,2,3 : Define quais bandas serão extraídas e usadas nessa conversão. No caso, solicitei que fossem usadas as bandas 1, 2 e 3. Quando a imagem só tiver uma banda, este parâmetro pode ser desconsiderado;
-t LarguraXAltura : Com este parâmetro, definimos a grosso modo o como será armazenada a imagem no banco. Podemos armazena-la, considerando cada pixel como uma linha do banco de dados (para esse caso, utilizaríamos “-t 1×1”) ou podemos deixar toda a imagem e um único registro do banco (caso, não seja especificado este parâmetro).

Este parâmetro influencia quase que diretamente na agilidade das consultas espaciais. O pesquisador Duncan Golicher publicou em seu blog um artigo comparando a velocidade da mesma consulta sobre um mesmo dado matricial armazenado com diferentes “tiles” (caso queira acessas o artigo, clique aqui). Vale muito a pena pensar no uso a ser dado para o raster em questão para pensar em como armazena-la, já que para diferentes funções, diferentes resultados foram obtidos pelo pesquisador.

É importante, portanto, pesquisar e estudar mais a respeito desses parâmetros. Caso tenham interesse, uma boa fonte de dados é o site PositGIS Refractions, que são os desenvolvedores originais do postgis e outras soluções livres para dados espaciais, como o Udig e o Geoserver. Portanto, possuem uma documentação muito boa sobre os parâmetros do PostGIS.

Voltando ao que interessa…
Para melhor ilustrar, coloco um código com alguns parâmetros definidos:

raster2pgsql -c -C -s 4326 -I nomedoraster.tiff  nome_schema.nome_tabela>Nome_arq_saida.sql

No exemplo acima, o parâmetro

  • -c: Define que uma nova tabela será criada com o nome definido no código.
  • -C: Aplica restrições matriciais, como tamanho de pixel, SRID, etc.
  • -s 4326: Informa e define o Sistema de Referência Cartográfica a ser utilizado, através de sua id. No exemplo dado, será utilizado o sistema de coordenadas geográficas com Datum WGS84;
  • -I: Cria o índice espacial GIST. Com esta há mais agilidade nas consultas espaciais.

Caso vocês tenha alguma dúvida quanto aos arquivos suportados pelo “raster2pgsql”, basta executar no terminal:

raster2pgsql -G

Com este, será apresentada a vasta lista de extensões de imagens suportadas.

2- EXECUSSÃO DO ARQUIVO .SQL

Tendo convertido o arquivo matricial em arquivo .sql, devemos, agora executá-lo no banco de dados desejado.

Para isso, acessamos a partir do terminal do Ubuntu, o Sistema de Gerenciamento do Banco de Dados PostGIS como super usuário, através dos comandos:

sudo su
su postgres

Esses comando foram apresentados com mais detalhes no artigo anterior, caso tenha interesse.

Uma vez dentro do Sistema Postgres executamos:

psql -d nome_bd -f nome_arq_saida.sql

O processo não é tão difícil quanto pode parecer.
Porém, se nessa ultima etapa aparecer o seguinte erro: “psql:nomedoarquivo.sql:3: ERROR: current transaction is aborted, commands ignored until end of transaction block” é porque o banco de dados de destino da importação não está habilitado para trabalhar com dados matriciais. Portanto, sugiro que o script seja rodado mais uma vez para tal banco de dados.

Há, ainda, a possibilidade de executar os dois passos de uma vez só. Para tal bastaria acrescentar a função “| psql -d “nome_bd” ao script de transformação do arquivo. Para o exemplo dado, ficaria:

raster2pgsql -c -C -s 4326 -I nomedoraster.tiff  nome_schema.nome_tabela | psql -d nome_bd

Vale evidenciar que ao realizar ambos procedimentos de uma só vez, o arquivo matricial é transformado e salvo diretamente no banco, não sendo salvo em formato .sql. Por este fato, não se informa um nome de saída para o processo de transformação.

BENEFÍCIOS DO USO DO RASTER NO POSTGIS:

Acabei publicando o presente artigo sem fazer uma breve reflexão sobre o uso de dados matriciais no PostGIS. Sendo este o motivo dessa complementação:

A possibilidade de se importar dados matriciais para um banco de dados do PostGIS e realizar o processo inverso, possibilita reduzir o tamanho dos dados armazenados, assim como agiliza a troca de dados entre as pessoas, empresas e instituições.
Por exemplo, uma empresa que comercializa imagens de satélites, pode manter um banco de dados central para armazenar todo seu acervo (sem se preocupar com o tamanho que tal acervo alcançaria), facilitando acesso dos funcionários a esses dados.

Além disso, o fato de se realizar ambos processos a partir de linguagem SQL, cria-se a possibilidade de criar scripts, sistemas e aplicativos WEB personalizados com interface amigável. Seguindo o exemplo anterior, tal empresa poderia criar uma web com uma interface amigável onde o comprador teria acesso ao produto solicitado, sem complicações com entrega, e ampliado a área de atuação da empresa.

Assim, o uso do banco de dados em sí, não torna as coisas mais complicadas e nem impõe na necessidade de todos que trabalham com tais dados o conhecimento da linguagem SQL. Pelo contrário, torna possível criar soluções personalizadas garantindo o acesso aos usuários com menos conhecimento.

Caso tenham críticas ou sugestões, fiquem a vontade em fazê-las!

Anúncios

Sobre Felipe Barros

Geógrafo formado pela PUC-Rio, é mestre em Biodiversidade pelo Jardim Botânico do Rio de Janeiro e especialista em analise ambiental e gestão do território pela ENCE/IBGE. Trabalha com softwares livres de análise espacial, banco de dados e sensoriamento remoto.
Esse post foi publicado em Banco de Dados Geográficos e marcado , , , , , , . Guardar link permanente.

6 respostas para Importando Raster ao PostGIS

  1. Olá Felipe, parabéns pelo post com as referências e tal, mas estou com uma dúvida, consegui fazer os passos, os dados se encontram inseridos no banco, apesar da coluna raster aparecer em branco no pgdamin, mas como eu verifico se deu certo a importação, em qual programa eu consigo adicionar esse “layer”, tentei no qgis, mas ainda naum consegui com o plugin “Load Raster of Postgis”. Obrigado!

  2. Felipe Sodré disse:

    Olá, Milton.
    Infelizmente o plugin “Load Raster” parece não estar funcionando. Até o momento, tenho inserido e utilicado o PostGIS para armazenar e desenvolver consultas com dados rasters, e não para visualização. Contudo, caso queir, só por curiosidade ter certeza de que o procedimento está todo correto, vc pode usar o plugin “db manager” e, conectado ao seu banco de dados escrever a consulta “select rast::geometry from tablea_raster”, na “Janela SQL”. Com essa consulta vc estará indicando a coluna rast como geometria e visualizará o(s) tile(s) do raster inserido.
    Espero ter ajudado.
    Ateciosamente

  3. Bruno Faria disse:

    Olá Felipe, muito bom o conteúdo do blog, me ajudou muito!
    Iniciei pesquisa na área há pouco tempo e procuro contato com profissionais engajados para trocar idéias (principalmente para tirar minhas dúvidas, que são muitas).
    Se não for inconveniente, gostaria de pedir seu contato se possível.
    De toda forma, agradeço a atenção.
    Abraço!

  4. Oi, Bruno. Que bom que te ajudou… a ideia é essa! Entro em contato com vc. Grande abraço. Felipe Sodré Barros

  5. Rogério Alves Barbosa da Silva disse:

    como aplico o comando para inserção de raster em um endereço IP?

  6. Prezado, há duas possibilidades:
    1) usar a função raster2pgsql no seu PC e posteriormente conectar ao seu host para importar o resultado (raster.sql) ao postgis;
    2) realizar as duas funções ‘concatenadas’ pelo ‘|’ (pipe), passando Há função de importação (psql) o endereço, porta, usuário e senha do seu servidor.

    ex. 1: raster2pgsql -I -C -e -Y -F -s 26986 -t 128×128 -l 2,4 bostonaerials2008/*.jpg aerials.boston>gisdb.sql & Após conectar ao seu postgis executar o comando: psql -d gisdb
    ex. 2: raster2pgsql -I -C -e -Y -F -s 26986 -t 128×128 -l 2,4 bostonaerials2008/*.jpg aerials.boston | psql -U postgres -d gisdb -h IP_host -p 5432

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s