Karena Anda mengatakan Anda mendapatkan sekelompok poligon berpotongan untuk setiap poligon yang Anda minati, Anda mungkin ingin membuat apa yang disebut sebagai "hamparan poligon".
Ini bukan apa yang dilakukan solusi Adam. Untuk melihat perbedaannya, lihat gambar persimpangan ABC ini:
Saya percaya solusi Adam akan menciptakan poligon "AB" yang mencakup area "AB! C" dan "ABC", serta poligon "AC" yang mencakup "AC! B" dan "ABC", dan sebuah " BC "polygon yaitu" BC! A "dan" ABC ". Jadi poligon output "AB", "AC", dan "BC" akan tumpang tindih dengan area "ABC".
Hamparan poligon menghasilkan poligon yang tidak tumpang tindih, sehingga AB! C akan menjadi satu poligon dan ABC akan menjadi satu poligon.
Membuat overlay poligon di PostGIS sebenarnya cukup mudah.
Pada dasarnya ada tiga langkah.
Langkah 1 adalah mengekstrak garis [Perhatikan bahwa saya menggunakan cincin eksterior poligon, itu menjadi sedikit lebih rumit jika Anda ingin menangani lubang dengan benar]:
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
Langkah 2 adalah "simpul" garis (menghasilkan simpul di setiap persimpangan). Beberapa perpustakaan seperti JTS memiliki kelas "Noder" yang dapat Anda gunakan untuk melakukan ini, tetapi di PostGIS fungsi ST_Union melakukannya untuk Anda:
SELECT ST_Union(the_geom) AS the_geom FROM (...your lines...) AS noded_lines
Langkah 3 adalah membuat semua kemungkinan poligon yang tidak tumpang tindih yang dapat berasal dari semua baris tersebut, dilakukan oleh fungsi ST_Polygonize :
SELECT ST_Polygonize(the_geom) AS the_geom FROM (...your noded lines...)
Anda bisa menyimpan output dari masing-masing langkah ke tabel temp, atau Anda bisa menggabungkan semuanya menjadi satu pernyataan:
CREATE TABLE my_poly_overlay AS
SELECT geom FROM ST_Dump((
SELECT ST_Polygonize(the_geom) AS the_geom FROM (
SELECT ST_Union(the_geom) AS the_geom FROM (
SELECT ST_ExteriorRing(polygon_col) AS the_geom FROM my_table) AS lines
) AS noded_lines
)
)
Saya menggunakan ST_Dump karena output dari ST_Polygonize adalah kumpulan geometri, dan (biasanya) lebih nyaman untuk memiliki tabel di mana setiap baris adalah salah satu poligon yang membentuk lapisan poligon.