Postgis:table com várias geometrias

O particionamento de lista no PostgreSQL/PostGIS é um método de particionamento declarativo que permite dividir uma tabela grande em várias subtabelas, de acordo com os valores discretos de uma coluna (por exemplo: por região, tipo, ano etc.).

Isso é particularmente útil no GIS quando se deseja gerenciar grandes camadas (por exemplo, uma tabela com milhões de objetos geográficos divididos por país ou por tipo de área).

O que é particionamento de lista?

É uma técnica que :

  • Cria uma tabela principal (a tabela pai),
  • E várias partições (tabelas filhas), cada uma das quais contém linhas correspondentes a um valor específico em uma coluna.

Exemplos de uso em GIS:

  • Particionamento de uma tabela de edifícios por tipo (residencial, industrial, público etc.)
  • Particionar uma tabela de zonas por município ou ilha (Maurício, Rodrigues, etc.)
  • Particionar uma tabela de estradas por tipo de estrada (autoestrada, estrada, via verde etc.)

Benefícios

  • Consultas mais rápidas se a cláusula WHERE filtrar por tipo
  • Menos bloqueios de gravação
  • Manutenção mais fácil (você pode arquivar ou desanexar uma partição)
  • Pode ser combinado com gerenciamento de vácuo, índices locais, acionadores específicos da partição etc.

Limitações

  • A coluna da partição deve ser bem escolhida (valores discretos, não muitos)
  • Uma linha só pode entrar em uma partição
  • As restrições e os índices devem ser definidos em cada partição (a partir do PostgreSQL 13, alguns podem ser herdados)

E quanto aos diferentes tipos de geometria (ponto, linha, polígono)?

No PostGIS, você pode usar tabelas particionadas para armazenar diferentes tipos de geometria em partições separadas. O PostgreSQL oferece suporte ao particionamento de lista (LIST PARTITIONING), que é adequado para separar entidades geográficas de acordo com seu tipo (ponto, linha, polígono).

1. Criação da tabela principal

A tabela principal é uma tabela particionada com base no tipo de geometria.

creating the parent table

CREATE TABLE formation.objets_geographiques (

    id SERIAL,

    nom TEXT NOT NULL,

    geom GEOMETRY NOT NULL,

    type_geom TEXT NOT NULL,

    PRIMARY KEY (type_geom, id)  -- Ajout de type_geom dans la clé primaire

) PARTITION BY LIST (type_geom);

Aqui, a coluna type_geom é usada como chave de partição.

2. Criação de partições para cada tipo de geometria

São criadas partições específicas para cada tipo de geometria (POINT, LINESTRING, POLYGON).

criação de partição

CREATE TABLE formation.objets_points

PARTITION OF formation.objets_geographiques

FOR VALUES IN (‘POINT’);

CREATE TABLE formation.objets_lignes

PARTITION OF formation.objets_geographiques

FOR VALUES IN (‘LINESTRING’);

CREATE TABLE formation.objets_polygones

PARTITION OF formation.objets_geographiques

FOR VALUES IN (‘POLYGON’);

table partitionnée dans postgis

3. Adição de uma restrição de tipo de geometria

Para garantir que cada partição contenha apenas o tipo correto de geometria, adicionamos uma restrição CHECK.

add constraints

ALTER TABLE formation.objets_points ADD CONSTRAINT chk_geom_point

CHECK (GeometryType(geom) = ‘POINT’);

ALTER TABLE formation.objets_lignes ADD CONSTRAINT chk_geom_linestring

CHECK (GeometryType(geom) = ‘LINESTRING’);

ALTER TABLE formation.objets_polygones ADD CONSTRAINT chk_geom_polygon

CHECK (GeometryType(geom) = ‘POLYGON’);

4. Inserção de dados

Os dados serão automaticamente redirecionados para a partição correta, dependendo do valor type_geom.

data insertion

INSERT INTO formation.objets_geographiques (nom, geom, type_geom)

VALUES

    (‘École’, ST_GeomFromText(‘POINT(57.5 -20.2)’, 4326), ‘POINT’),

    (‘Route côtière’, ST_GeomFromText(‘LINESTRING(57.5 -20.2, 57.6 -20.3)’, 4326), ‘LINESTRING’),

    (‘Parc national’, ST_GeomFromText(‘POLYGON((57.5 -20.2, 57.6 -20.3, 57.7 -20.1, 57.5 -20.2))’, 4326), ‘POLYGON’);

5. Criação de índices em partições

Os índices GIST ou SP-GiST podem ser criados em cada partição para melhorar o desempenho das consultas espaciais.

criação de índice

CREATE INDEX idx_geom_points ON formation.objets_points USING GIST (geom);

CREATE INDEX idx_geom_lignes ON formation.objets_lignes USING GIST (geom);

CREATE INDEX idx_geom_polygones ON formation.objets_polygones USING GIST (geom);

Benefícios do particionamento no PostGIS

  • Melhora o desempenho das consultas espaciais, reduzindo o volume de dados analisados.
  • Facilita o gerenciamento e a organização de objetos geográficos.
  • Simplifica a manutenção (por exemplo, a exclusão de uma partição específica sem afetar as outras).

6. Consulta para recuperar um tipo específico

Se você quiser recuperar apenas polígonos, o PostgreSQL consulta diretamente a partição correta.

data query

SELECT * FROM formation.objets_geographiques WHERE type_geom = ‘POLYGON’;

Isso aumenta a eficiência das consultas, evitando a varredura de dados desnecessários.

Conclusão

O particionamento por tipo de geometria no PostGIS permite o gerenciamento eficiente de dados espaciais e, ao mesmo tempo, otimiza o desempenho da consulta e do armazenamento.

Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *