Saya mencari cara yang efisien untuk mengelompokkan garis yang terlepas dari arahnya. Itu berarti bahwa garis antara New York dan Los Angeles harus berada dalam kelompok yang sama dengan garis ke arah lain antara Los Angeles dan New York. Lokasi titik awal / akhir harus serupa (mis. San Diego ke Long Island harus berada dalam kelompok yang sama dengan LA-NY tetapi mungkin bukan San Francisco ke Boston) dan tidak ada titik menengah. Input data akan mirip dengan contoh ini:
(Oleh Cassiopeia manis di Wikipedia Jepang GFDL atau CC-BY-SA-3.0 , via Wikimedia Commons)
Saya sebelumnya telah mencoba untuk mengurutkan garis di muka, misalnya untuk membuat mereka semua berjalan dari barat ke timur, tetapi ini tidak menyelesaikan masalah untuk jalur yang berjalan dari utara ke selatan dan sebaliknya.
Apakah Anda tahu ada algoritma yang menangani masalah ini? Saya telah mencari tetapi selain Algoritma untuk menghitung arah rata-rata segmen yang tidak diarahkan, saya belum menemukan sesuatu yang membantu, jadi saya harus menggunakan istilah pencarian yang salah.
sumber
Jawaban:
Jika saya mengerti Anda benar, Anda ingin mengelompokkan garis yang hampir sama tanpa memperhatikan arah.
Ini ide yang menurut saya bisa berhasil.
bagi garis menjadi titik awal dan titik akhir
Klaster poin dan dapatkan id cluster
Temukan baris dengan kombinasi id cluster yang sama. Itu adalah sebuah cluster
Ini harus dimungkinkan dalam PostGIS (tentu saja :-)) versi 2.3
Saya belum menguji fungsi ST_ClusterDBSCAN, tetapi harus melakukan pekerjaan.
Jika Anda memiliki tabel garis seperti ini:
Dan Anda ingin membuat cluster di mana titik awal dan akhir berjarak maksimum 10 km. Dan harus ada setidaknya 2 poin untuk menjadi sebuah cluster maka kueri dapat berupa sesuatu seperti:
Dengan bergabung dengan
a.cluster_id<b.cluster_id
Anda, dapatkan id cluster yang sebanding, tidak bergantung pada arah.sumber
Apakah Anda benar-benar ingin mengelompokkan berdasarkan petunjuk, tanpa mempertimbangkan asal atau tujuan? Jika demikian, ada beberapa cara yang sangat sederhana. Mungkin yang termudah adalah menghitung bantalan setiap garis, menggandakannya, dan memplotnya sebagai titik pada lingkaran. Karena bantalan ke depan-belakang berbeda 180 derajat, mereka berbeda 360 derajat setelah digandakan dan karenanya memplot tepat di tempat yang sama. Sekarang mengelompokkan titik-titik di pesawat menggunakan metode apa pun yang Anda suka.
Berikut adalah contoh kerja
R
, dengan outputnya menunjukkan garis-garis berwarna sesuai dengan masing-masing empat cluster. Tentu saja Anda mungkin akan menggunakan GIS untuk menghitung bantalan - Saya menggunakan bantalan Euclidean untuk kesederhanaan.sumber
Klarifikasi pertanyaan Anda menunjukkan bahwa Anda ingin pengelompokan didasarkan pada segmen garis yang sebenarnya , dalam arti bahwa dua pasangan asal-tujuan (OD) harus dianggap "dekat" ketika salah satu dari kedua asal dekat dan kedua tujuan dekat. , terlepas dari titik mana yang dianggap asal atau tujuan .
Formulasi ini menunjukkan Anda sudah memiliki rasa jarak d antara dua titik: itu bisa berupa jarak ketika pesawat terbang, jarak pada peta, waktu perjalanan pulang pergi, atau metrik lain yang tidak berubah ketika O dan D sedang diaktifkan. Satu-satunya komplikasi adalah bahwa segmen tidak memiliki representasi unik: mereka sesuai dengan pasangan tidak berurutan {O, D} tetapi harus direpresentasikan sebagai pasangan berurutan , baik (O, D) atau (D, O). Karena itu, kita dapat mengambil jarak antara dua pasangan berurutan (O1, D1) dan (O2, D2) menjadi beberapa kombinasi simetris dari jarak d (O1, O2) dan d (D1, D2), seperti jumlah atau kuadratnya akar jumlah kotak mereka. Mari kita tuliskan kombinasi ini sebagai
Cukup tentukan jarak antara pasangan tak berurutan menjadi yang lebih kecil dari dua jarak yang mungkin:
Pada titik ini Anda dapat menerapkan teknik pengelompokan apa pun berdasarkan matriks jarak.
Sebagai contoh, saya menghitung semua 190 jarak point-to-point di peta untuk 20 kota paling padat di AS dan meminta delapan cluster menggunakan metode hierarkis. (Untuk kesederhanaan saya menggunakan perhitungan jarak Euclidean dan menerapkan metode default pada perangkat lunak yang saya gunakan: dalam praktiknya Anda akan ingin memilih jarak yang tepat dan metode pengelompokan untuk masalah Anda). Inilah solusinya, dengan kluster yang ditunjukkan oleh warna setiap segmen garis. (Warna ditugaskan secara acak ke kluster.)
Berikut adalah
R
kode yang menghasilkan contoh ini. Inputnya adalah file teks dengan bidang "Longitude" dan "Latitude" untuk kota-kota. (Untuk memberi label kota-kota pada gambar, itu juga termasuk bidang "Kunci".)sumber