Estoy buscando una función para disolver los límites compartidos entre las características de polígono en una tabla. ST_UNION () casi hace lo que estoy buscando, pero crea un multipolígono a partir de todos los polígonos en la capa, independientemente de si comparten un límite común o no. Prefiero solo disolver los límites entre los polígonos que se tocan. Pensé que debería haber alguna forma de usar ST_TOUCHES (), pero la necesidad de una función de disolución parece tan común que me sorprendería si no hay una función incorporada para lograr esto.
El caso de uso se ve así: descargué datos de Corine Landcover para un gran país europeo y quiero disolver los límites entre los diferentes tipos de bosques (aproximadamente 75,000 polígonos en una tabla). Intenté ST_UNION, pero me falla con un error de "falta de memoria" (30,000 polígonos sí funcionaron):
create table corine00 as
select st_union(the_geom) as the_geom,
sum(area_ha) as area_ha,
substr(code_00,1,2) as code_00
from clc00_c31_forests
group by substr(code_00,1,2)
Nota: Todos los códigos forestales comienzan con '31' y estoy usando PostGIS 1.4, versión GEOS: 3.2.0-CAPI-1.6.0
Creo que ST_Dump es lo que quieres:
ST_Dump :
Entonces para su caso:
No estoy seguro de cómo interactuará con la creación de la tabla que está intentando hacer, pero debería darle las geometrías como entradas separadas. Entonces podría hacer una unión espacial (usando && y ST_Contains) entre las dos tablas para recopilar los datos en las geometrías.
fuente
¿Su PostGIS está compilado contra GEOS 3.1.0+? Para esa versión, se implementó una unión en cascada mucho más rápida , pero si no se encuentra, se usará el código anterior, que es mucho más lento.
Actualización : parece que su PostGIS está utilizando el enfoque de unión en cascada, pero el hambre de memoria es real. Intentaría aumentar la memoria disponible para su instancia de Postgres, aquí hay algunos consejos de la charla PostGIS FOSS4G 2007 de Paul Ramsey :
shared_buffers
work_mem
maintenance_work_mem
wal_buffers
checkpoint_segments
random_page_cost
En su caso, trataría de aumentar
shared_buffers
, la recomendación general es el 25% de su memoria disponible para un servidor de base de datos, pero intente aumentarlo a 3-4x su valor actual y ver si se completa.fuente