Več

Najkrajša pot od točk v eni plasti do točk v drugi plasti po cestah v QGIS

Najkrajša pot od točk v eni plasti do točk v drugi plasti po cestah v QGIS


Iščem način za izračun najkrajše poti od naslovov do podzemnih postaj prek omrežja cest.

Imam vtičnik Road Graph, vendar so naslovi in ​​postaje podzemne železnice točkovne plasti, ki se ne prekrivajo z oglišči v sloju cest.

Ali v QGIS obstaja način za izračun najkrajše razdalje od točk naslova / postaje podzemne železnice do cest, ustvarjanje točk na teh lokacijah in nato izračunavanje najkrajše razdalje prek cestnega omrežja?

  • črni kvadrati - naslovi
  • beli krogi - postajališča podzemne železnice
  • sive črte - ceste


Potrebovali boste nekaj skriptov za Python, ker za to težavo trenutno ni rešitve GUI.

Za začetek si oglejte plast moje točke za usmerjanje skripta za obdelavo, ki temelji na knjižnici za analizo omrežja QGIS. (To je ista knjižnica, ki jo uporablja vtičnik za graf ceste.)

 ## Orodja za usmerjanje = skupina ## točke = vektorska točka ## omrežje = vektorska črta ## route = izhodna vektorska črta iz PyQt4.QtCore import * iz PyQt4.QtGui import * iz qgis.core import * iz qgis.gui import * from qgis.networkanalysis import * from processing.tools.vector import VectorWriter point_layer = processing.getObject (points) network_layer = processing.getObject (network) writer = VectorWriter (route, None, [QgsField ("order", QVariant.Int)], network_layer.dataProvider (). geometryType (), network_layer.crs ()) # pripravi graf vl = network_layer director = QgsLineVectorLayerDirector (vl, -1, ",", ", 3) Properter = QgsDistanceArcProperter () director.addProperter (pravilno crs = vl.crs () builder = QgsGraphBuilder (crs) # pripravi točke features = processing.features (point_layer) point_count = point_layer.featureCount () points = [] za f v features: points.append (f.geometry (). asPoint ()) linkedPoints = director.makeGraph (graditelj, točke) graf = builder.graph () route_vertices = [] za i v obsegu (0, str oint_count-1): progress.setPercentage (int (100 * i / count_count)) from_point = vezanih točk [i] do_point = vezanih točk [i + 1] from_id = graph.findVertex (from_point) to_id = graph.findVertex (to_point) (drevo , stroški) = QgsGraphAnalyzer.dijkstra (graf, from_id, 0), če je drevo [to_id] == -1: nadaljevanje # prezrite ta par točk else: # zberite vse točke med točkami route_points = [] curPos = to_id while (curPos ! = from_id): route_points.append (graph.vertex (graph.arc (drevo [curPos]) .inVertex ()) .point ()) curPos = graph.arc (drevo [curPos]) .outVertex () route_points.append (from_point) # dodaj funkcijo fet = QgsFeature () fet.setGeometry (QgsGeometry.fromPolyline (route_points)) fet.setAttributes ([i]) writer.addFeature (fet) del zapisovalnik 

Imel sem zelo podoben problem, ko sem na določeni razdalji po cesti od dostopnih točk po kolesarski stezi našel dobrine (restavracije itd.) Rešil sem ga s spodnjim skriptom orodjarne, ki je spremenjena različica skripta @ underdark, ki sem ga našel s podobnim vprašanjem tukaj.

Skript zahteva dvotočkovne vektorske plasti, vektorski sloj omrežne črte in največjo sprejemljivo razdaljo poti ter poišče najkrajšo pot med vsakim parom dostopnih / ugodnih točk. Nato za vsako pot, krajšo od dane razdalje, skript zapiše pot, id-je za povezane točke dostopa in ugodnosti ter razdaljo poti v vektor izhodne črte. (Če je podana razdalja enaka ali manjša, so vse poti prikazane ne glede na dolžino.)

Atribute vektorja točke boste morali spremeniti tako za dostop (vhod v podzemno železnico) kot za sloje ugodnosti (naslove), tako da dodate stolpec z imenom "acam_id", ki vsebuje enolično identifikacijsko številko za vsako točko.

# Opredelitev vhodov in izhodov # ================================== ## Orodja za usmerjanje = group ## dostop = vektorska točka ## udobja = vektorska točka ## omrežje = vektorska črta ## razdalja = številka 1600 ## Poti = izhodna vektorska črta # Telo algoritma # ================== ================ iz PyQt4.QtCore import * iz PyQt4.QtGui import * iz qgis.core import * iz qgis.gui import * iz qgis.networkanalysis import * from processing.tools .vector import VectorWriter import processing processing.setText ("Building Network ...") access_layer = processing.getObject (access) udobja_layer = processing.getObject (udobja) network_layer = processing.getObject (network) writer = VectorWriter (Routes, None, [QgsField ("acc_id", QVariant.Int), QgsField ("amen_id", QVariant.Int), QgsField ("length", QVariant.Double)],  network_layer.dataProvider (). geometryType (), network_layer.crs ()) # pripravi graf vl = network_layer director = QgsLineVectorLayerDirector (vl, -1, ",", ", 3) Properter = QgsDistanceArcProperter () director.ad dProperter (pravilno) crs = vl.crs () builder = QgsGraphBuilder (crs) # pripravi točke access_features = processing.features (access_layer) access_count = access_layer.featureCount () udobja_features = obdelava.features (udobja_layer) udobja_številka = udobja_naložbe. point_count = dostop_štetje + ugodnosti_število točk = [] ids = [] za f v access_features: points.append (f.geometry (). asPoint ()) ids.append (f ['acam_id']) za f v features_features: points. append (f.geometry (). asPoint ()) ids.append (f ['acam_id']) linkedPoints = director.makeGraph (graditelj, točke) graph = builder.graph () route_vertices = [] progress.setText ("Obdelava Poti ... ") za i v obsegu (0, dostop_štetje): progress.setPercentage (int (100 * i / dostop_štetje)) from_point = vezanePoints [i] from_id = graph.findVertex (from_point) (drevo, stroški) = QgsGraphAnalyzer.dijkstra (graf, od_id, 0) za j v obsegu (število_dostopov, število_točk): to_point = vezane točke [j] to_id = graph.findVertex (to_point) if drevo [to_id]! = - 1 in (cost [to_id] <= distance or distance <= 0): # zberemo vse točke med točkama route_points = [] curPos = to_id while (curPos! = From_id): route_points.append (graph.vertex (graf. arc (drevo [curPos]) .inVertex ()) .point ()) curPos = graph.arc (drevo [curPos]) .outVertex () route_points.append (from_point) # dodaj funkcijo fet = QgsFeature () fet.setGeometry (QgsGeometry.fromPolyline (route_points)) fet.setAttributes ([ids [i], ids [j], cost [to_id]]) writer.addFeature (fet) del zapisovalnik

Poglej si posnetek: PREPROSTA IN LEPA KROŠČANA PREPRODA