Algoritma: memindahkan sumber polyline ke polyline referensi (sepenuhnya atau mungkin sebagian)

10

Dalam sistem kami, ada persyaratan bahwa kami ingin memindahkan beberapa jalur sumber (dengan presisi rendah) ke jalur referensi (dengan presisi tinggi). Gambar-gambar berikut memberikan kasus penggunaan normal. Yang merah adalah garis sumber dan yang biru adalah garis referensi.

Yang merah adalah garis sumber dan yang biru adalah garis referensi

Untuk kasus ini, baris sumber akan dipindahkan sebagian, dan hasilnya akan seperti yang ditunjukkan garis hijau:

Pindahkan hasil 1

Ada situasi di mana baris sumber perlu dipindahkan sepenuhnya.

Contoh 2

Hasil:

Pindahkan hasil 2

Saat ini solusi kami adalah memproyeksikan titik kepala / akhir dari garis sumber ke garis referensi dan sebaliknya, kemudian menemukan titik yang diproyeksikan pada sumber dan garis referensi. Dengan titik-titik yang diproyeksikan ini, kita dapat mengekstrak bagian yang diperlukan dari sumber dan garis referensi dan kemudian menggabungkannya menjadi yang baru.

Ini berfungsi untuk sebagian besar kasus, tetapi ada kasus bahwa metode ini tidak berfungsi. Khususnya, ketika salah satu garis memiliki bentuk seperti "C" atau titik kepala sangat dekat dengan titik akhir. Dua gambar berikutnya memberikan skenario.

C seperti garis bentuk

Menerapkan algoritma saya, kami mendapatkan hasilnya:

Hasil

Bisa dimengerti karena algoritma saat ini hanya menemukan titik yang diproyeksikan dan mengekstrak garis.

Apa yang kami harapkan adalah seperti ini:

hasil yang diharapkan

Jadi apa yang saya perlukan algoritma yang lebih kuat untuk melakukan ini sehingga juga dapat menangani kasus-kasus khusus seperti yang sebelumnya. Saya telah mencoba untuk memproyeksikan setiap poin dari satu baris ke yang lain dan untuk menemukan dua poin yang diproyeksikan yang paling dekat dengan titik kepala / akhir dari garis yang diproyeksikan, tetapi tidak ada keberuntungan. Saya masih dapat menemukan kasus yang memberikan hasil yang tidak terduga.

Adakah yang pernah mengalami masalah serupa sebelumnya? Akan lebih bagus jika ada perangkat lunak atau perpustakaan yang bisa melakukan pekerjaan serupa. Jawaban apa pun akan dihargai.

mfdev
sumber
1
Mungkin itu akan membantu Anda ketika Anda melihat bagaimana Topologi di ArcGIS memeriksa apakah objek bertepatan: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… paragraf "Pemrosesan cluster".
Jens
Terima kasih atas jawaban Anda, @Jens. Tetapi saya khawatir bukan itu yang saya inginkan.
mfdev
Apakah garis ini mewakili jaringan? Apakah ada hubungan topologi di antara mereka?
julien
Itu tidak harus menjadi jaringan dan mungkin tidak ada hubungan topologis.
mfdev

Jawaban:

4

Perkiraan saya adalah bahwa kasus akhir sering menjadi pengecualian yang tidak dapat diprogram dengan mesin. Saya bekerja dengan masalah yang sama dan mereka selalu membutuhkan sejumlah pengeditan manual. Yang perlu Anda sesuaikan adalah pengecualian yang diproduksi oleh kasing dan sajikan dalam sistem manajemen kerja kepada pengguna akhir.

Lewis
sumber
Contoh yang agak mirip dari hal ini dapat dilihat di sini: vividsolutions.com/jcs JCS sangat efektif untuk mengotomatiskan penyatuan geometri, tetapi juga menyertakan QA manual untuk geometri yang tidak dapat digabungkan sepenuhnya. vividsolutions.com/... Dibangun darinya dan memungkinkan untuk QA dan menambahkan pelacakan masalah untuk geometri yang sulit.
DPierce
1
Semua solusi topologi tidak dapat diotomatisasi oleh pemrograman dan dan di perusahaan besar, solusi seperti itu dikembangkan mirip dengan contoh karena rontoknya konflasi dapat menjadi besar dan bersifat siklis dengan geometri transportasi yang kompleks dengan tingkat perubahan yang tinggi.
lewis
2

Anda akan memerlukan toleransi sekejap dan toleransi belokan untuk algoritma ini (saya berasumsi Anda sudah memiliki toleransi sekejap).

Proyeksikan titik kepala dari garis sumber ke garis referensi. Hancurkan garis referensi pada titik yang diproyeksikan ini.

Lintasi garis sumber dari titik kepala ke titik pertama untuk mendapatkan arah perjalanan di sepanjang garis sumber. Lintasi masing-masing dari dua garis referensi Anda dari titik sumber yang diproyeksikan ke titik berikutnya. Jika arah perjalanan berada dalam toleransi belokan arah perjalanan dari titik kepala di jalur sumber Anda, maka terapkan algoritma Anda secara normal, tetapi hanya menggunakan bagian jalur referensi tersebut. Jika algoritma mencapai akhir baris sumber, Anda selesai. Jika tidak, pecahkan garis sumber antara bagian yang ditransformasi dan bagian yang tidak diubah (yang akan mencakup titik akhir).

Sekarang ambil bagian yang tidak diubah dan proyeksikan titik akhir ke garis referensi asli. Lakukan prosedur yang sama seperti sebelumnya ... melintasi sumber dari titik akhir ke titik pertama untuk menemukan arah perjalanan. Hancurkan garis referensi pada titik akhir proyek dan lintasi masing-masing untuk menemukan apakah arah perjalanan dari titik akhir yang diproyeksikan berada dalam toleransi belokan. Jika demikian, gunakan potongan garis referensi untuk menerapkan algoritma secara normal.

Ingat, pada titik ini Anda hanya menggunakan bagian yang tidak diubah, sehingga Anda tidak akan tumpang tindih dengan transformasi titik kepala.

Akhirnya, gabungkan dua potongan garis yang dihasilkan jika perlu: titik kepala mengubah potongan dari titik kepala yang diproyeksikan ke titik istirahat yang tidak diubah dan kemudian pada titik akhir potongan yang ditransformasi dari titik istirahat yang tidak diubah ke titik akhir yang diproyeksikan.

tuan-castillo
sumber