Hálózatelemzés

Töltsük be a következő rétegeket (EOV vetületben):

  • Paksi járás útjai
  • Paksi járás települései (pontszerűen)

Ezt követően válasszuk ki a hálózatelemzés szempontjából jelentékeny utakat:

"fclass" = 'motorway' OR "fclass" = 'motorway_link' OR "fclass" = 'trunk' OR "fclass" = 'trunk_link' OR "fclass" = 'primary' OR "fclass" = 'primary_link' OR "fclass" = 'secondary' OR "fclass" = 'secondary_link' OR "fclass" = 'tertiary' OR "fclass" = 'tertiary_link' OR "fclass" = 'residential' 

A települések rétegnél szelektáljuk a községeket és városokat, szintén mentsük őket egy önálló rétegre:

"fclass" = 'town' OR "fclass" = 'village'

Majd mentsük csak a szelektált elemeket EOV vetületbe.

1. ábra: Paksi járás települései és fontosabb útjai.
1. ábra: Paksi járás települései és fontosabb útjai.

Majd a távolságmátrix elkészítéséhez használjuk a következő kódsorokat:

import processing
import numpy as np

path = "d:/indikatrix-org/halozatelemzes/"
filename1 = "paksi-jaras-muutak"
filename2 = "paksi-jaras-fontosabb-telepulesek"

roads_layer = QgsVectorLayer(path + filename1 + ".shp", filename1, "ogr")
points_layer = QgsVectorLayer(path + filename2 + ".shp", filename2, "ogr")

if len(QgsProject.instance().mapLayersByName(filename1)) == 0:
    QgsProject.instance().addMapLayer(roads_layer)
if len(QgsProject.instance().mapLayersByName(filename2)) == 0:
    QgsProject.instance().addMapLayer(points_layer)

settlements = [feature for feature in points_layer.getFeatures()]
idx = points_layer.fields().lookupField('name')

data = np.zeros((len(settlements),len(settlements)), dtype='int')
names = []

for i in settlements:
   start_point = i.geometry()
   names.append(i.attributes()[idx])
   for j in settlements:
        if i.id() != j.id():
            print(i.attributes()[idx])
            print(j.attributes()[idx])
            end_point = j.geometry()
            output_name = str(i.id()) + "_to_" + str(j.id())
            output_path = path + "routes/" + output_name + ".shp"
            parameters = {  'INPUT': roads_layer,
                            'START_POINT': start_point,
                            'END_POINT': end_point,
                            'STRATEGY': 0,
                            'DEFAULT_DIRECTION': 2, 
                            'DEFAULT_SPEED': 5, 
                            'TOLERANCE': 10, 
                            'OUTPUT': output_path}
            feedback = QgsProcessingFeedback()
            try:
                processing.run("qgis:shortestpathpointtopoint", parameters, feedback=feedback)
                route_layer = QgsVectorLayer(output_path, output_name, "ogr")
                route = [feature for feature in route_layer.getFeatures()]
                cost_idx = route_layer.fields().lookupField('cost')
                data[i.id(),j.id()] = round(route[0].attributes()[cost_idx]/1000)
                del(route_layer)
            except:
                print("Nincs utvonal!") 

Látható, hogy a kódban a "qgis:shortestpathpointtopoint" eljárást hívjuk meg a települések valamennyi (ismétlés nélküli, másodosztályú) kombinációjában. Az eljárás paramétereiről részletesen tájékozódhatunk a következő parancs meghívásával:

processing.algorithmHelp("qgis:shortestpathpointtopoint")

Végül tetszőleges szoftverrel készítsünk egy összefogaló táblázatot az eredményekről:

1. táblázat: A Paksi-járás településeinek közúthálózaton számított távolságmátrixsza.
1. táblázat: A Paksi-járás településeinek közúthálózaton számított távolságmátrixsza.

© Dr. Wirth Ervin