Saya telah menanyakan pertanyaan ini beberapa kali di stackoverflow dan irc antara #qgis dan #postgis dan saya juga mencoba untuk kode atau menerapkannya sendiri di postgis tanpa jawaban nyata.
Menggunakan pemrograman (paling disukai python), saya ingin menggambar garis dari lapisan titik, ke proyeksi pada garis terdekat dari garis atau lapisan poligon.
Sampai sekarang sebagian besar data saya dalam bentuk ESRI dan format postgis; namun, saya lebih suka menjauh dari solusi postgis karena saya sebagian besar adalah pengguna shp + qgis.
Solusi ideal adalah dengan mengimplementasikan GDAL / OGR dengan python atau pustaka sejenis
- Menggunakan perpustakaan GDAL / OGR di mana saya harus mulai? apakah mungkin untuk memberikan rencana solusi?
- Bisakah saya menggunakan NetworkX untuk melakukan analisis tetangga terdekat?
- Apakah ini sebenarnya mungkin?
Jika lebih mudah, titik dapat terhubung ke titik akhir segmen alih-alih titik yang diproyeksikan
Jawaban:
Pertanyaan ini ternyata sedikit lebih rumit daripada yang saya kira benar. Ada banyak implementasi jarak terpendek itu sendiri, seperti jarak yang disediakan Shapely (dari GEOS). Beberapa solusi menyediakan titik persimpangan itu sendiri, tetapi hanya jarak.
Upaya pertama saya buffer titik dengan jarak antara titik dan poligon, dan mencari persimpangan, tetapi kesalahan pembulatan mencegah hal ini memberikan jawaban yang tepat.
Berikut solusi lengkap menggunakan Shapely, berdasarkan persamaan ini :
Untuk anak cucu, sepertinya ekstensi ArcView ini menangani masalah ini dengan cukup baik, sayang sekali pada platform mati yang ditulis dalam bahasa mati ...
sumber
pairs
secara algoritmik O (n) atau sesuatu. Solusi @eprand mungkin dapat dimodifikasi untuk menggunakan KNN namun saya berhasil hidup tanpa PostGIS sejauh ini ...Jawaban PostGIS (untuk multilinestring, jika linestring, hapus fungsi st_geometryn)
sumber
Ini agak lama, tapi saya sedang mencari solusi untuk masalah ini hari ini (point -> line). Solusi paling sederhana yang pernah saya temui untuk masalah terkait ini adalah:
sumber
Jika saya mengerti Anda benar, fungsionalitas yang Anda minta sudah ada di PostGIS.
Untuk mendapatkan titik yang diproyeksikan pada sebuah garis, Anda dapat menggunakan ST_Closestpoint (di PostGIS 1.5)
Beberapa petunjuk tentang cara menggunakannya Anda dapat membaca di sini: http://blog.jordogskog.no/2010/02/07/how-to-use-the-new-distance-related-functions-in-postgis-part1/
Dapat digunakan juga untuk menemukan titik terdekat pada poligon ke poligon lain misalnya.
Jika Anda ingin garis antara dua titik terdekat pada kedua geometri, Anda dapat menggunakan ST_Shortestline. ST_Closestpoint adalah poin pertama di ST_Shortestline
Panjang ST_Shortestline antara dua geometri sama dengan ST_Distance antara geometri.
sumber
Lihat komentar di bawah mengenai bagaimana jawaban saya tidak boleh dianggap sebagai solusi yang dapat diandalkan ... Saya akan meninggalkan posting asli ini di sini supaya orang lain dapat memeriksa masalahnya.
Jika saya mengerti pertanyaannya, prosedur umum ini harus berhasil
Untuk menemukan jalur terpendek antara titik (sebagaimana didefinisikan oleh x, y atau x, y, z) dan polyine (sebagaimana didefinisikan oleh himpunan h, x atau y, x, y) yang menghubungkan dalam ruang Euclidean:
1) Dari titik yang ditentukan pengguna (saya akan menyebutnya pt0), cari titik terdekat dari polyline (pt1). OGRinfo dapat mensurvei simpul polyline, dan kemudian perhitungan jarak dapat dilakukan melalui metode standar. Sebagai contoh, lakukan iterasi lebih dari satu perhitungan jarak seperti: distance_in_radians = 2 * math.asin (math.sqrt (math.pow ((math.sin ((pt0_radians-ptx_radians) / 2)), 2) + math.cos (pt0_radians) * math.cos (ptx_radians) * math.pow ((math.sin ((pt0_radians-ptx_radians) / 2)), 2))))
2) Menyimpan nilai jarak minimum terkait (d1) dan (pt1)
3) lihat kedua segmen yang berasal dari pt1 (dalam ogrinfo linestring, ini akan menjadi simpul sebelum dan sesudahnya). Rekam simpul-simpul ini (n2 dan n3).
4) buat y = mx + b formula untuk setiap segmen
5) Kaitkan poin Anda (pt0) dengan tegak lurus untuk masing-masing dari dua formula tersebut
6) Hitung jarak dan persimpangan (d2 dan d3; pt2, pt3)
7) Bandingkan tiga jarak (d1, d2, d3) untuk yang terpendek. PT0 Anda ke simpul terkait (pt1, pt2, atau pt3) adalah tautan terpendek.
Itulah aliran kesadaran jawaban - semoga, gambaran mental saya tentang masalah dan solusi cocok.
sumber
Berikut ini adalah skrip python untuk QGIS> 2.0 yang dibuat dari petunjuk dan solusi yang diberikan di atas. Ini berfungsi dengan baik untuk jumlah poin dan garis yang masuk akal. Tetapi saya tidak mencobanya dengan sejumlah besar objek.
Tentu saja itu harus disalin dalam keadaan diam atau apapun yang kurang "solusi pythonic" dan simpan sebagai "terdekat.point.py".
Dalam kotak alat QGIS buka skrip, alat, tambahkan skrip, dan pilih itu.
!!! PERINGATAN !!! Perhatikan bahwa beberapa poin proyeksi "aneh" / salah dapat dihasilkan karena perintah baris ini:
The
counterSelec
nilai di dalamnya mengatur berapa banyak nearestNeighbor dikembalikan. Sebenarnya setiap titik harus diproyeksikan pada jarak sesingkat mungkin untuk setiap objek garis; dan jarak minimum yang ditemukan akan memberikan garis yang benar dan titik yang diproyeksikan sebagai tetangga terdekat yang kami cari. Untuk mengurangi waktu pengulangan, perintah Neighbor terdekat digunakan. MemilihcounterSelec
nilai yang dikurangi menjadi 1 akan mengembalikan objek "pertama" yang dipenuhi (itu kotak pembatas lebih tepatnya) dan mungkin bukan yang benar. Objek ukuran garis yang berbeda mungkin harus memilih mungkin 3 atau 5, atau bahkan lebih banyak objek terdekat untuk menentukan jarak terdekat. Semakin tinggi nilainya, semakin lama. Dengan ratusan titik dan garis mulai menjadi sangat lambat dengan 3 atau 5 tetangga terdekat, dengan ribuan mungkin bug dengan nilai-nilai tersebut.sumber
Bergantung pada minat dan penggunaan kasus Anda, mungkin berguna untuk melihat "algoritma pencocokan peta". Misalnya, ada proyek RoadMatcher di wiki OSM: http://wiki.openstreetmap.org/wiki/Roadmatcher .
sumber