Unión en SIG: elegir correctamente entre superposición, fusión, unión unaria y disolución

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.

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é !

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *