1.7. PostGIS Geometry

A extensão PostGIS introduz o tipo PostGIS Geometry para representação de geometrias no Plano Cartesiano. As operações sobre esse tipo são sempre realizadas em 2D, mesmo se a geometria possuir valores de coordenada \(z\) ou \(m\). Além disso, as operações como área e perímetro são realizadas na unidade do sistema de referência espacial associada à geometria. Isso significa que se as coordenadas forem expressas em graus, por exemplo, é necessário realizar uma transformação para um sistema de coordenadas onde seja possível calcular essa área ou perímetro em uma unidade de medida métrica.

1.7.1. Representação WKT

A especificação OGC-SFS [7] define uma notação textual conhecida por Well-Know Text ou WKT, que permite representar elementos geométricos tais como geometrias elementares (pontos, linhas e polígonos) e coleções homogêneas de geometrias (coleção de pontos, coleção de linhas e coleção de polígonos), conforme pode ser visto na Tabela 1.3.

Tabela 1.3 - Exemplos de geometrias.

( a ) Geometrias Simples

( b ) Coleções Pontos e Linhas

( c ) Coleções Polígonos

fig:sql:tipos-geometricos:wkt-pt-lin-pol

fig:sql:tipos-geometricos:wkt-mpt-mlin

fig:sql:tipos-geometricos:wkt-mpoly

Na notação WKT, o ponto de coordenadas \(x = 1\) e \(y = 8\), mostrado na Tabela 1.3a, é descrito pela seguinte cadeia de caracteres ou string:

POINT(1 8)

A linha definida a partir de interpolações lineares de três vértices consecutivos mostrada na Tabela 1.3a é descrita pela seguinte string:

LINESTRING(1 5, 3 6, 4 5)

O polígono simples, formado por um anel externo e um anel interno, mostrado na Tabela 1.3a é descrito pela seguinte string:

POLYGON( (1 1, 2 3, 5 4, 5 1, 1 1), (3 2, 4 3, 4 2, 3 2) )

A coleção de pontos mostrada na Tabela 1.3b, é descrita por:

MULTIPOINT(1 8, 3 7, 4 9, 2 9)

A coleção de linhas (Tabela 1.3b), é descrita por:

MULTILINESTRING( (1 2, 3 3, 4 2), (4 3, 6 2) )

Finalmente, a coleção de polígonos (Tabela 1.3c), é descrita por:

MULTIPOLYGON( ( (1 4, 2 6, 4 5, 3 4, 1 4) ),
              ( (1 1, 2 3, 5 4, 5 1, 1 1), (3 2, 4 3, 4 2, 3 2) ) )

1.7.2. Criando Geometrias

A função ST_GeomFromText permite criar uma geometria a partir de uma string na notação Well-Know Text ou WKT. Os exemplos de consulta SQL abaixo mostram como utilizar esta função para criação das geometrias apresentadas na Tabela 1.3.

1. Criando um ponto de coordenadas \(x = 1\) e \(y = 8\) (Tabela 1.3a):

SELECT ST_GeomFromText('POINT(1 8)');

2. Criando uma linha definida a partir de três vértices (Tabela 1.3a):

SELECT ST_GeomFromText('LINESTRING(1 5, 3 6, 4 5)');

3. Criando um polígono simples com um anel externo e um anel interno (Tabela 1.3a):

SELECT ST_GeomFromText('POLYGON( (1 1, 2 3, 5 4, 5 1, 1 1),
                                 (3 2, 4 3, 4 2, 3 2) )');

4. Criando uma coleção de pontos (Tabela 1.3b):

SELECT ST_GeomFromText('MULTIPOINT(1 8, 3 7, 4 9, 2 9)');

5. Criando uma coleção de linhas (Tabela 1.3b):

SELECT ST_GeomFromText('MULTILINESTRING( (1 2, 3 3, 4 2),
                                         (4 3, 6 2) )');

6. Criando uma coleção de polígonos (Tabela 1.3c):

SELECT ST_GeomFromText('MULTIPOLYGON( ( (1 4, 2 6, 4 5, 3 4, 1 4) ),
                                      ( (1 1, 2 3, 5 4, 5 1, 1 1),
                                        (3 2, 4 3, 4 2, 3 2) ) )');

1.7.3. Operadores Métricos

1. Qual a área do polígono mostrado na figura abaixo?

fig:sql:postgis-geometry:pgis-op-st_area

SELECT ST_Area(
           'POLYGON( (1 1, 2 3, 5 4, 5 1, 1 1),
                     (3 2, 4 3, 4 2, 3 2) )'
       );

2. Qual o perímetro do polígono mostrado na figura abaixo?

fig:sql:postgis-geometry:pgis-op-st_area

SELECT ST_Perimeter(
           ST_GeomFromText(
               'POLYGON( (1 1, 2 3, 5 4, 5 1, 1 1),
                         (3 2, 4 3, 4 2, 3 2) )'
           )
       );

3. Qual o comprimento da linha mostrada na figura abaixo?

fig:sql:postgis-geometry:pgis-op-st_length

SELECT ST_Length( 'LINESTRING( 1 2, 3 3, 4 2 )' );

4. Qual a distância entre as geometrias A e B?

fig:sql:postgis-geometry:pgis-op-st_distance

SELECT ST_Distance(
           'LINESTRING( 1 5, 3 6, 4 5 )',
           'POLYGON( (1 1, 2 3, 5 4, 5 1, 1 1),
                     (3 2, 4 3, 4 2, 3 2) )'
       );

1.7.4. Operadores Conjunto

1. O operador ST_Intersection computa a geometria de intersecção entre duas geometrias.

fig:sql:postgis-geometry:st-intersection

SELECT ST_AsText(
           ST_Intersection(
               ST_GeomFromText( 'POLYGON( (1 2, 1 4, 3 4, 3 2, 1 2) )' ),
               ST_GeomFromText( 'POLYGON( (2 1, 2 3, 4 3, 4 1, 2 1) )' )
           )
       );

2. O operador ST_Union computa a geometria formada pela união de outras duas geometrias.

fig:sql:postgis-geometry:st-union

SELECT ST_AsText(
           ST_Union(
               ST_GeomFromText( 'POLYGON( (1 2, 1 4, 3 4, 3 2, 1 2) )' ),
               ST_GeomFromText( 'POLYGON( (2 1, 2 3, 4 3, 4 1, 2 1) )' )
           )
       );

3. O operador ST_Difference computa a geometria formada pela diferença entre a geometria A e a geometria B.

fig:sql:postgis-geometry:st-difference

SELECT ST_AsText(
           ST_Difference(
               ST_GeomFromText( 'POLYGON( (1 2, 1 4, 3 4, 3 2, 1 2) )' ),
               ST_GeomFromText( 'POLYGON( (2 1, 2 3, 4 3, 4 1, 2 1) )' )
           )
       );

Nota

O operador ST_SymDifference computa a geometria formada pela diferença simétrica entre duas geometrias.

1.7.5. Relacionamentos Espaciais

Entre as operações definidas na OGC-SFS [7], existe um conjunto que merece uma atenção especial: os operadores topológicos. Esses operadores são amplamente utilizados na construção de consultas espaciais envolvendo o relacionamento espacial entre objetos geográficos.

Suponha dois conjuntos de dados, um representando os limites municipais (Tabela 1.4a) e outro os focos de queimadas na vegetação (Tabela 1.4b). Para relacionar os focos de queimadas aos municípios, precisamos ser capazes de estabelecer um relacionamento espacial entre as geometrias dos municípios e as geometrias dos focos.

Tabela 1.4 - Relacionamento espacial entre dois conjuntos de dados.

( a ) Municípios Brasileiros

( b ) Focos de Queimadas na Vegetação

fig:sql:postgis-geometry:municipios

fig:sql:postgis-geometry:focos

Todos os sistemas baseados em SQL suportam um conjunto com pelo menos 08 operadores: Equals, Touches, Crosses, Within, Contains, Overlaps, Disjoint, e Intersects.

1. O relacionamento espacial ST_Equals permite saber se duas geometrias A e B são toplogicamente iguais.

fig:sql:postgis-geometry:st-equals

SELECT ST_Equals(
           ST_GeomFromText( 'POLYGON( (1 2, 1 4, 3 4, 3 2, 1 2) )' ),
           ST_GeomFromText( 'POLYGON( (1 2, 1 3, 1 4, 2 4, 3 4, 3 3, 3 2, 2 2, 1 2) )' )
       );

2. O relacionamento espacial ST_Touches diz se duas geometrias se tocam.

fig:sql:postgis-geometry:st-touches

SELECT ST_Touches(
           ST_GeomFromText( 'POLYGON( (1 2, 1 4, 3 4, 3 2, 1 2) )' ),
           ST_GeomFromText( 'POLYGON( (3 1, 3 3, 5 3, 5 1, 3 1) )' )
       );

3. O relacionamento espacial ST_Crosses diz se duas geometrias se cruzam.

fig:sql:postgis-geometry:st-crosses

SELECT ST_Crosses(
           ST_GeomFromText( 'POLYGON( (1 2, 1 4, 3 4, 3 2, 1 2) )' ),
           ST_GeomFromText( 'LINESTRING( 2 3, 4 3, 5 1 )' )
       );

4. O relacionamento espacial ST_Within diz se a geometria A encontra-se dentro da geometria B.

fig:sql:postgis-geometry:st-within

SELECT ST_Within(
           ST_GeomFromText( 'POLYGON( (2 2, 2 3, 3 3, 3 2, 2 2) )' ),
           ST_GeomFromText( 'POLYGON( (1 1, 1 4, 5 4, 5 1, 1 1) )' )
       );
SELECT ST_Within(
           ST_GeomFromText( 'POLYGON( (4 2, 4 3, 5 3, 5 2, 4 2) )' ),
           ST_GeomFromText( 'POLYGON( (1 1, 1 4, 5 4, 5 1, 1 1) )' )
       );

5. O relacionamento espacial ST_Contains diz se a geometria A contém a geometria B.

6. O relacionamento espacial ST_Overlaps diz se duas geometrias se sobrepõem.

fig:sql:postgis-geometry:st-overlaps

SELECT ST_Overlaps(
           ST_GeomFromText( 'POLYGON( (1 2, 1 4, 3 4, 3 2, 1 2) )' ),
           ST_GeomFromText( 'POLYGON( (2 1, 2 3, 4 3, 4 1, 2 1) )' )
       );

7. O relacionamento espacial ST_Disjoint diz se duas geometrias são disjuntas, isto é, se elas não possuem nenhuma interação espacial.

8. O relacionamento espacial ST_Intersects diz se a geometria A possui algum tipo de interação espacial com a geometria B.

Nota

Os operadores topológicos são definidos com base no formalismo matemático conhecido como Matriz de 9-Intersecções Estendida Dimensionalmente (DE-9IM) [14].