Comprender las diferentes formas de unión en SIG
La unión espacial es una de las operaciones fundamentales en geomática. Permite combinar varias capas o entidades para producir nuevas geometrías o enriquecer los atributos. Sin embargo, detrás de este término aparentemente sencillo se esconden varias variantes según la herramienta o la biblioteca utilizada.
En este artículo, detallaremos:
- los principales tipos de unión (ST_Union, Union, Unión espacial de ArcGIS, etc.)
- sus diferencias conceptuales y prácticas
- ejemplos de implementación en SQL (PostGIS) y Python (QGIS/Processing).
¿Por qué suele ser confuso?
La palabra unión abarca varias operaciones diferentes según la herramienta utilizada:
- Unión (superposición) como en QGIS/ArcGIS: recorte + concatenación de atributos.
- ST_Union (PostGIS): fusión geométrica (disolución global o por grupos).
- ST_UnaryUnion (PostGIS): fusión topológica rápida/robusta (que conserva la topología).
- Disolución por atributo: agregar entidades que comparten el mismo valor.
Elegir bien la operación evita sorpresas… y SQL XXL.
1) Unión (superposición): la «verdadera» unión al estilo QGIS/ArcGIS.
Qué hace
- Conserva todas las piezas geométricas resultantes de las superposiciones y las no superposiciones.
- Concatena los atributos de las dos capas (con NULL en el lado que falta).
- Ideal para análisis multicriterio (zonas que se solapan parcialmente).
A tener en cuenta
- Se trata de una operación de superposición, no de una fusión de geometrías.
- El resultado puede contener numerosos objetos (cada intersección crea fragmentos).
Ejemplo en 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)
Ejemplo en PostGIS (modelo SQL «overlay union»)
Versión compacta sin atributos (solo el ID de los pares + geometría).
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: fusión geométrica (disolución global)
Funcionamiento
- Fusiona un conjunto de geometrías en una sola (Multi*) sin conservar los atributos.
- Por defecto, gestiona la topología, pero ST_UnaryUnion suele ser más robusto/rápido.
Cuándo utilizarlo
- Para disolver polígonos contiguos (por ejemplo, crear la superficie total).
- Para preagregar antes de un búfer o un cálculo de superficie.
Ejemplo en SQL: fusionar dos tablas en una sola geometría
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;
Ejemplo en 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: fusión topológica (más robusta)
Qué hace
- Igual que ST_Union, pero conserva la topología y suele ser más rápido.
- Corrige mejor las superposiciones múltiples, los anillos compartidos y los pequeños errores de topología.
Cuándo utilizarlo
- Siempre para capas grandes o con geometrías imperfectas.
- Como bloque dentro de otras consultas (por ejemplo, unión de superposiciones).
Ejemplo en 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) Disolver por atributo (ST_Union + GROUP BY)
Qué hace
- Agrupa las entidades por una clave y fusiona la geometría dentro de cada grupo.
- Los atributos no se agregan automáticamente (excepto la clave) → añada sus agregados.
Ejemplo SQL: disolver los municipios por epci.
CREATE TABLE plugin.communes_par_epci AS
SELECT epci,
ST_UnaryUnion(geom) AS geom
FROM plugin.communes
GROUP BY epci;
Ejemplo 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) Bonus: GeoPandas – overlay(…, how=»union»)
Qué hace
Equivalente a la unión overlay QGIS/ArcGIS en 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")
¿Cómo elegir?
- ¿Quiere conservar los atributos de las dos capas + mantener las zonas no superpuestas?
→ Unión (superposición). - ¿Quiere una única geometría fusionada (para un derecho de paso, una máscara)?
→ ST_UnaryUnion (o ST_Union en su defecto). - ¿Quiere disolver por una clave (departamentos, EPCI…)?
→ GROUP BY + ST_UnaryUnion. - ¿Quiere hacerlo todo en Python QGIS sin SQL?
→ qgis:union (superposición) o native:dissolve (disolución por atributo).
Resumen comparativo
Tipo de unión | Naturaleza | Atributos | Resultado geométrico | Ejemplo de uso |
---|---|---|---|---|
ST_Union (PostGIS) |
Función geométrica | No (excepto GROUP BY) | Fusión de polígonos | Disolver los municipios de una región |
UNION (QGIS/PostGIS overlay) |
Superposición | Sí (todos conservados) | Recorte + combinación | Cruzar municipios y viviendas |
Union (ArcGIS) |
Superposición | Sí (todos conservados) | Partición completa | Análisis multicriterio |
Trampas y buenas prácticas
Atributos frente a geometría: ST_Union no pega los atributos ⇒ no hay superposición.
- Tipos de atributos: en superposición SQL casera, alinea los tipos (o convierte a texto) antes de UNION ALL.
- Topología: prefiere ST_UnaryUnion para conjuntos voluminosos o un poco «sucios».
- SRID: asegúrate de que ambas capas comparten el mismo SRID; si no es así, reproyecta antes.
- Polígono vs Multi: fuerza ST_Multi(…) si necesitas un tipo homogéneo.
Resumen de fragmentos de Python (para copiar y pegar)
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) Fusión 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) Disolución 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")
Conclusión
El término unión abarca en realidad dos lógicas diferentes:
- fusión geométrica (ST_Union, Dissolve) → para simplificar los contornos.
- superposición con combinación de atributos (UNION, ArcGIS Union) → para el análisis multicriterio.
La elección depende, por tanto, del objetivo: simplificar o analizar.
En un próximo artículo, podremos explorar en detalle el rendimiento de estos diferentes enfoques, ya que las uniones pueden llegar a ser muy costosas en tiempo de cálculo cuando se manipulan millones de geometrías.