Lebih banyak lagi

Matrik Laluan terpendek dengan QGIS / GRASS

Matrik Laluan terpendek dengan QGIS / GRASS


Saya menganalisis grid elektrik voltan tinggi Jerman. Saya mengekstrak data dari OSM, mengimportnya dalam QGIS dan mempermudah strukturnya dengan tangan, secara khusus membuat simpul tunggal di mana talian kuasa disambungkan berbeza dengan mempunyai banyak pencawang voltan tinggi dengan geometri yang rumit. Pada akhirnya, saya ingin mengeksport rangkaian itu dan menggunakannya dalam GAMS untuk menjalankan model pengoptimuman di atasnya. Tetapi cerpen panjang. Saya mempunyai dua fail .shp, WGS 84 CRS standard.

  1. fail yang mengandungi rangkaian sebagai garis (sekitar 250)
  2. fail yang mengandungi semua nod (kira-kira 350) dalam rangkaian (di mana garis kuasa bersilang)

Sekarang saya ingin mengekstrak matriks jarak terpendek yang mengandungi jarak antara semua nod dalam fail 2, setelah menggunakan fail 1 sebagai rangkaian "jalan" saya.

Saya telah membaca beberapa jawapan yang menunjukkan python, GRASS atau PostGIS dengan pgrouting tetapi tidak ada yang berjaya untuk saya. Saya baru menggunakan Python, GRASS dan PostGIS, yang pasti tidak banyak membantu.

(hampir terlupa. Mac OS 10.7.5, GRASS 7.0, QGIS 2.8.1, PostgreSQL 9.0.13, PostGIS 2.1.7, pgrouting 2.0.0)


Ok, kemas kini setelah mencuba beberapa jam lagi. Saya rasa saya menyelesaikan masalah, lebih kurang secara tidak sengaja.

Oleh kerana saya mendigitalkan / mempermudah struktur grid dengan tangan, salah satu masalahnya adalah, bahawa beberapa garis akan mempunyai persimpangan antara titik awal dan akhir mereka. Nampaknya idea yang baik untuk membiarkan QGIS menangani ini dan menggunakan 'Split lines with lines' dari kotak alat Pemprosesan.

Setelah melakukan ini, saya mengimport grid dan node sebagai fail shp ke GRASS. Node agak mudah diperoleh melalui alat analisis vektor QGIS 'Line Intersections'. Setelah kedua-dua lapisan diimport dalam GRASS, saya menggunakan v.net dengan operasi: connect dan option -c untuk melampirkan lapisan nod ke lapisan garis (simpul sebagai lapisan 2). Sebagai alternatif, operasi: node hampir sama, kerana node yang dikira sama dengan yang saya import dalam fail shp saya dari QGIS. Cuma bezanya: node mendapat ID yang berbeza, jadi anda tidak dapat mengekalkan skema ID peribadi untuk mengenal pasti titik-titik tertentu di QGIS.
Walaupun begitu, kerana rangkaian sekarang "disiapkan", fungsi v.net.allpairs dapat digunakan. Semua baris saya berada di lapisan 1, semua nod berada di lapisan 2. Memilih ini, mengaktifkan pengiraan geodesi (fail shp saya adalah standard WGS 84) dan menunggu beberapa minit melakukan tugas itu. Setelah tidak menetapkan sebarang kos, lajur 'from_cat' dan 'to_cat' dalam jadual atribut lapisan vektor output sekarang adalah ID QGIS lama saya, dan lajur kos adalah jarak antara node dalam km.

Saya harap keterangan ini dapat membantu orang lain seperti saya, tidak terlalu biasa dengan SQL / Python dll dan mencari jalan penyelesaian yang cukup mengklik. Saya memerlukan jadual jarak terpendek untuk model GAMS dan fikir ini akan menjadi sebiji kek.


NetworkX (http://cheeseshop.python.org/pypi/networkx/) adalah pakej Python dengan banyak fungsi untuk analisis grafik dan rangkaian. Dengan pakej ini dipasang anda dapat menyelesaikan masalah menghasilkan matriks jarak terpendek menggunakan konsol Python di QGIS.

Yang anda perlukan hanyalah lapisan rangkaian (tepi) dengan topologi yang sah. Bahagian tepi memerlukan sekurang-kurangnya 3 atribut: ID simpul permulaan dan simpul akhir setiap tepi, dan panjang setiap tepi. Dalam kod berikut, saya mengharapkan ini sebagai medan dengan indeks 1 hingga 3. Anda boleh membuat skema data ini menggunakan pertanyaan SQL yang sesuai atau gabungan spasial, diikuti dengan (bidang) pengiraan panjang garis.

Jadikan lapisan rangkaian sebagai lapisan aktif dan kemudian di konsol Python:

import networkx sebagai nx aLayer = qgis.utils.iface.activeLayer () DM = nx.Graph () DM.add_weighted_edges_from ([(feat [1], feat [2], feat [3]) untuk prestasi di aLayer.getFeatures ( )]) cetak nx.all_pairs_dijkstra_path_length (DM)

Perintah cetakan pada baris terakhir menghasilkan hasilnya sebagai kamus kamus. Daripada mencetak output ke konsol, struktur ini dapat digunakan untuk pemprosesan lebih lanjut atau ditulis ke fail.

Dengan cara ini banyak algoritma dalam NetworkX dapat digunakan untuk geoprosesan di QGIS.


Tonton videonya: GRASS in QGIS