Mágicas com UTM

A projeção UTM (Universal Transverse Mercator) é muito utilizada para todos os tipos de cartografia.

Ela nem sempre se aplica a todos os casos e deveria ser menos utilizada em algumas aplicações, mas com toda certeza é bastante comum no Brasil e no mundo.

Uma das características marcantes desta projeção, é que ela não é uma projeção única. São 60 zonas com parâmetros diferentes, para cada local do planeta, dividido a cada 6 graus de longitude.

Vou ensinar algumas mágicas utilizando princípios simples para se descobrir maiores informações, necessárias quando estamos trabalhando com essas zonas.

Zona UTM > Meridiano Central

O meridiano central de uma zona UTM é o local que possui a menor distorção da projeção.

Podemos calculá-lo, seguindo a fórmula:

MC = (6 * Z) - 183

Veja o exemplo:

MC = (22 * 6) - 183
MC = 132 - 183
MC = -51

Um outro exemplo, com a zona 30:

MC = (30 * 6) - 183
MC = 180 - 183
MC = -3

Para encontrar os limites de uma zona UTM, adicione 3 graus para o limite oeste e subtraia 3 graus para o limite leste.

MC = -51
Limite Leste = -51 - 3
Limite Leste = -54
Limite Oeste = -51 + 3
Limite Oeste = -48

Longitude > Meridiano Central

Este cálculo é importante: baseado no valor X (ou longitude), você consegue descobrir qual é o meridiano central da zona daquela coordenada.

# nota a divisão de longitude por 6 deve considerar apenas valores inteiros
MC = (6 * int(longitude/6)) + 3
MC = (6 * (-48/6)) + 3
MC = (6 * -8) + 3
MC = -45

Meridiano Central > Zona UTM

Com este cálculo, você informa o meridiano central e descobre qual zona UTM ele está inserido.

UTMZ = 30 - absoluto(int(MC/6))
UTMZ = 30 - absoluto(int(-45/6))
UTMZ = 30 - absoluto(int(-7.5))
UTMZ = 23

São três continhas fáceis de serem realizadas, que ajudam muito na hora de trabalhar com UTM.

3 Ferramentas do PostGIS que são uma mão na roda

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 SRIDdefinido. 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