前提・実現したいこと
QGIS,Pythonともに初心者です。
QGISにて、nx.has_pathを用いて最短距離の検索を試みております。
エラーメッセージ
Traceback (most recent call last): File "C:\PROGRA~1\QGIS3~1.14\apps\Python37\lib\code.py", line 90, in runcode exec(code, self.locals) File "<input>", line 1, in <module> File "<string>", line 22, in <module> File "C:\PROGRA~1\QGIS3~1.14\apps\Python37\lib\site-packages\networkx\algorithms\shortest_paths\generic.py", line 40, in has_path nx.shortest_path(G, source, target) File "C:\PROGRA~1\QGIS3~1.14\apps\Python37\lib\site-packages\networkx\algorithms\shortest_paths\generic.py", line 170, in shortest_path paths = nx.bidirectional_shortest_path(G, source, target) File "C:\PROGRA~1\QGIS3~1.14\apps\Python37\lib\site-packages\networkx\algorithms\shortest_paths\unweighted.py", line 223, in bidirectional_shortest_path raise nx.NodeNotFound(msg.format(source, target)) networkx.exception.NodeNotFound: Either source [4000526.346593578, 305276.0959658007, 1413147649, 138.836068, 36.129911] or target [4000423.8004078707, 305864.23483348615, 1413147088, 138.842625, 36.129105] is not in G
該当のソースコード
Python
1import networkx as nx 2 3layer = iface.activeLayer() ###現在のレイヤを取得 4features = layer.getFeatures() ###レイヤ内の地物を取得 5 6G = nx.read_shp(str(iface.mapCanvas().currentLayer().source())) ##レイヤをグラフとして取得 7 8for f in features: 9 atrib = f.attributes() 10 if atrib[2] == 4585630021: ###始点ノードを取得 11 a = f.attributes() 12 if atrib[2] == 2815748288: ###終点ノードを取得 13 b = f.attributes() 14 15print(str(a)) 16print(str(b)) 17 18Shotest_Route = nx.has_path(G, source = a, target = b)
試したこと
現在使用しているQGISのグラフは図のようにノードとエッジに分かれており、これが原因だと考えてこれらを合成しようとベクタレイヤのマージを行いましたが、データ形式の違いからか合成できません。
次に両レイヤの属性の空間結合を試しましたが結合後のレイヤにノードが表示されません。
ソースコード3行目のレイヤの取得にはエッジのレイヤを選択しております(ノードのレイヤを取得しても同じエラーでした)。
補足情報(FW/ツールのバージョンなど)
QGIS3.14
python3.7.0
QGIS上でコードエディタを開いてPythonを書き込んでおります。
あなたの回答
tips
プレビュー