Saya memiliki tabel poligon PostGIS di mana beberapa berpotongan satu sama lain. Inilah yang saya coba lakukan:
- Untuk poligon tertentu yang dipilih oleh id, beri saya semua poligon yang berpotongan. Pada dasarnya,
select the_geom from the_table where ST_Intersects(the_geom, (select the_geom from the_table where source_id = '123'))
- Dari poligon-poligon ini, saya perlu membuat poligon baru sehingga persimpangan menjadi poligon baru. Jadi jika poligon A berpotongan dengan poligon B, saya akan mendapatkan 3 poligon baru: A minus AB, AB, dan B minus AB.
Ada ide?
postgis
polygon
intersection
atogle
sumber
sumber
Jawaban:
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]:
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:
Langkah 3 adalah membuat semua kemungkinan poligon yang tidak tumpang tindih yang dapat berasal dari semua baris tersebut, dilakukan oleh fungsi ST_Polygonize :
Anda bisa menyimpan output dari masing-masing langkah ke tabel temp, atau Anda bisa menggabungkan semuanya menjadi satu pernyataan:
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.
sumber
ST_ExteriorRing
setiap lubang jatuh.ST_Boundary
akan mempertahankan cincin interior, tetapi juga akan membuat poligon di dalamnya.Jika saya mengerti dengan benar, Anda ingin mengambil (A adalah geometri kiri, B adalah kanan):
Gambar dari A∪B http://img838.imageshack.us/img838/3996/intersectab1.png
Dan ekstrak:
A ∖ AB
Gambar dari A ∖ AB http://img830.imageshack.us/img830/273/intersectab2.png
AB
Gambar AB http://img828.imageshack.us/img828/7413/intersectab3.png
dan B ∖ AB
Gambar dari B ∖ AB http://img839.imageshack.us/img839/5458/intersectab4.png
Yaitu - tiga geometri yang berbeda untuk setiap pasangan berpotongan.
Pertama, mari kita buat tampilan semua geometri berpotongan. Dengan asumsi nama tabel Anda
polygons_table
, kami akan menggunakan:Sekarang kita memiliki pandangan (praktis, tabel read-only) yang menyimpan pasangan geom berpotongan, di mana masing-masing pasangan hanya muncul satu kali karena
t1.id<t2.id
kondisi tersebut.Sekarang mari kita kumpulkan persimpangan Anda -
A∖AB
,AB
danB∖AB
, gunakan SQLUNION
di ketiga kueri:Catatan:
&&
operator yang digunakan sebagai filter sebelumintersects
operator, untuk meningkatkan kinerja.VIEW
alih - alih satu permintaan raksasa; Ini hanya untuk kenyamanan.AB
adalah gabungan, bukan persimpangan, dariA
danB
- Gunakan ST_Union alih-alih st_intersection padaUNION
kueri di tempat yang sesuai.∖
tanda adalah tanda unicode untuk Set perbedaan; hapus dari kode jika membingungkan database Anda.sumber
Apa yang Anda gambarkan adalah cara kerja operator Union di ArcGIS, tetapi sedikit berbeda dari Union atau titik-temu di dunia GEOS. Manual Shapely memiliki contoh cara kerja set di GEOS . Namun, wiki PostGIS memang memiliki contoh yang baik menggunakan linework yang seharusnya bisa membantu Anda.
Atau, Anda dapat menghitung tiga hal:
Itu harus menjadi tiga poligon yang Anda sebutkan di poin kedua Anda.
sumber
Sesuatu seperti:
INSERT INTO new_table VALUES ((pilih id, the_geom dari old_table di mana st_intersects (the_geom, (pilih the_geom dari old_table di mana id = '123')) = true
EDIT: Anda membutuhkan persimpangan poligon yang sebenarnya.
Masukkan ke dalam nilai new_table ((pilih id, ST_Intersection (the_geom, (pilih the_geom dari yang lama di mana id = 123))
lihat apakah itu berhasil.
sumber