Saya mencoba menggunakan QGIS 2.14 untuk mengambil jaringan jalan ke jaringan heksagonal, tapi saya mendapatkan artefak yang aneh.
Saya telah membuat hex grid dengan MMQGIS , sel kira-kira 20 x 23 m. Saya telah buffer jaringan jalan dengan 1m dan memadatkannya sehingga ada node setiap beberapa meter. Anda dapat melihat apa yang saya coba capai di bawah ini. Seperti yang Anda lihat, saya bisa membuatnya berfungsi dalam beberapa kasus: -
- biru adalah jalan padat (garis buffered)
- merah adalah versi 'hexified' - ini yang ingin saya temukan
- abu-abu adalah kisi hex
Saya kemudian menggunakan fitur Snap geometri baru untuk mengambil node ke sudut segi enam terdekat. Hasilnya menjanjikan, tetapi tampaknya ada beberapa kasus tepi di mana garis mengembang untuk mengisi segi enam (atau bagian dari itu): -
Alasan buffer adalah bahwa geometri Snap tidak memungkinkan Anda untuk mengambil lapisan yang geometrinya berbeda. Sebagai contoh, Anda tidak dapat mengambil node pada layer LINE ke poin pada layer POINT). Tampaknya menjadi yang paling menyenangkan memotret POLYGON ke POLYGON.
Saya menduga jalan melebar ketika satu sisi dari garis jalan yang disangga melompat ke satu sisi sel hex, dan sisi lain melompat ke sisi lain dari sel hex. Dalam contoh saya, jalan-jalan yang melintasi barat-timur pada sudut yang akut tampaknya yang terburuk.
Hal yang sudah saya coba, tanpa hasil: -
- buffering jaringan jalan dengan jumlah kecil, sehingga tetap poligon tetapi sangat tipis.
- memadatkan sel hex (jadi ada node di sepanjang tepi, tidak hanya di sudut)
- memvariasikan jarak gertakan maksimum (ini memiliki efek terbesar, tetapi saya tidak dapat menemukan nilai yang ideal)
- menggunakan layer LINE, bukan POLYGON
Saya menemukan bahwa jika saya mengubah menggunakan hanya lapisan LINE, itu berfungsi untuk sementara waktu, kemudian macet. Tampaknya untuk menyimpan pekerjaannya - beberapa baris telah diproses sebagian.
Adakah yang tahu cara lain untuk mengambil titik pada garis ke titik terdekat pada garis / lapisan poligon lain, idealnya tanpa perlu menggunakan postgres / postgis (walaupun solusi dengan postgis akan diterima juga)?
EDIT
Bagi siapa saja yang ingin mencoba, saya telah meletakkan proyek QGIS pemula di sini di Dropbox . Ini termasuk Hex Grid dan layer garis Densified. (Jaringan jalan dari OSM, jadi dapat diunduh menggunakan QuickOSM misalnya jika Anda perlu mendapatkan dokumen asli untuk mengurangi jalan).
Perhatikan bahwa ini dalam OSGB (epsg: 27700) yang merupakan UTM lokal untuk Inggris, dengan satuan dalam meter.
Jawaban:
Solusi saya melibatkan skrip PyQGIS yang lebih cepat dan lebih efektif daripada alur kerja yang melibatkan gertakan (saya mencobanya juga). Dengan menggunakan algoritma saya, saya telah memperoleh hasil ini:
Anda dapat menjalankan cuplikan kode berikut secara berurutan dari dalam QGIS (di konsol Python QGIS). Pada akhirnya Anda mendapatkan lapisan memori dengan rute yang diambil dimuat ke QGIS.
Satu-satunya prasyarat adalah membuat Shapefile jalan multipart (gunakan
Processing->Singleparts to multipart
, saya menggunakan bidangfictitiuos
sebagaiUnique ID field
parameter). Ini akan memberi kitaroads_multipart.shp
file dengan fitur tunggal.Berikut adalah algoritme yang dijelaskan:
Dapatkan sisi segi enam terdekat tempat rute melintas. Untuk setiap segi enam kami membuat 6 segitiga antara setiap pasangan simpul tetangga dan centroid yang sesuai. Jika ada jalan yang memotong segitiga, ruas yang dibagikan oleh segi enam dan segitiga ditambahkan ke rute terakhir yang terpotong. Ini adalah bagian yang lebih berat dari keseluruhan algoritma, dibutuhkan 35 detik untuk berjalan di mesin saya. Di dua baris pertama ada 2 jalur Shapefile, Anda harus menyesuaikan mereka agar sesuai dengan jalur file Anda sendiri.
Singkirkan segmen yang terputus (atau 'terbuka') dengan menggunakan daftar Python, tuple, dan kamus . Pada titik ini, ada beberapa segmen yang terputus yang tersisa, yaitu, segmen yang memiliki satu simpul terputus tetapi yang lainnya terhubung ke setidaknya 2 segmen lainnya (lihat segmen merah pada gambar berikutnya). Kita harus menyingkirkan mereka.
Sekarang kita dapat membuat layer vektor dari daftar koordinat dan memuatnya ke peta QGIS :
Bagian lain dari hasilnya:
Jika Anda memerlukan atribut dalam rute yang diambil, kami dapat menggunakan Indeks Spasial untuk mengevaluasi persimpangan dengan cepat (seperti di /gis//a/130440/4972 ), tapi itu cerita lain.
Semoga ini membantu!
sumber
Saya melakukannya di ArcGIS, pasti bisa diimplementasikan menggunakan QGIS atau hanya python dengan paket yang mampu membaca geometri. Pastikan jalan mewakili jaringan, yaitu saling berpotongan di ujungnya saja. Anda berhadapan dengan OSM, saya kira memang begitu.
Jika Anda tidak ingin melihat ini:
Jangan mencoba menggunakan poin rantai pada Garis Voronoi. Saya khawatir itu hanya akan memperburuknya. Jadi, satu-satunya pilihan Anda adalah membuat jaringan dari jalur Voronoi dan menemukan rute antara titik akhir jalan, itu juga bukan masalah besar
sumber
Saya menyadari bahwa Anda meminta metode QGIS, tetapi berikan jawaban yang lebih jelas:
Catatan:
sumber
Jika Anda membagi garis jalan menjadi segmen di mana setiap segmen benar-benar terkandung oleh segi enam, keputusan Anda di mana segmen garis segi enam yang akan digunakan adalah apakah jarak dari pusat massa segmen jalan split ke setiap titik tengah sisi segi enam kurang dari setengah diameter segi enam (atau kurang dari jari-jari lingkaran yang pas di dalam segi enam).
Jadi, jika Anda (satu segmen pada satu waktu) memilih segmen garis hexagon (di mana setiap segmen adalah sisi hexagon) yang berada dalam jarak jari-jari hexagon, Anda dapat menyalin geometri garis tersebut dan menggabungkannya pada pengidentifikasi unik apa pun yang Anda gunakan untuk dataset jalan Anda.
Jika Anda mengalami masalah saat menggabungkan pengidentifikasi unik, Anda dapat menerapkan buffer dan memilih berdasarkan lokasi hanya pada segmen tersebut untuk menerapkan atribut dataset jalan Anda; dengan begitu Anda tidak perlu khawatir membuat kecocokan salah dengan buffer yang terlalu besar.
Masalah dengan alat sekejap adalah bahwa alat itu terkunci secara membabi buta; sulit untuk menemukan toleransi yang sempurna untuk digunakan. Dengan metodologi ini, Anda akan mengidentifikasi dengan benar segmen garis heksagon mana yang akan digunakan, lalu mengganti geometri data jalan Anda (atau memasukkan geometri ke dalam dataset yang berbeda).
Juga, jika Anda masih memiliki masalah dengan segmen garis yang melompat dari satu sisi segi enam ke sisi yang lain, Anda dapat membagi garis menjadi segmen dengan simpul, menghitung panjang setiap garis, lalu menghapus segmen garis yang lebih besar dari panjang rata-rata satu sisi segi enam.
sumber
Kakap geometri di qgis 3.0 telah dikerjakan ulang dan sekarang memungkinkan pemotretan di antara berbagai jenis geometri. Ini juga memiliki banyak perbaikan. Anda dapat mencoba versi "snapshot harian" untuk mendapatkan akses ke kakap yang ditingkatkan sebelum 3.0 dirilis secara resmi.
sumber