União em SIG: escolher corretamente entre sobreposição, fusão, união unária e dissolução

Comprendre les différentes formes d’union en SIG

Entendendo as diferentes formas de união em SIG

A união espacial é uma das operações fundamentais em geomática. Ela permite combinar várias camadas ou entidades para produzir novas geometrias ou enriquecer os atributos. No entanto, por trás desse termo aparentemente simples, escondem-se várias variantes, dependendo da ferramenta ou biblioteca utilizada.

Neste artigo, vamos detalhar:

  • os principais tipos de união (ST_Union, Union, União espacial do ArcGIS, etc.)
  • suas diferenças conceituais e práticas
  • exemplos de implementação em SQL (PostGIS) e Python (QGIS/Processing).



Por que isso costuma ser confuso?

A palavra união abrange várias operações diferentes, dependendo da ferramenta utilizada:

  • União (overlay) como no QGIS/ArcGIS: recorte + concatenação de atributos.
  • ST_Union (PostGIS): fusão geométrica (dissolução global ou por grupo).
  • ST_UnaryUnion (PostGIS): fusão topológica rápida/robusta (preservação da topologia).
  • Dissolve por atributo: agregar entidades que compartilham o mesmo valor.

Escolher bem a operação evita surpresas… e SQL XXL.


1) União (overlay) – a “verdadeira” união no estilo QGIS/ArcGIS

O que ela faz

  • Mantém todas as partes geométricas resultantes das sobreposições e não sobreposições.
  • Concatena os atributos das duas camadas (com NULL no lado ausente).
  • Ideal para análises multicritério (zonas que se sobrepõem parcialmente).

A ter em conta

  • Trata-se de uma operação de sobreposição e não de uma fusão de geometrias.
  • O resultado pode conter vários objetos (cada intersecção cria fragmentos).

Exemplo em Python (QGIS Processing)

import processing
from qgis.core import QgsProject

# Deux couches chargées dans QGIS (QgsVectorLayer) : layer_a, layer_b
result = processing.run("qgis:union", {
    "INPUT": layer_a,
    "OVERLAY": layer_b,
    "OUTPUT": "memory:"  # ou un GPKG/PG
})

union_layer = result["OUTPUT"]
QgsProject.instance().addMapLayer(union_layer)

Exemplo em PostGIS (modelo SQL «overlay union»)

Versão compacta sem atributos (apenas o ID dos pares + geometria).

WITH pairs AS (
  SELECT a.gid AS ida, b.gid AS idb, ST_Intersection(a.geom, b.geom) AS geom
  FROM plugin.communes a
  JOIN plugin.logements b ON ST_Intersects(a.geom, b.geom)
  WHERE NOT ST_IsEmpty(ST_Intersection(a.geom, b.geom))
),
inter_union AS (
  SELECT ST_UnaryUnion(geom) AS geom FROM pairs
),
a_only AS (
  SELECT a.gid AS ida, NULL::integer AS idb,
         ST_Difference(a.geom, (SELECT geom FROM inter_union)) AS geom
  FROM plugin.communes a
  WHERE NOT ST_IsEmpty(ST_Difference(a.geom, (SELECT geom FROM inter_union)))
),
b_only AS (
  SELECT NULL::integer AS ida, b.gid AS idb,
         ST_Difference(b.geom, (SELECT geom FROM inter_union)) AS geom
  FROM plugin.logements b
  WHERE NOT ST_IsEmpty(ST_Difference(b.geom, (SELECT geom FROM inter_union)))
)
SELECT * FROM pairs
UNION ALL
SELECT * FROM a_only
UNION ALL
SELECT * FROM b_only;


2) ST_Union: fusão geométrica (dissolução global)

Funcionamento

  • Funde um conjunto de geometrias em uma única (Multi*) sem manter os atributos.
  • Por padrão, gerencia a topologia, mas ST_UnaryUnion é geralmente mais robusto/rápido.

Quando usar

  • Para dissolver polígonos contíguos (por exemplo, criar a área total).
  • Para pré-agregar antes de um buffer ou cálculo de área.

Exemplo em SQL: fundir duas tabelas em uma única geometria.

CREATE TABLE plugin.emprise_globale AS
SELECT ST_UnaryUnion(geom) AS geom
FROM (
  SELECT geom FROM plugin.communes
  UNION ALL
  SELECT geom FROM plugin.logements
) s;

Exemplo em Python (psycopg2)

import psycopg2
conn = psycopg2.connect("dbname=... user=... password=... host=... port=...")
cur = conn.cursor()
cur.execute("""
  DROP TABLE IF EXISTS plugin.emprise_globale;
  CREATE TABLE plugin.emprise_globale AS
  SELECT ST_UnaryUnion(geom) AS geom
  FROM (
    SELECT geom FROM plugin.communes
    UNION ALL
    SELECT geom FROM plugin.logements
  ) s;
""")
conn.commit()
cur.close()
conn.close()


3) ST_UnaryUnion – fusão topológica (mais robusta)

O que faz

  • Como ST_Union, mas preservando a topologia e geralmente mais rápido.
  • Corrija melhor as sobreposições múltiplas, anéis compartilhados e pequenos erros de topologia.

Quando usar

  • Sempre para camadas grandes ou com geometrias imperfeitas.
  • Como bloco dentro de outras consultas (por exemplo, overlay union).

Exemplo em Python (GeoPandas)

import geopandas as gpd

gdf = gpd.read_file("commun.es.gpkg")
geom_unary = gdf.unary_union  # équivalent à ST_UnaryUnion
# -> geom_unary est un (Multi)Polygon shapely


4) Dissolver por atributo (ST_Union + GROUP BY)

O que faz

  • Agrupa as entidades por uma chave e funde a geometria dentro de cada grupo.
  • Os atributos não são agregados automaticamente (exceto a chave) → adicione seus agregados.

Exemplo SQL: dissolver os municípios por EPCI

CREATE TABLE plugin.communes_par_epci AS
SELECT epci,
       ST_UnaryUnion(geom) AS geom
FROM plugin.communes
GROUP BY epci;

Exemplo Python (QGIS Processing – Dissolve)

import processing

res = processing.run("native:dissolve", {
    "INPUT": layer_communes,
    "FIELD": ["epci"],
    "SEPARATE_DISJOINT": False,
    "OUTPUT": "memory:"
})
dissolved = res["OUTPUT"]


5) Bônus: GeoPandas – overlay(…, how=”union”)

O que faz

Equivalente à União overlay QGIS/ArcGIS no lado Python científico.

import geopandas as gpd

a = gpd.read_file("plugin_communes.gpkg")
b = gpd.read_file("plugin_logements.gpkg")

u = gpd.overlay(a, b, how="union")
u.to_file("union_overlay.gpkg")


Como escolher?

  • Quer manter os atributos das duas camadas + manter as áreas não sobrepostas?
    → União (overlay).
  • Quer uma única geometria mesclada (para uma área de influência, uma máscara)?
    → ST_UnaryUnion (ou ST_Union, se não houver outra opção).
  • Você deseja dissolver por uma chave (departamentos, EPCI…)?
    → GROUP BY + ST_UnaryUnion.
  • Você quer fazer tudo em Python QGIS sem SQL?
    → qgis:union (sobreposição) ou native:dissolve (dissolver por atributo).

Resumo comparativo

Tipo de união Natureza Atributos Resultado geométrico Exemplo de uso
ST_Union (PostGIS) Função geométrica Não (exceto GROUP BY) Fusão de polígonos Dissolver os municípios de uma região
UNION (QGIS/PostGIS overlay) Sobreposição Sim (todos mantidos) Recorte + combinação Cruzar municípios e habitações
Union (ArcGIS) Sobreposição Sim (todos mantidos) Partição completa Análise multicritério


Armadilhas e boas práticas

  • Atributos vs geometria: ST_Union não cola os atributos ⇒ sem sobreposição.
  • Tipos de atributos: em sobreposição SQL caseira, alinhe os tipos (ou converta em texto) antes de UNION ALL.
  • Topologia: prefira ST_UnaryUnion para conjuntos volumosos ou um pouco “sujos”.
  • SRID: certifique-se de que as duas camadas compartilham o mesmo SRID; caso contrário, reprojete antes.
  • Polígono vs Multi: force ST_Multi(…) se você precisar de um tipo homogêneo.


Resumo dos trechos de Python (para copiar e colar)

A) Overlay Union (QGIS)

import processing
from qgis.core import QgsProject

result = processing.run("qgis:union", {
    "INPUT": layer_a,
    "OVERLAY": layer_b,
    "OUTPUT": "memory:"
})
QgsProject.instance().addMapLayer(result["OUTPUT"])

B) Fusão global (PostGIS)

import psycopg2
conn = psycopg2.connect("dbname=... user=... password=... host=... port=...")
cur = conn.cursor()
cur.execute("""
  DROP TABLE IF EXISTS plugin.emprise_globale;
  CREATE TABLE plugin.emprise_globale AS
  SELECT ST_UnaryUnion(geom) AS geom
  FROM (
    SELECT geom FROM plugin.communes
    UNION ALL
    SELECT geom FROM plugin.logements
  ) s;
""")
conn.commit(); cur.close(); conn.close()

C) Dissolve por atributo (QGIS)

import processing

res = processing.run("native:dissolve", {
    "INPUT": layer_communes,
    "FIELD": ["epci"],
    "OUTPUT": "memory:"
})

D) Overlay Union (GeoPandas)

import geopandas as gpd
u = gpd.overlay(gpd.read_file("a.gpkg"), gpd.read_file("b.gpkg"), how="union")
u.to_file("union_overlay.gpkg")


Conclusão

O termo união abrange, na verdade, duas lógicas diferentes:

  • fusão geométrica (ST_Union, Dissolve) → para simplificar os contornos.
  • sobreposição com combinação de atributos (UNION, ArcGIS Union) → para análise multicritério.

A escolha depende, portanto, do objetivo: simplificar ou analisar.


Em um próximo artigo, poderemos explorar em detalhes o desempenho dessas diferentes abordagens, pois as uniões podem rapidamente se tornar dispendiosas em tempo de cálculo quando se manipula milhões de geometrias.


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 *