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.