Saya memiliki lapisan vektor dengan jutaan poligon yang membuat cakupan terus menerus. Saya perlu mengklasifikasikan mereka sesuai dengan bentuknya. Saya sudah menggunakan beberapa indeks bentuk dari ekologi lansekap seperti kekompakan ( 4piA / P ^ 2 ), lebar rata-rata ( 2A / P ), jumlah bentuk ( P / sqrt (A) ), saya juga melihat jawaban ini untuk Menghitung kebulatan / kekompakan dari poligon?
Masalah saya adalah bahwa semua metrik ini menggunakan beberapa rasio area dan perimeter saja. Bahkan indeks Dimensi Fraktal hanya menggunakan area dan perimeter ( 2ln (0,25P) / ln (A) ). Tetapi bagaimana saya bisa membedakan dua poligon dengan area dan perimeter yang sama tetapi bentuknya benar-benar berbeda? Seperti poligon bercabang A ini:
yang saya coba gambar dengan area dan perimeter yang sama dengan strip melengkung B. Semua indeks saya yang diketahui akan sama untuk mereka. Tetapi bagi saya itu sangat penting untuk membedakan strip sederhana (termasuk melengkung seperti bulan baru) dari bentuk bercabang yang kompleks.
Saya sengaja menunjukkan poligon B sebagai strip melengkung dan bukan strip lurus karena saya mengetahui indeks Circumcircle Terkait yang mendeteksi bentuk memanjang lurus tetapi poligon saya mungkin juga memiliki circumcircles yang sama. Bahkan jika saya membuat Convex hull dan menghitung rasio area Apolygon / Aconvex , mungkin sangat mirip di sini.
Jadi, bagaimana saya bisa dengan jelas membedakan poligon bercabang dari poligon B dalam data vektor secara otomatis? (Mengubahnya menjadi raster akan membutuhkan ukuran sel yang sangat kecil, kumpulan data yang sangat besar, dan kurangnya memori, sehingga tidak mungkin). Apakah ada indeks bentuk lain yang menyertakan parameter lain? Idealnya, metode ini akan membedakan tidak hanya poligon bercabang dengan jelas tetapi bahkan C dan D:
Satu-satunya ide saya adalah membangun convex hull kemudian menghapus poligon dari convex hull dan menghitung jumlah potongan (besar) yang ditinggalkannya (menghapus poligon dengan poligon dan bukan seluruh layer). Ini bisa menunjukkan kompleksitas perbatasan.
Saya menyambut solusi / algoritma matematika, yang nantinya akan saya implementasikan dengan Python.
Jawaban:
Anda bisa melihat metode berikut: skeletonize poligon Anda dan lebih baik bekerja pada fitur tipe garis yang terkait dengan poligon asli Anda dengan ID poligon sumber yang unik. Saya kira ada beberapa tebakan yang harus dilakukan (misalnya, kapan mempertimbangkan polyline sebagai centerline nyata: panjang minimal untuk polyline agar memenuhi syarat untuk status centerline). Ketika jumlah garis tengah lebih dari 1 untuk poligon sumber tunggal, maka bercabang.
Poligon bercabang, ketika dibersihkan hingga garis tengah, akan memiliki banyak garis sedangkan poligon lurus mungkin hanya memiliki satu garis besar di tengah (sama seperti interpretasi manusia pada kenyataannya).
Contoh:
Lebih banyak contoh dari logika ini:
Saya belum mencoba apa pun, hanya mencoba logika, tetapi saya pikir itu bisa berhasil.
Lihat: Skeletonize vektor dalam QGIS / Python atau http://postgis.net/docs/ST_StraightSkeleton.html
Atau
Sumber: Mengekstrak garis tengah Kompleks-Poligon di PostGIS / Python
EDIT: Untuk kasus C & D, Anda harus sudah memiliki bentuk B yang difilter (tidak bercabang).
sumber