Não é segredo algum, mas todos sabemos que o PostGIS é a extensão espacial mais produtiva do mundo. Ela não só possui mais funcionalidades do que as outras disponíveis no mercado, mas como é open-source, com uma comunidade incrível por trás.
Hoje vou revelar alguns pequenos segredos escondidos nas funcionalidades do PostGIS para vocês. Estas funções, com toda certeza, irão te tornar mais produtivo e efetivo no uso desta ferramenta tão legal.
1. Escrita de Geometrias
Ler e escrever faz parte do básico do PostGIS. Existem várias funções que permitem a leitura e a escrita de geometrias no formato que o PostGIS espera.
Existem funções para conversão de texto para geometria, bytes para geometria e outros formatos. Mas a campeã de flexibilidade para testes rápidos e verificações é a ST_GeomFromText
.
Veja abaixo um exemplo de como usá-la:
SELECT * FROM ST_GeomFromText('POINT(0 0)', 4326);
Veja a saída do PostGIS, no formato interno.
0101000020E610000000000000000000000000000000000000
Lembro, que esta funcionalidade não é somente útil para a conversão para o formato esperado, mas também para usar seu resultado como entrada para outras funções, como no exemplo:
-- o polígono interseciona o ponto?
SELECT * FROM ST_Intersects(
ST_GeomFromText('POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))', 4326),
ST_GeomFromText('POINT(0 0)', 4326)
);
Retornando um resultado positivo:
t
A assinatura desta função é bem simples. Ela espera como primeiro parâmetro uma string e opcionalmente um inteiro, representando o SRID (Spatial Reference ID). Nos exemplos foi usado WGS-84 como SRID.
Referência: ST_GeomFromText
2. Validade de Geometrias
A validade das geometrias é uma questão importantíssima para qualquer tipo de uso em pacotes de geoprocessamento.
É bom lembrar que o único tipo de geometria (definido na [SFS] (Simple Feature Specification) que possui validade são os tipos poligonais (Polygon
e MultiPolygon
). Os outros tipos podem ser testados para sua validade, mas ela é sempre verdadeira.
Geometrias inválidas não podem ser corretamente renderizadas e irão “mentir” quando investigadas sob diversos aspectos – notavelmente, cálculos de área e testes de interseção podem falhar com geometrias inválidas.
No PostGIS, existem algumas formas de se verificar a validade de geometrias. São três funções simples que podem te ajudar a identificar culpados. As funções são:
- ST_IsValid – Verifica a validade de uma geometria e retorna
verdadeiro
ou falso
.
- ST_IsValidReason – Verifica a validade de uma geometria e retorna a razão pela qual a mesma é inválida, exemplo:
auto intersecção
.
- ST_IsValidDetail – Verifica a validade de uma geometria e retorna o motivo e a localização do problema, exemplo:
SELECT * FROM
ST_IsValidDetail(
ST_GeomFromText('POLYGON((0 0, 0 -1, 0 1, 1 1, 1 0, 0 0))', 4326)
);
O resultado, neste caso, é uma tupla com três elementos: valid
, reason
e location
:
f;"Self-intersection";"01010000000000000000000000000000000000F0BF"
3. Transformação de Referência Espacial
O PostGIS suporta mútliplas referências espaciais. Tradicionalmente, isto é conhecido por um código EPSG
, o SRID
.
SRID é a abreviação para Spatial Reference System Identifier, definido originalmente pelo EPSG. É um código único que identifica um sistema de referência espacial, com todos as suas variações de datum, projeção e sistema de coordenadas.
EPSG é a abreviação para Euroupean Petroleum Survey Group – que não existe mais, foi absorvido pelo IOGP (International Association of Oil and Gas Producers).
Geralmente, cada tabela no PostGIS, possui apenas uma coluna geométrica, com um SRID
definido. Apesar disso, o PostGIS suporta múltiplas colunas geométricas em uma mesma tabela e até mesmo colunas geométricas com referências espaciais nulas.
A multiplicidade de dados geográficos faz necessária a conversão entre diferentes SRIDs
. Lembramos também que comparações e testes de relacionamento entre geometrias (como se uma geometria interseciona outra) devem ser feitos apenas se ambas geometrias possuem o mesmo sistema de referência espacial.
Um exemplo simples, é a conversão de uma coordenada UTM, na zona 22 Sul em SIRGAS 2000 para SIRGAS 2000 geográfico:
SELECT * FROM
ST_AsText(
ST_Transform(
ST_GeomFromText(
'POINT(789071 7905599)', 31982),
4674
)
)
Note que na chamada acima, usamos ST_GeomFromText
para “instanciar” as geometrias em memória, de coordenadas geográficas, transformamos as mesmas com ST_Transform
e pedimos sua representação textual com ST_AsText
.
Para referências de códigos EPSG e SRIDs, use o site epsg.io. Abaixo estão as duas URLs as referências espaciais usadas no comando acima:
- 31982 – SIRGAS 2000 UTM 22S;
- 4674 – SIRGAS 2000 – Geográfico;
Conclusão
Apesar de discutirmos neste artigo, funções básicas do PostGIS, elas são muito úteis em todos os cenários, seja no desenvolvimento de sistemas com o PostGIS ou utilizando o PostGIS como motor de análise espacial.
Este é um dos primeiros artigos sobre PostGIS. Fique ligado aqui no blog que logo logo teremos mais.
Abraços