quarta-feira, julho 08, 2015

Análises Espaciais com o PostGIS Raster - Parte 1


O projeto PostGIS Raster possibilita o armazenamento e manipulação de dados matriciais em Banco de Dados Espaciais através da linguagem SQL.

Nesta série de tutoriais, serão demonstradas algumas funcionalidades desta extensão através da utilização dos dados de uso e ocupação do solo da mesorregião de Aracicaba (SP) e adjacências. Os dados podem ser obtidos através deste link: http://ge.tt/1Hye7zJ2/v/0?c

Caso você ainda não tenha o PostgreSQL e o PostGIS instalados no Ubuntu, este post descreve o processo: Instalação do PostGIS 2.0 no Ubuntu via Terminal

1) Criação do Banco de Dados Espaciais


Com o terminal aberto, entre com o comando:

$ createdb sp

Uma vez criado o Banco de Dados, deve-se então habilitar a extensão PostGIS no mesmo:

$ psql sp
psql (9.4.4)
Type "help" for help.

postgis=# CREATE EXTENSION postgis;

Digite \q para sair do Banco de Dados.

2) Conversão do arquivo Raster para SQL


Para realizar a conversão, abra o terminal e navegue até o diretório onde o arquivo uso_ocupacao.tif se encontra, em seguida, execute o seguinte comando:
$  raster2pgsql -s 4326 -I -M -C uso_ocupacao.tif -F -t 30x30 uso_ocupacao_solo > uso_ocupacao_solo.sql

Cada flag, que são as letras iniciadas com um "-" determina uma propriedade no arquivo sql que é gerado, neste caso em específico, temos:
  • -s : sistema de referência espacial do raster (SRID 4326)
  • -I: cria um índice GiST na coluna do raster
  • -M: adiciona um "Vacuum analise" ao script
  • -C: cria as constraints da tabela raster
  • -F: adiciona uma coluna com o nome do arquivo
  • -t 30×30: resolução espacial do raster

Outras opções sobre as flags e sobre o raster2pgsql  podem ser encontradas no link:


Agora é possível carregar todos os arquivos no Banco de Dados (municipios.sql, hidrografia.sql e uso_ocupacao_solo.sql) através de um único comando:

$  for f in *.sql; do psql -f $f -d sp; done

3) Visualização das tabelas no QGIS:


Uma vez configurada a conexão entre o QGIS e o Banco PostGIS, através do plugin DB Manager podemos então visualizar as tabelas do tipo raster, como mostra a Figura 1:

Figura 1 - Com o botão direito do mouse é possível escolher a opção "Add to canvas"

Para melhor representação visual da tabela, clique com o botão direito no layer e em "Properties -> Style" realize o ajuste exibido na Figura 2:

Figura 2 - Ajuste das cores do mapa temático

A Figura 3 mostra como deve ficar o resultado no QGIS.

Figura 3 - Mapa de uso e ocupação do solo

No próximo post demonstrarei algumas consultas e análises espaciais úteis utilizando os dados desta tabela, através da linguagem SQL... até breve :)

3 comentários:

vicentimartins disse...

Parabéns pelo material e por estar compartilhando mais esse conteúdo. Abraço professor!

Eduardo de Oliveira disse...

Sugestão para o clip da imagem com o PostGIS...

create table recorte as
select
row_number() over()::integer as rid,
--st_clip(a.rast,st_buffer(a.geom,0)) as rast, -- se quiser fazer um recorte maior que a imagem... pode acrescentar o st_union
st_union(st_clip(a.rast,a.geom)) as rast, -- st_union somente para nao ficar com um monte de rid...
geom -- nao precisa da geometria
from
(select pol.gid, img.rast, pol.geom from SEU_POLIGONO pol, SUA_IMAGEM img where pol.gid = ID_DO_POLIGONO_DE_SUA_ESCOLHA) a
where
st_intersects(a.rast,a.geom)
group by a.gid, a.geom;

Eduardo de Oliveira disse...

Sugestão para o clip da imagem com o PostGIS...

create table recorte as
select
row_number() over()::integer as rid,
--st_clip(a.rast,st_buffer(a.geom,0)) as rast, -- se quiser fazer um recorte maior que a imagem... pode acrescentar o st_union
st_union(st_clip(a.rast,a.geom)) as rast, -- st_union somente para nao ficar com um monte de rid...
geom -- nao precisa da geometria
from
(select pol.gid, img.rast, pol.geom from SEU_POLIGONO pol, SUA_IMAGEM img where pol.gid = ID_DO_POLIGONO_DE_SUA_ESCOLHA) a
where
st_intersects(a.rast,a.geom)
group by a.gid, a.geom;