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)
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
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.
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?