[QGIS]経路検索 qgis.networkanalysis

QGISで行う経路検索について紹介します。

QGISで経路検索を行うに当って、qgis.networkanalysisの使いします。
QGISで行わず、postgreSQLのpgroutingに任せる方法もあります。

1.networkanalysisを使い、経路検索に使用するツリーを作成します。

        index = route_layer.fieldNameIndex(u'route')
        director = nk.QgsLineVectorLayerDirector(route_layer, index, '1', '-1', '0', 1)
        # route_layer 経路検索に使用するラインレイヤ
        # index 経路検索の種類を指定するフィールドのインデックス -1の場合 使用しない
        # 順方向の値 例: "1"
        # 逆方向の値 例:"-1"
        # 双方向 例: "0"
        # デフォルトの方向性 例: "1" 単方向
        properter = nk.QgsDistanceArcProperter()
        director.addProperter(properter)
        crs = self.iface.mapCanvas().mapRenderer().destinationCrs()
        builder = nk.QgsGraphBuilder(crs, topologyTolerance=0.00000005)
        # 座標系、ライン間の接続誤差を指定
        tied_points = director.makeGraph(builder, points)
        # builder と ラインに追加するポイントリスト
        route_graph = builder.graph()

2.検索する経路の始点と終点を指定して、経路検索を実行します。

        start = QgsPoint()  # 経路の始点
        stop = QgsPoint()  # 経路の終点

        tied_start_index = points.index(start)
        tied_stop_index = points.index(stop)
        tstart = tied_points[tied_start_index]
        tstop = tied_points[tied_stop_index]

        # area
        idstart = graph.findVertex(tstart)
        idstop = graph.findVertex(tstop)
        tree, cost = nk.QgsGraphAnalyzer.dijkstra(graph, idstart, 0)
        # 経路検索の結果
        length = cost[idstop]
        # 経路検索の中から、終点までの距離を取得

        point_list = []
        if tree[idstop] == -1:
            # 経路発見できず
            length = 0
            return length, [tstop, tstart]
        else:
            # 経路を発見
            # 終点から辿っていき、ラインを形成するポイントをリストに格納する
            current_point = idstop
            while current_point != idstart:
                arc_index = tree[current_point]
                # ツリーからポイントがあるラインのインデックスを取得
                arc = graph.arc(arc_index)
                # グラフからラインを取得
                in_vertex_index = arc.inVertex()
                # ラインの始点のインデックスを取得
                # 終点の場合はarc.outVertex()
                vertex = graph.vertex(in_vertex_index)
                # グラフから点を取得
                point = vertex.point()
                point_list.append(point)
                current_point = graph.arc(tree[current_point]).outVertex()
            point_list.append(tstart)
        return length, point_list

コメントを残す

メールアドレスが公開されることはありません。