Mendeteksi bentuk poligon bercabang?

13

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:

poligon bercabang vs strip melengkung

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:

masukkan deskripsi gambar di sini

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.

nadya
sumber
1
Anda tidak perlu banyak Python. Coba! bentuk!. convexHull (). symmetricDifference (! shape!) Di bidang kalkulator. Coba dulu pada salinan subset kecil. Lihat bantuan geometri arcpy untuk sintaks yang benar.
FelixIP
Ini bisa menjadi pertanyaan yang bagus tetapi saat ini Anda mengajukan beberapa pertanyaan dengan tidak mengikat apakah Anda bertanya tentang QGIS atau ArcGIS Desktop dan kemudian juga melemparkan Python juga. Setelah Anda menentukan dengan tepat apa yang telah Anda coba, akan lebih mudah bagi calon penjawab untuk membantu dengan di mana Anda terjebak. Saya sarankan memfokuskannya pada QGIS untuk menghindari jawaban pertama Anda yang terdampar.
PolyGeo
1
Saya memiliki data di Esri geodatabase karena sebuah shapefile sudah melebihi 2 gb. Saya bisa melakukan sesuatu tentang ini jika ada solusi yang berfungsi di QGIS atau di suatu tempat. Tetapi saya tidak bertanya di dalam perangkat lunak tertentu. Saya bertanya tentang metrik, metode bagaimana mendeteksi secara matematis bentuk dengan batas kompleks (bercabang). 1 pertanyaan. Artikel ilmiah dengan formula juga ok, saya akan memikirkan bagaimana menerapkannya sendiri.
nadya
1
Pikiran pertama saya adalah sama dengan Anda, melihat perbedaan antara jumlah dan ukuran poligon yang tersisa setelah mengurangi aslinya dari cembung (atau cekung) lambungnya (lihat juga bentuk alfa).
user2856
1
Kalau saja kerangka cukup cepat untuk menghitung, saya akan gunakan untuk menghitung 4A / PL, luas, keliling, panjang antara simpul kerangka rangka untuk kekompakan. Hal yang sama berlaku untuk lingkaran bertulis terbesar.
FelixIP

Jawaban:

11

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:

  • ketika Anda menggambar huruf Y, Anda menggunakan setidaknya 2 stroke terus menerus (= 2 polyline) ,, jadi bercabang karena jumlah minimal stroke adalah> 1.
  • ketika Anda menggambar huruf L, Anda menggunakan setidaknya 1 stroke terus menerus. Itu tidak bercabang.

Lebih banyak contoh dari logika ini:

  • Ketika Anda menggambar A: 2 stroke = itu bercabang
  • Ketika Anda menyadari B: 3 pukulan = itu bercabang
  • ketika Anda menggambar C: 1 stroke = itu tidak bercabang
  • dll

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

Contoh

Sumber: Mengekstrak garis tengah Kompleks-Poligon di PostGIS / Python

EDIT: Untuk kasus C & D, Anda harus sudah memiliki bentuk B yang difilter (tidak bercabang).

  • Pastikan ID unik menautkan garis tengah dan poligon sumber.
  • Ubah poligon Anda menjadi polyline
  • Densifikasi polyline garis tengah dan polyline garis batas dengan titik-titik reguler (tidak terlalu banyak untuk menghindari masalah memori nanti tetapi cukup untuk "menangkap" bit-bit tidak beraturan.
  • Buat matriks jarak antara titik-titik garis tengah dan titik-titik garis batas
  • Tetap di garis matriks hanya di mana ID_centerline = ID_borderline
  • Buat statistik untuk memiliki nilai standar deviasi
  • Tetapkan nilai terikat untuk menunjukkan nilai SD tinggi bahwa itu adalah kontur tidak teratur dan buat indikator yang diperlukan, untuk setiap ID unik
  • Dapatkan kembali indikator ke poligon asli dengan bergabung dengan bidang di dasar ID unik.
gisnside
sumber
Terima kasih atas idenya, saya akan mencoba membuat centerlines
nadya
Hanya, masalah untuk membedakan poligon C dan D saya akan tetap
nadya
Anda mungkin memerlukan metode yang berbeda untuk kasus yang berbeda dan membagi pekerjaan. Setelah Anda memiliki poligon bercabang (B), Anda dapat memperbaiki B untuk mencoba dan menemukan C dan D. Masalahnya adalah bahwa saya tidak melihat logika apa yang Anda gunakan untuk membedakan C dari D. Anda mungkin harus mengucapkannya dengan jelas dengan kriteria.
gisnside
1
Perbedaan antara C dan D tampaknya adalah bahwa di C, sisi-sisi poligon kira-kira berjarak seragam dari garis tengah, sedangkan di D sisi-sisinya adalah jarak yang tidak seragam dari garis tengah.
csk
1
@ csk saya melihatnya. Saya kira menerjemahkannya ke dalam kode akan menghitung statistik pada jarak antara garis tengah dan garis perbatasan. Dengan memadatkan polyline perbatasan dengan lebih banyak poin kemudian mengubah perbatasan ini menjadi poin + membuat jarak dari pekerjaan yang setara di garis tengah akan memberikan statistik pada perilaku ini. Jika standar deviasi tinggi, maka kemungkinan bentuknya tidak beraturan. Sulit untuk melihat bagaimana melakukan itu di tousands poligon meskipun ... tantangan yang bagus di sana
gisnside