Saya mencoba untuk mencocokkan segmen kecil dengan segmen yang lebih besar yang paling mungkin terkait dengan mereka: relatif dekat, bantalan yang sama, dan saling berhadapan.
Berikut adalah contoh khas dari data yang saya miliki:
Di sini saya harus mencocokkan segmen 652 hingga 198969, sementara 711 dan 707 tidak cocok dengan apa pun.
Saya telah mencari metode yang berbeda, khususnya jarak Hausdorff (berdasarkan jawaban di sini ). Saya menghitungnya menggunakan PostGIS tapi saya mendapatkan hasil yang aneh: jarak terpendek yang saya dapatkan adalah antara 707 dan 198985, dan 652 memiliki jarak yang lebih besar ke 198969 daripada 198985 misalnya (saya dapat menambahkan kueri dan hasil jika diperlukan).
Apakah Hausdorff sebenarnya metode yang tepat untuk menyelesaikan ini? Apakah ada pendekatan lain? Saya berpikir untuk membuat satu set pemeriksaan pada parameter yang saya sebutkan (jarak, bantalan, dll.) Tetapi saya takut harus menambahkan sejumlah kondisi untuk menangani kasus tepi atau hal-hal seperti ambang batas pada seberapa banyak mereka saling berhadapan.
Pembaruan: Saya menemukan metode yang sepertinya kompromi yang dapat diterima:
- Saya pertama kali menemukan 10 segmen hitam terdekat dari yang biru yang saya coba padankan (menggunakan
<->
operator PostGIS ) yang berjarak kurang dari 10 meter. - Saya kemudian membuat segmen baru dengan menemukan titik terdekat ke ujung segmen biru pada masing-masing yang hitam (menggunakan
ST_ClosestPoint
) dan menyaring hasil yang panjangnya kurang dari 90% dari yang biru (artinya segmen tidak menghadap, atau bahwa perbedaan bantalan lebih dari ~ 20 °) - Lalu saya mendapatkan hasil pertama yang diurutkan berdasarkan jarak dan jarak Hausdorff, jika ada.
Mungkin ada beberapa penyesuaian yang harus dilakukan tetapi tampaknya melakukan pekerjaan yang dapat diterima untuk saat ini. Masih mencari metode lain atau pemeriksaan tambahan untuk dijalankan jika saya melewatkan beberapa kasus tepi.
sumber
Jawaban:
Berikut adalah beberapa fungsi yang saya tulis yang seharusnya membuat Anda melakukan apa yang perlu Anda lakukan. Periksa dan lihat apakah garis tersebut polyline atau segmen jika polyline meledakkan garis, lalu bandingkan azimuth dan kebalikan dari titik pertama dan titik terakhir pada garis, buat Anda kriteria yang dapat diterima untuk kode untuk membuat keputusan untuk Anda. Ini adalah metode yang kasar tetapi dapat dimodifikasi.
kembalikan azimuth dari segmen garis ESRI @shape
mengembalikan kebalikan dari poin ESRI
meledak polyline menjadi segmen garis
jalankan melalui meja Anda seperti ini
properti ini harus tersedia di postgis - firstpoint, lastpoint, pointarray Saya menganggap properti esri di atas karena itulah yang saya tahu terbaik tetapi di atas dapat dengan mudah diubah untuk bekerja dengan postgis.
sumber