Tengo una geometría multipolígono en la que la geometría del polígono está dispersa. Quiero excluir la geometría que no forma parte de la gran geometría. Por ejemplo, la imagen de abajo es una región con uno de los polígonos demasiado lejos. Quiero excluir ese polígono basado en el búfer. ¿Qué función podría usarse para hacerlo?
Tienes que ST_Dump el MultiPolygon e iterar sobre el conjunto de resultados para filtrar los polígonos que no se cruzan con una geometría dada, por ejemplo
SELECT * FROM (SELECT (ST_Dump(geom)).* FROM mytable) t WHERE ST_Contains('YOUR BUFFER GOES HERE',t.geom); Demostración: db<>fiddle
CREATE TABLE t (gid int, geom geometry(multipolygon,4326)); INSERT INTO t VALUES (1,'SRID=4326;MULTIPOLYGON(((30 20,45 40,10 40,30 20)),((15 5,40 10,10 20,5 10,15 5)),((-24.78 25.47,-19.14 22.38,-26.35 19.86,-24.78 25.47)))'::geometry);MultiPolygon . Lo puse en la imagen solo con fines ilustrativos. La siguiente consulta descarga el MultiPolygon , verifica si cada Polygon se cruza con el polígono/búfer dado y crea un nuevo MultiPolygon o un Polygon , en caso de que solo quede una geometría:
SELECT gid, ST_AsText(ST_Union(geom)) FROM (SELECT gid,(ST_Dump(geom)).* FROM t) j WHERE ST_Contains('SRID=4326;POLYGON((0 44.58,52.38 45.02,52.99 2.46,1.23 0,0 44.58))',j.geom) GROUP BY gid; gid | st_astext -----+-------------------------------------------------------------------------- 1 | MULTIPOLYGON(((15 5,5 10,10 20,40 10,15 5)),((30 20,10 40,45 40,30 20))) (1 Zeile)Otras lecturas: