5.3. Centróides e Pontos dentro Superfície

5.3.1. Centróide

O operador ST_Centroid computa o centróide de uma geometria, isto é, o seu centro de massa. No caso de conjuntos de pontos (MultiPoint), o centróide é calculado como sendo a média aritmética das coordenadas desses pontos. No caso de conjuntos de linhas (MultiLineString), o centróide é calculado como a média ponderada pelo comprimento dos segmentos das linhas. No caso de polígonos (Polygon ou MultiPolygon), a computação do centróide é feita através de uma fórmula que considera a área do polígono:

\[C_x = \frac{1}{6A} \sum_{i=0}^{n-1}(x_i+x_{i+1})(x_iy_{i+1} - y_ix_{i+1})\]
\[C_y = \frac{1}{6A} \sum_{i=0}^{n-1}(y_i+y_{i+1})(x_iy_{i+1} - y_ix_{i+1})\]

onde, \(A\) corresponde a área com sinal do polígono (Seção 5.2), isto é:

\[A = \frac{1}{2} \sum_{i=0}^{n-1}(x_iy_{i+1} - y_ix_{i+1})\]

Pelas fórmulas apresentadas, podemos concluir que o algoritmo para cálculo do centróide de um polígono é \(O(n)\), onde \(n\) corresponde ao número de vértices dos anéis do polígono.

Vamos ilustrar o uso da função ST_Centroid para criação do centróide de três municípios da tabela municipios (Seção 3.5.4):

CREATE TABLE municipio_centroide AS

    SELECT gid, geocodigo, nome, ST_Centroid(geom)::geometry(point, 4674) AS geom

      FROM municipios

     WHERE geocodigo IN ( '1600303', '3107307', '3146107' );

As Figuras 5.1, 5.2 e 5.3 apresentam os centróides dos municípios de Macapá no Amapá (geocodigo = 1600303), Bocaiúva (geocodigo = 3107307) e Ouro Preto (geocodigo = 3146107) em Minas Gerais. Repare que o centróide não necessariamente será um ponto localizado no interior do polígono, como mostrado nas Figuras 5.1 e 5.2.

Centróide do município de Macapá no Amapá

Figura 5.1 - Centróide do município de Macapá no Amapá


Centróide do município de Bocaiúva em Minas Gerais

Figura 5.2 - Centróide do município de Bocaiúva em Minas Gerais


Centróide do município de Ouro Preto em Minas Gerais

Figura 5.3 - Centróide do município de Ouro Preto em Minas Gerais

5.3.2. Ponto sobre a Superfície

Enquanto a função ST_Centroid pode computar um ponto que não seja localizado no interior do polígono de entrada, existe uma função chamada ST_PointOnSurface que garante a geração de um ponto no interior do polígono de entrada. Vamos ilustrar o uso dessa função com os mesmos polígonos de municípios da seção anterior:

CREATE TABLE municipio_ponto_interior AS

    SELECT gid, geocodigo, nome, ST_PointOnSurface(geom)::geometry(point, 4674) AS geom

      FROM municipios

     WHERE geocodigo IN ( '1600303', '3107307', '3146107' );

As Figuras 5.4, 5.5 e 5.6 apresentam em vermelho os centróides e em amarelo os pontos calculados pela função ST_PointOnSurface para os municípios de Macapá no Amapá (geocodigo = 1600303), Bocaiúva (geocodigo = 3107307) e Ouro Preto (geocodigo = 3146107) em Minas Gerais.

ST_PointOnSurface x ST_Centroid para o polígono do município de Macapá

Figura 5.4 - ST_PointOnSurface x ST_Centroid para o polígono do município de Macapá


ST_PointOnSurface x ST_Centroid para o polígono do município de Bocaiúva

Figura 5.5 - ST_PointOnSurface x ST_Centroid para o polígono do município de Bocaiúva


ST_PointOnSurface x ST_Centroid para o polígono do município de Ouro Preto

Figura 5.6 - ST_PointOnSurface x ST_Centroid para o polígono do município de Ouro Preto