Saya memiliki satu set poligon yang mewakili area yang luas, katakanlah lingkungan kota. Saya ingin mengidentifikasi area besar yang tumpang tindih di antara mereka.
Tapi ada masalah: kadang-kadang poligon ini akan tumpang tindih di sepanjang perimeter mereka (karena mereka digambar dengan sedikit presisi). Ini akan menghasilkan tumpang tindih yang panjang dan sempit yang tidak saya pedulikan.
Tetapi di lain waktu akan ada tumpang tindih besar poligon kuat, yang berarti area besar di mana poligon lingkungan saling tumpang tindih. Saya hanya ingin memilih ini.
Lihat gambar di bawah ini hanya tumpang tindih. Bayangkan saya hanya ingin memilih poligon biru di sudut kiri bawah.
Saya bisa melihat daerah, tetapi kadang-kadang yang sempit begitu lama mereka akhirnya memiliki area sebesar poligon biru. Saya sudah mencoba melakukan rasio area / perimeter, tetapi itu juga menghasilkan hasil yang beragam.
Saya bahkan sudah mencoba menggunakan ST_MinimumClearance
, tetapi kadang-kadang area yang luas akan memiliki bagian sempit yang melekat padanya, atau dua simpul yang sangat dekat.
Adakah ide pendekatan lain?
Pada akhirnya apa yang paling berhasil bagi saya adalah menggunakan buffer negatif, seperti yang disarankan oleh @Cyril dan @FGreg di bawah ini.
Saya menggunakan sesuatu seperti:
ST_Area(ST_Buffer(geom, -10)) as neg_buffer_area
Dalam kasus saya, unit adalah meter, jadi 10 m buffer negatif.
Untuk poligon sempit, area ini mengembalikan nol (juga, geometri akan kosong). Lalu saya menggunakan kolom ini untuk menyaring poligon yang sempit.
Jawaban:
Saya akan mencoba membuat buffer negatif, jika ia makan poligon tipis, maka itu baik, jika tidak memakan poligon, maka itu adalah milikku ... :-)
jalankan skrip ini, setelah sebelumnya menetapkan 2/3 dari lebar poligon linier ...
OS: -) ...
sumber
ST_Area(ST_Buffer(geom, -10))
, -10 yang -10 meter dalam kasus saya. Jika ada yang mengembalikan 0 dari ekspresi itu maka saya bisa memfilternya.Alih-alih area / perimeter, lebih baik menggunakan area yang dibagi dengan kuadrat perimeter (atau kebalikannya).
Ini juga disebut "indeks bentuk". Kuadrat perimeter dibagi dengan area memiliki nilai minimum 4 * Pi () (dalam kasus disk, yang merupakan geometri 2D paling kompak), sehingga dapat dinormalisasi dengan 4 * Pi () untuk memudahkan interpretasi (nilai dinormalisasi mendekati 1 maka berarti Anda memiliki objek yang sangat kompak dan kotak memiliki nilai sekitar 1,27).
EDIT: Ambang batas pada area akan berguna untuk menghapus artefak yang sangat kecil, yang bisa dipadatkan. Maka indeks bentuk akan menunjukkan kontras yang lebih baik. EDIT: selain jawaban ini, penggunaan ST_Snap dapat membantu Anda memecahkan masalah sebelum terjadi.
sumber
(o.overlap_perimeter^2 / o.overlap_area) / (4 * Pi()) as overlap_ratio
? Ini memiliki hasil yang lebih buruk bagi saya daripada hanya area / perimeter.o.overlap_perimeter / (4 * sqrt(o.overlap_area)) as overlap_ratio
menurut makalah ini, tetapi hasilnya masih lebih buruk (meskipun itu sulit untuk mengukur apa yang saya maksud dengan lebih buruk) adalahprs-ann-photogramm-remote-sens-spatial-inf-sci.net/I-7/135/… , halaman 183.Salah satu opsi adalah menggunakan rasio luas poligon dengan garis terpanjang yang dapat ditarik menggunakan ekstremitasnya. Mengidentifikasi poligon sempit yang panjang.
select * from polygons where ST_Length(ST_LongestLine(geom, geom)) < ST_Area(geom) * 4
Ini bekerja cukup baik untuk poligon sliver. Anda dapat menyesuaikan rasio apa (apa yang Anda kalikan dengan daerah) sesuai dengan kebutuhan dan proyeksi Anda.
sumber
Kedengarannya seperti ini mungkin cocok dengan kasus penggunaan Anda: Hilangkan poligon yang dipilih
Sepertinya Anda ingin mencoba opsi "Batas Umum Terbesar".
sumber
Bagi saya ini seperti kasus penggunaan yang sempurna untuk ekstensi topologi PostGIS . Parameter toleransi topologi akan menentukan seberapa jauh Anda membiarkan simpul untuk snap ke poligon lain yang ada, untuk mengatasi rendahnya presisi data sumber dan untuk membersihkannya.
Singkatnya, strateginya adalah:
1. Aktifkan ekstensi topologi
2. Buat topologi kosong baru
Parameter ketiga adalah toleransi, dalam satuan CRS; pilihlah dengan bijak. Idealnya, Anda menginginkan CRS di mana unit adalah meter. Jika unit CRS bukan meter, seperti WGS 84 alias 4326, gunakan
ST_Transform
untuk memproyeksikan ulang poligon Anda.3. Tambahkan kolom TopoGeometry ke tabel poligon
Ini mengembalikan yang baru
layer_id
. Simpan itu, itu akan dibutuhkan nanti. Ini akan menjadi layer1
jika Anda memulai dari awal, dan bertambah pada setiap panggilan baru.4. Tambahkan semua poligon ke dalam topologi
Ini bisa memakan waktu beberapa jam untuk dataset yang besar, bersabarlah.
1
adalah layer_id yang dikembalikan sebelumnya.5. Temukan wajah yang muncul di beberapa lingkungan
Temukan semua wajah dari topologi yang ada di 2 atau lebih topogeometri. Saya akan meninggalkan pertanyaan sebagai latihan. Mungkin yang paling mudah adalah dengan
GetTopoGeomElements
fungsinya, lalu kelompokkan dengan id wajah, dan lihat yang dengan hitungan 2 atau lebih. Sebagai alternatif, Anda dapat membuat tabel baru dengan geometri yang dibersihkan dari kolom topogeom, cukup masukkan ke geometri standartopogeom::geometry
, dan ulangi apa yang sudah Anda miliki sekarang, tetapi sekarang dengan dataset yang bersih tanpa tumpang tindih sliver.sumber