No artigo anterior vimos como realizar algumas operações espaciais no PostGIS, como conversão de coordenadas e pesquisa por objetos a partir de um ponto.

Agora avançaremos mais, realizando uma operação de união de elementos em uma tabela. Caso o leitor não tenha um banco em funcionamento, consulte os artigos anteriores para criar um.

Operações espaciais na linha de comando
Uma das características interessantes de um banco espacial é a possibilidade do usuário executar operações espaciais a partir da linha de comando (psql, PgAdmin, etc.), utilizando a linguagem SQL. Com isto, evita-se o uso desnecessário de ferramentas gráficas e cria-se a possibilidade de automatizar algumas operações, como por exemplo deixar as mesmas rodando em período de menor carga do banco.

União de polígonos
Na figura 1 temos seis polígonos diferentes, que possuem um atributo cujo nome é TIPO. O objetivo é unir todos os polígonos que possuam o mesmo valor para o atributo TIPO, chegando ao resultado visto na figura 2.

Figura 1 - Polígonos separados
Figura 2 - Polígonos
Figura 1 – Polígonos separados                                                             Figura 2 – Polígonos unidos

Passos
1. Criar uma tabela com suporte a dados espaciais e fazer a carga dos elementos da figura 1.

BEGIN;
CREATE TABLE tbl_poligonos (id serial PRIMARY KEY, tipo int4);
SELECT AddGeometryColumn(‘’, ‘tbl_poligonos’, ‘geom’, ‘-1’, ‘POLYGON’, 2);
INSERT INTO tbl_poligonos (tipo, geom) VALUES (3, GeomFromText(‘POLYGON((1 2, 4 2, 4 3, 3 3, 3 5, 1 5, 1 2))’, -1));
INSERT INTO tbl_poligonos (tipo, geom) VALUES (3, GeomFromText(‘POLYGON((4 1, 6 1, 6 4, 5 4, 5 3, 4 3, 4 1))’, -1));
INSERT INTO tbl_poligonos (tipo, geom) VALUES (2, GeomFromText(‘POLYGON((3 3, 5 3, 5 5, 3 5, 3 3))’, -1));
INSERT INTO tbl_poligonos (tipo, geom) VALUES (2, GeomFromText(‘POLYGON((1 5, 5 5, 5 6, 1 6, 1 5))’, -1));
INSERT INTO tbl_poligonos (tipo, geom) VALUES (2, GeomFromText(‘POLYGON((5 4, 6 4, 6 7, 2 7, 2 6, 5 6, 5 4))’, -1));
INSERT INTO tbl_poligonos (tipo, geom) VALUES (1, GeomFromText(‘POLYGON((1 6, 2 6, 2 8, 1 8, 1 6))’, -1));
END;

2. Criar uma tabela para receber os resultados da operação de união.

BEGIN;
CREATE TABLE tbl_poligonos_unidos (id serial PRIMARY KEY, tipo int4);
SELECT AddGeometryColumn(‘’, ‘tbl_poligonos_unidos’, ‘geom’, ‘-1’, ‘POLYGON’, 2);
END;

3. Executar instrução SQL que vai unir os polígonos.

INSERT INTO tbl_poligonos_unidos (tipo, geom)
SELECT tipo, geomunion(geom) AS geom FROM tbl_poligonos
GROUP BY tipo

Na instrução acima, foi utilizada a função GeomUnion para realizar a operação de união. Esta função é derivada do suporte ao Geos, uma ótima biblioteca cujo objetivo é portar a biblioteca JTS (Java) para C++.

Para ver o resultado, faça uma consulta

SELECT AsText(geom) FROM tbl_poligonos_uniao

e observe que somente três linhas retornam, pois os polígonos com mesmo tipo foram unidos.

Funções básicas de geoprocessamento, como União, Diferença e Buffer, podem ser realizadas através de instruções SQL no PostGIS.

Para maiores detalhes veja:
Documentação PostGIS
http://postgis.refractions.net/docs
Site do projeto GEOS
http://geos.refractions.net
Site do projeto JTS
www.vividsolutions.com/jts

Roberto Oliveira Santos
Oracle Certified Professional – Consultor/ desenvolvedor especialista em geotecnologias
py5gol@gmail.com