Saya mencari fungsi untuk melarutkan batas bersama antara fitur poligon dalam sebuah tabel. ST_UNION () hampir melakukan apa yang saya cari, tetapi ini menciptakan multipolygon dari semua poligon di lapisan terlepas dari apakah mereka berbagi batas bersama atau tidak. Saya lebih suka hanya melarutkan batas antara poligon yang saling menyentuh. Saya pikir, harus ada beberapa cara menggunakan ST_TOUCHES () tetapi kemudian kebutuhan untuk fungsi larut tampaknya sangat umum sehingga saya akan terkejut jika tidak ada fungsi bawaan untuk mencapai ini.
Kasus penggunaannya terlihat seperti ini: Saya mengunduh data Corine Landcover untuk negara besar di Eropa dan saya ingin membubarkan batas antara berbagai jenis hutan (sekitar 75.000 poligon dalam satu tabel). Saya mencoba ST_UNION, tetapi gagal dengan kesalahan "kehabisan memori" (30.000 poligon berhasil):
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)
Catatan: Semua kode hutan dimulai dengan '31' dan saya menggunakan PostGIS 1.4, versi GEOS: 3.2.0-CAPI-1.6.0
Saya yakin ST_Dump adalah yang Anda inginkan:
ST_Dump :
Jadi untuk kasus Anda:
Saya tidak yakin bagaimana ini akan berinteraksi dengan pembuatan tabel yang Anda coba lakukan, tetapi itu akan memberi Anda geometri sebagai entri yang terpisah. Anda kemudian dapat melakukan gabungan spasial (menggunakan && dan ST_Contains) antara dua tabel untuk mengumpulkan data ke dalam geometri.
sumber
Apakah PostGIS Anda dikompilasi dengan GEOS 3.1.0+? Untuk versi itu, penyatuan kaskade jauh lebih cepat diterapkan, tetapi jika tidak ditemukan akan menggunakan kode yang lebih lama yang perintah besarnya lebih lambat.
Pembaruan : sepertinya PostGIS Anda menggunakan pendekatan cascaded union, tetapi kelaparan memori itu nyata. Saya akan mencoba meningkatkan memori yang tersedia untuk contoh Postgres Anda, berikut adalah beberapa saran dari pembicaraan FOSS4G PostGIS Paul Ramsey 2007 :
shared_buffers
work_mem
maintenance_work_mem
wal_buffers
checkpoint_segments
random_page_cost
Dalam kasus Anda, saya akan mencoba meningkatkan
shared_buffers
, rekomendasi umum adalah 25% dari memori Anda yang tersedia untuk server database, tetapi cobalah meningkatkannya menjadi 3-4x nilai saat ini dan melihat apakah itu selesai.sumber