5 votos

Diferencia de PostGIS con Unión de geometría

Tengo dos SIG tablas, digamos a y B. me gustaría hacer la diferencia de a con B. Mientras que es bastante sencillo hacerlo con QGIS (el uso de geoprocesamiento->diferencia), tengo mucho más problemas para hacerlo con PostGis.

A continuación un ejemplo visual :

1/ Mis dos capas (en amarillo y naranja) enter image description here

2/ La diferencia (en rosa) entre mi capa amarilla y mi orange capa (con QGIS geoprocesamiento->diferencia). Sólo la parte de color naranja que no se intersectan con mi capa amarilla se mantienen enter image description here

Esta es mi consulta SQL :

SELECT  A.id, 
    ST_Union(
        COALESCE(
            ST_Difference(
                A.the_geom, 
                B.the_geom 
            ), 
            A.the_geom
        )
    ) As the_geom 
FROM A 
LEFT JOIN b ON ST_Intersects(A.the_geom, B.the_geom)
GROUP BY A.id;

Este enfoque casi trabajo, el único límite es cuando Un objeto cruza más de una B objeto. En este caso, la diferencia de la función no funciona en absoluto.

Como se puede ver en la siguiente imagen (diferencia en púrpura) la gran forma en el medio sigue siendo el mismo, en lugar de ser cortado por el amarillo dos geometrías.

enter image description here

Así que mi idea era hacer una geometría de la unión de la geometría a partir de B :

SELECT  A.id, 
    ST_Union(
        COALESCE(
            ST_Difference(
                A.the_geom, 
                ST_Union(B.the_geom) 
            ), 
            A.the_geom
        )
    ) As the_geom 
FROM A 
LEFT JOIN B ON ST_Intersects(A.the_geom, B.the_geom)
GROUP BY A.id;

Pero Postgresql se queja del hecho de que las funciones de agregado no pueden estar anidados.

¿Tiene alguna idea de cómo podría hacer la misma diferencia de QGIS proceso pero con PostGIS?

2voto

Jay Puntos 6

Creo que tu problema está relacionado con uso de ST_Union . Porque, si fuera, por el mismo A.id , terminas con la superposición de geometrías entonces ST_Union será combinarlos juntos, que no es lo queremos. Trate de usar ST_Collect en lugar de ST_Union .

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