Saya memiliki data titik di sepanjang jalan, saya ingin mengubah titik-titik itu menjadi garis berwarna sederhana. Adakah petunjuk apa masalah ini dapat disebut atau algoritma yang dapat membantu saya menyelesaikan ini?
Saya berharap menggunakan PostGIS
fungsi untuk melakukan ini tetapi saya terbuka untuk saran, ini adalah data dari .shp
file.
Sunting1: Diperbarui gambar untuk menunjukkan solusi ideal dari masalah ini.
Menggambar garis akan murni berdasarkan jarak antara titik-titik itu, tidak ada lagi yang bisa saya gunakan untuk mengelompokkannya. Idealnya ini adalah titik pada jarak maksimum yang ditentukan di sepanjang garis yang diproyeksikan? Dan dengan memproyeksikan garis yang saya maksud menemukan titik 1 kemudian berikutnya yang terdekat dengan itu memproyeksikan garis dan memeriksa apakah ada titik pada garis ini pada jarak maksimal ke salah satu yang sudah ada di garis.
Jawaban:
Anda dapat menggunakan kueri rekursif untuk menjelajahi tetangga terdekat dari setiap titik mulai dari setiap ujung garis yang terdeteksi yang ingin Anda buat.
Prasyarat : siapkan layer postgis dengan poin Anda dan poin lain dengan objek multi-linestring tunggal yang berisi jalan Anda. Dua lapisan harus berada pada CRS yang sama. Ini adalah kode untuk set data uji yang saya buat, harap modifikasi sesuai kebutuhan. (Diuji pada postgres 9.2 dan postgis 2.1)
Berikut langkah-langkahnya :
Buat untuk setiap titik daftar setiap tetangga dan jarak mereka yang memenuhi tiga kriteria ini.
Jarak tidak boleh melebihi rasio jarak yang ditentukan pengguna dari tetangga terdekat (ini harus mengakomodasi lebih baik digitalisasi tidak teratur daripada jarak tetap)Bagian ini sebenarnya terlalu sulit untuk diterapkan, melekat pada radius pencarian tetapSebut saja tabel ini "grafik"
Pilih ujung titik garis dengan bergabung ke grafik dan pertahankan hanya titik yang memiliki satu entri persis dalam grafik.
Sebut saja tabel ini "eol" (end of line) dengan
mudah? bahwa hadiah untuk melakukan grafik yang bagus tetapi hal-hal yang bertahan akan menjadi gila pada langkah berikutnya
Menyiapkan kueri rekursif yang akan berputar dari tetangga ke tetangga mulai dari setiap hari
Sebut saja tabel ini "recurse_eol"
Pertahankan hanya garis terpanjang untuk setiap titik awal dan hapus setiap jalur duplikat yang tepat Contoh: jalur 1,2,3,5 DAN 5,3,2,1 adalah garis yang sama yang ditemukan oleh dua perbedaan "ujung jalur"
Secara manual memeriksa kesalahan yang tersisa (titik terisolasi, garis yang tumpang tindih, jalan berbentuk aneh)
Diperbarui seperti yang dijanjikan, saya masih tidak tahu mengapa kadang-kadang permintaan rekursif tidak memberikan hasil yang sama persis ketika mulai dari lawan dari baris yang sama sehingga beberapa duplikat mungkin tetap ada di lapisan hasil seperti sekarang.
Jangan ragu untuk bertanya, saya benar-benar mengerti bahwa kode ini membutuhkan lebih banyak komentar. Ini pertanyaan lengkapnya:
sumber
Seperti yang ditunjukkan oleh @FelixIP, langkah pertama adalah menemukan poin yang akan membentuk setiap baris. Anda dapat melakukan ini dengan menghubungi ST_ClusterWithin dengan jarak pemisahan maksimum Anda:
Kemudian, Anda harus menggunakan beberapa heuristik untuk membangun garis melalui semua titik di setiap cluster. Misalnya, jika Anda dapat menganggap baris yang diinginkan sebagai Y-monoton, Anda dapat mengurutkan titik di setiap kluster dan mengumpankannya ke dalam ST_MakeLine . Menggabungkan bahwa semuanya akan terlihat seperti ini:
sumber