Saya mencoba mencari tahu titik belok, yaitu titik di mana kurva dalam garis mulai dan berakhir. Jika Anda melihat gambar, garis hijau mungkin jalan atau aliran, dan titik hitam adalah titik di mana kurva mulai dan berakhir.
Apa langkah tingkat tinggi untuk mengotomatiskan pembangkitan poin-poin ini? Saya memiliki desktop ArcGIS dan cukup berguna dengan ArcObjects.
arcobjects
algorithm
Devdatta Tengshe
sumber
sumber
Jawaban:
Ketika kurva terdiri dari segmen garis, maka semua titik interior segmen tersebut adalah titik belok, yang tidak menarik. Sebagai gantinya, kurva harus dianggap sebagai didekati oleh simpul dari segmen tersebut. Dengan melipatgandakan kurva yang dapat didiferensiasi dua kali melalui segmen-segmen tersebut, kita dapat menghitung kelengkungannya. Titik belok, sebenarnya, adalah tempat di mana kelengkungannya nol.
Dalam contoh ada peregangan gondrong di mana kelengkungan hampir nol. Ini menunjukkan bahwa titik-titik yang diindikasikan harus mendekati ujung bentangan seperti daerah berlengkungan rendah.
Algoritme yang efektif karena itu akan melakukan spline simpul, menghitung kelengkungan di sepanjang set padat titik menengah, mengidentifikasi rentang kelengkungan mendekati nol (menggunakan beberapa perkiraan yang masuk akal dari apa artinya menjadi "dekat"), dan menandai titik akhir dari rentang tersebut .
Berikut adalah
R
kode yang berfungsi untuk menggambarkan ide-ide ini. Mari kita mulai dengan string garis yang dinyatakan sebagai urutan koordinat:Spline koordinat x dan y secara terpisah untuk mencapai parameterisasi kurva. (Parameter akan dipanggil
time
.)Interpolasi splines untuk merencanakan dan menghitung:
Kita membutuhkan fungsi untuk menghitung kelengkungan kurva parameter. Perlu memperkirakan turunan pertama dan kedua dari spline. Dengan banyak splines (seperti splines kubik) ini adalah perhitungan aljabar yang mudah.
R
menyediakan tiga turunan pertama secara otomatis. (Di lingkungan lain, seseorang mungkin ingin menghitung turunan secara numerik.)Saya mengusulkan untuk memperkirakan ambang batas untuk kelengkungan nol dalam hal luasnya kurva. Setidaknya ini adalah titik awal yang baik; itu harus disesuaikan sesuai dengan tortuosity kurva (yaitu, meningkat untuk kurva yang lebih panjang). Ini nantinya akan digunakan untuk mewarnai plot sesuai dengan kelengkungan.
Sekarang setelah simpul telah dibulatkan dan kelengkungan dihitung, itu tetap hanya untuk menemukan titik belok . Untuk menunjukkan kepada mereka, kita dapat merencanakan simpul, plot spline, dan menandai titik belok di atasnya.
Titik terbuka adalah simpul asli
xy
dan titik hitam adalah titik belok yang secara otomatis diidentifikasi dengan algoritma ini. Karena lengkungan tidak dapat dihitung secara andal di titik akhir kurva, titik-titik tersebut tidak ditandai secara khusus.sumber
Anda dapat menggunakan alat Densify . Untuk kasus ini, Anda memilih untuk memadatkan dengan sudut, Berikutnya, pilih sudut maksimum yang diterima dalam garis lurus. Kemudian oleskan ke baris hasil ke garis Pisahkan alat pada simpul . Akhirnya, hapus garis yang memiliki shape_length lebih kecil dari panjang jalan minimum.
Dalam gambar ini, kita melihat tiga langkah:
1- Densifikasi garis menggunakan sudut. Saya telah menggunakan 10 derajat sebagai parameter, dan kami menggunakan splitline. Dalam gambar, garis lengkung berada pada fase awal.
2 - Pilih segmen di mana memiliki shape_length tidak berlebihan. Seperti yang kita lihat dalam tabel, saya belum memilih panjang yang berlebihan itu. Lalu, saya memilih mereka menjadi kelas fitur baru.
3 - Kami telah mengekstrak simpul yang terletak di tepi garis, yang merupakan titik belok.
sumber
Anda dapat menggunakan alat Generalisasi yang memiliki offset maksimum dari garis asli sebagai parameter, sehingga Anda dapat memilih offset yang sesuai dengan kasus Anda.
Jika kita beri nama baris asli "line_cur", dan yang umum "line_gen", maka kita bisa memotong "line_cur" dengan "line_gen". Hasilnya akan menjadi segmen lurus "line_cur". Lalu kita bisa membersihkan beberapa segmen yang sangat pendek dengan menghapusnya dengan kueri sql yang memilih Shape_length lebih besar dari panjang jalan minimum.
sumber