quarta-feira, julho 15, 2015

Análises Espaciais com o PostGIS Raster - Parte 2

Na postagem anterior, vimos como fazer a conversão e importação de um arquivo raster para um Banco de Dados Espaciais.

A seguir serão demostradas algumas consultas e análises com os dados da tabela uso_ocupacao_solo.

1) Obtendo Metadados


Para visualizar os metadados de um registro da tabela raster, podemos utilizar a seguinte consulta:

SELECT
(md).*,
(bmd).*
FROM
(SELECT
ST_Metadata(rast) AS md,
ST_BandMetadata(rast) AS bmd
FROM
uso_ocupacao_solo LIMIT 1
)
AS tmp;
view raw metadados.sql hosted with ❤ by GitHub

Como resultado, são exibidos diversos valores, tais como: coordenadas do canto superior (esquerdo e direito), tamanho do pixel, SRID , número de bandas, valores NODATA, dentre outros exibidos na Figura 1.

Figura 1 - Obtendo Metadados






Outro dado importante é o espaço ocupado pela tabela no HD, obtido através da seguinte consulta:

SELECT
pg_size_pretty(pg_total_relation_size('uso_ocupacao_solo'));
view raw tablesize.sql hosted with ❤ by GitHub

2) Interseção da Tabela Raster com um Município


Exemplo: gerar uma nova tabela a partir do recorte (clip) do uso e ocupação do solo em função dos limites do município de Ibitinga (Figura 2).

CREATE TABLE uso_ocupacao_ibitinga_2 AS
SELECT
gid,
(gv).val,
(gv).geom
FROM (
SELECT
gid,
ST_Intersection(rast, geom) AS gv
FROM
municipios,
uso_ocupacao_solo
WHERE
ST_Intersects(rast, geom)
AND nome = 'Ibitinga'
)
AS tmp;
Por padrão, operações que geram novas geometrias envolvendo tabelas de diferentes tipos (raster/vetor) geram vetores a partir da poligonização do raster. A Figura 2 mostra o resultado da tabela criada no QGIS:

Figura 2 - Clip entre a tabela raster e o município de Ibitinga























As dimensões de cada polígono desta tabela são equivalentes a resolução espacial do raster, definido na importação com o comando raster2pgsql.

3) Quantificando o Resultado


Exemplo: qual é a área total de cada classe de uso no município de Ibitinga, em hectares?

SELECT
dn,
SUM(ST_Area(geom::geography))/10000 AS area_ha
FROM
uso_ocupacao_ibitinga
GROUP BY dn
ORDER BY dn;
view raw sum.sql hosted with ❤ by GitHub
O resultado da consulta pode ser visto na Figura 3:

Figura 3 - Área total de cada classe de uso



Também é possível realizar esta mesma consulta no terminal e exportar o resultado para CSV, através do comando:
$  psql sp -c  "copy ( SELECT dn, SUM(ST_Area(geom::geography)) / 10000 AS area_ha FROM uso_ocupacao_ibitinga GROUP BY dn ORDER BY dn ) to STDOUT WITH CSV" -o sum.csv

4) Análise de Buffer


Exemplo: determinar o uso e ocupação do solo para um buffer com raio de 500 metros, em torno do rio formado pelos trechos com os seguintes gids: 8530, 8560, 8561, 8562, 8578, 8590, 8591, 8592,8595 (Figura 4).

Figura 4 - Trechos que compõem o rio a ser analisado

SELECT
(row_number() OVER ())::integer AS gid,
(gv).val,
(gv).geom
FROM (
SELECT
ST_Intersection(rast, geom) AS gv
FROM
uso_ocupacao_solo,
(
SELECT
ST_Buffer(Geography(ST_Union(geom)), 500)::geometry AS geom
FROM
hidrografia
WHERE
gid IN (8530,8560,8561,8562,8578,8590,8591,8592,8595)
) AS buffer_rio
WHERE
ST_Intersects(rast, geom)
) AS tmp;
Desta forma podem ser analisadas as classes de uso e ocupação do solo que estão dentro do buffer. O resultado pode ser visto na Figura 5:

Figura 5 - Resultado do buffer com as classes de uso e ocupação do solo




Nenhum comentário: