1 votos

ST_Union en PostgreSQL y QGIS

Tengo un problema con la comprensión de la ST_Union (PostgreSQL) y la función de unión en QGIS. Básicamente, tengo como ejemplo dos capas A y B que se superponen. El resultado al usar la unión en QGIS es una sola capa con tres filas: A sin B, A y B, B sin A. Este es en principio el resultado que me gustaría tener. Debido a que las tablas son bastante grandes, me gustaría seleccionar algunas columnas y atributos, por lo que he creado una consulta en PostgreSQL. Siguiendo mi enfoque:

SELECT row_number() over (order by a.id desc) as gid, a.nsg as nsg, b.ffh as ffh, 
       ST_Union(a.geom,b.geom) as geom, st_area(St_union(a.geom,b.geom)) as area
FROM   p_gaiac.shape1 as a, p_gaiac.shape2 as b 

El resultado es una sola capa con una sola fila (atributos A y B). No soy capaz de obtener filas separadas con atributos separados como en QGIS. ¿Cuál es el problema?

3voto

David Harris Puntos 234

Ahora que tengo un par de minutos, puedo ampliar mi comentario anterior. ST_Union() en PostGIS y el Unión en QGIS hacen cosas diferentes, a pesar de los nombres similares. ST_Union() es similar a la herramienta Disolver en QGIS, ya que eliminará los límites de las características adyacentes y/o agrupará las características individuales con los mismos valores de atributos en características Multi*.

Creo que lo que está buscando es el ST_Intersection() de las geometrías superpuestas.

Para hacer las cosas más confusas, creo que querrás usar el operador de PostgreSQL UNION que añadirá las geometrías seleccionadas y otros atributos de las dos tablas en la misma columna.

Así que creo que la respuesta que buscas es algo así (actualizado para responder con más precisión a tu pregunta original y a tu comentario posterior):

WITH cte as (
SELECT nsg, NULL as ffh, ST_Area(geom) as area, geom 
FROM p_gaiac.shape1
UNION
SELECT NULL as nsg, ffh, ST_Area(geom) as area, geom 
FROM p_gaiac.shape2
UNION
SELECT nsg, ffh, area, geom 
FROM (SELECT nsg, ffh, ST_Area(ST_Intersection(a.geom, b.geom)) as area, 
      ST_Intersection(a.geom, b.geom) as geom
      FROM p_gaiac.shape1 as a 
      JOIN p_gaiac.shape2 as b ON ST_Intersects(a.geom, b.geom)) c
)

SELECT ROW_NUMBER () OVER () as new_id, nsg, ffh, area, geom
from cte; 

Al colocar la consulta principal dentro de un CTE A continuación, puede asignar un nuevo ID único a todo el conjunto, que le permitirá llevarlo a QGIS para visualizarlo. Colocando marcadores de posición NULL en las columnas para las que la tabla original no tiene, podrá entonces rellenar ambas columnas en la tercera sentencia select, que querrá para las áreas superpuestas. Puede ampliar esto para incluir más columnas de sus tablas originales según sea necesario, utilizando el marcador de posición NULL.

0voto

Brad Bierman Puntos 21

El código anterior dio lugar a dos zonas superpuestas. A continuación, he añadido una St_difference para eliminar las áreas superpuestas de las formas básicas. El resultado es ahora comparable a la unión en qgis.

WITH cte as (
SELECT nsg, NULL as ffh, St_difference(a.geom,b.geom) as geom, round(St_area(St_difference(a.geom,b.geom))/10000) as area
FROM p_gaiac.shape1 as a, p_gaiac.shape2 as b 
UNION
SELECT Null as nsg, ffh, St_difference(b.geom,a.geom) as geom, round(St_area(St_difference(b.geom,a.geom))/10000) as area
FROM p_gaiac.shape1 as a, p_gaiac.shape2 as b 
UNION
SELECT nsg, ffh, geom, area
FROM (SELECT nsg, ffh, round(ST_Area(ST_Intersection(a.geom, b.geom))/10000) as area, 
      ST_Intersection(a.geom, b.geom) as geom
      FROM p_gaiac.shape1 as a 
      JOIN p_gaiac.shape2 as b ON ST_Intersects(a.geom, b.geom)) c
)

SELECT ROW_NUMBER () OVER () as new_id, nsg, ffh, geom, area
from cte;

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X