Saya memiliki tabel jalan yang saya pilih berdasarkan seperangkat atribut (katakanlah itu speed_limit < 25
). Ada kelompok jalan yang berdekatan secara lokal; Saya ingin mengelompokkan kumpulan linestrings yang terhubung ini ke GeometryCollections. Pada gambar di bawah ini, akan ada dua GeometryCollections: satu dengan garis merah dan satu dengan garis biru.
Saya mencoba menjalankan beberapa kueri "bubar, lepas landas" di sepanjang baris:
SELECT (ST_Dump(st_union)).geom
FROM
(SELECT ST_Union(geom) FROM roads) sq
Dengan semua yang telah saya coba, saya berakhir dengan fitur tunggal ( ST_Union
) atau geometri asli saya ( ST_Dump
of ST_Union
).
Mungkin ini mungkin dilakukan dengan semacam WITH RECURSIVE
sihir?
Jawaban:
Jadi, dengan contoh. Berikut adalah tabel sederhana dengan dua kelompok tepi yang terhubung:
Sekarang, inilah fungsi rekursif yang, mengingat id tepi, mengakumulasikan semua tepi yang menyentuh:
Itu hanya membuat kita perlu menemukan, setelah setiap kelompok diakumulasikan, id dari edge yang belum menjadi bagian dari grup. Yang, tragisnya, membutuhkan permintaan rekursif kedua.
Yang diambil bersama-sama mengembalikan satu set yang bagus dengan id benih dan masing-masing kelompok akumulasi. Saya meninggalkannya sebagai latihan untuk pembaca untuk mengubah array id kembali menjadi permintaan untuk membuat geometri untuk pemetaan.
sumber
grouplist
berbagai:insert into lines (id, geom) values ( 15, 'LINESTRING(0 0, 10 10)');
. Mengubaharray_agg(id)
fungsi kembali kearray_agg(DISTINCT id)
tampaknya menyelesaikan masalah.Berikut adalah pendekatan yang menggunakan tabel sementara untuk secara bertahap mengumpulkan kelompok bersama-sama. Saya tidak terlalu peduli dengan pendekatan tabel sementara, tetapi ini tampaknya berkinerja cukup baik karena jumlah baris meningkat (saya memiliki 1,2 baris M dalam input saya).
sumber
ST_ClusterIntersecting
fungsinya di PostGIS. Jika data Anda cukup kecil untuk masuk ke dalam memori, saya sarankan memeriksa itu untuk solusi yang lebih berkinerja.