Estou procurando uma função para dissolver limites compartilhados entre recursos de polígono em uma tabela. ST_UNION () quase faz o que estou procurando, mas cria um multipolígono a partir de todos os polígonos da camada, independentemente de compartilharem ou não um limite comum. Prefiro apenas dissolver limites entre polígonos que se tocam. Imaginei que deveria haver alguma maneira de usar ST_TOUCHES (), mas a necessidade de uma função dissolver parece tão comum que ficaria surpreso se não houvesse uma função interna para conseguir isso.
O caso de uso é o seguinte: baixei os dados do Corine Landcover para um grande país europeu e quero dissolver os limites entre os diferentes tipos de floresta (aproximadamente 75.000 polígonos em uma tabela). Eu tentei ST_UNION, mas ele me falha com um erro de "falta de memória" (30.000 polígonos funcionaram):
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 os códigos de floresta começam com '31' e estou usando o PostGIS 1.4, versão GEOS: 3.2.0-CAPI-1.6.0
Acredito que ST_Dump é o que você deseja:
ST_Dump :
Então, para o seu caso:
Não tenho certeza de como ele irá interagir com a criação da tabela que você está tentando fazer, mas deve fornecer as geometrias como entradas separadas. Você seria capaz de fazer uma junção espacial (usando && e ST_Contains) entre as duas tabelas para coletar os dados nas geometrias.
fonte
Seu PostGIS é compilado com o GEOS 3.1.0+? Para essa versão, uma união em cascata muito mais rápida foi implementada, mas se não for encontrada, usará o código mais antigo, que é de ordem de magnitude mais lenta.
Atualização : parece que seu PostGIS está usando a abordagem de união em cascata, mas a falta de memória é real. Eu tentaria aumentar a memória disponível para sua instância do Postgres, eis alguns conselhos da palestra de Paul Ramsey em 2007 sobre o FOSS4G PostGIS :
shared_buffers
work_mem
maintenance_work_mem
wal_buffers
checkpoint_segments
random_page_cost
No seu caso, eu tentaria aumentar
shared_buffers
, a recomendação geral é de 25% da memória disponível para um servidor de banco de dados, mas tente aumentá-lo para 3-4x seu valor atual e ver se ele é concluído.fonte