プロジェクト: Bridge Importance Scoring MVP
対象: 山口市791橋の重要度定量評価
実行日: 2026年3月28日
実行時間: 36分28秒
NetworkXの媒介中心性(Betweenness Centrality)を活用し、山口市の橋梁791橋を対象に、都市交通ネットワークにおける重要度を定量的に評価するMVPを実装・実行した。
- 「失われれば甚大な影響が出るボトルネック橋梁」を特定
- 異種グラフ(橋梁・道路・建物・河川)を統合した定量評価
- 説明可能なスコアリング結果の生成
症状:
- 初回実行時、OSM street network取得中に処理が停止
- 処理対象: 4,293橋(山口県全体)
- 処理範囲: 18,720.5 km²(山口県全体の約3倍)
- バッファ: 5km(広すぎる)
原因:
- データセットに山口県全体の橋梁が含まれていた(山口市のみと誤認)
- 5kmバッファが全橋梁の凸包に適用され、範囲が極大化
- OSMnxのデフォルトタイムアウト設定なし
解決策:
# config.yaml に追加
data:
filter:
city: "山口市"
city_column: "所在地" # ← カラム名を正確に特定
boundary:
buffer_km: 1.0 # 5km → 1km に縮小# graph_builder.py に追加
ox.settings.timeout = 300 # 5分タイムアウト設定
ox.settings.use_cache = True # キャッシュ有効化効果:
- 処理対象: 4,293橋 → 791橋(81.6%削減)
- 処理範囲: 18,720 km² → 1,948 km²(89.6%削減)
- OSMデータ取得成功(36秒で完了)
症状:
WARNING: City column '蟶ら伴譚・ not found.
原因:
- Excelファイルを読み込んだ際、ログ出力時の文字エンコーディングが不適切
- 設定ファイルで指定した列名「市町村」が実際には存在しない
解決策:
# 実際のカラム名を確認
df = pd.read_excel('data/Bridge_xy_location/YamaguchiPrefBridgeListOpen251122_154891.xlsx')
print(df.columns.tolist())
# → '所在地'カラムに住所が格納されていることを確認# config.yamlを修正
filter:
city_column: "所在地" # "市町村" → "所在地"教訓:
- データファイルの実際の構造を事前に確認する
- カラム名の想定と実態を必ず検証する
症状:
ERROR: module 'osmnx' has no attribute 'geometries_from_polygon'
原因:
- OSMnxのバージョン更新により、APIが変更された可能性
- 建物・バス停データの取得で失敗
影響:
- 建物・バス停データは取得できなかったが、プログラムはエラーハンドリングにより続行
- 橋梁と道路ネットワークのみでグラフを構築
- 媒介中心性の計算には影響なし(道路ネットワークが主体)
暫定対応:
- エラーを無視して続行(try-exceptで処理済み)
- 道路ネットワークのみでも十分な分析が可能
今後の対応:
- OSMnxの最新ドキュメントを確認し、正しいAPIに更新
ox.features_from_polygon()など代替APIを調査
| ステップ | 処理内容 | 実行時間 | 割合 |
|---|---|---|---|
| STEP 1 | データ読み込み | 4秒 | 0.2% |
| STEP 2 | グラフ構築 | 56秒 | 2.6% |
| └ OSM取得 | 道路ネットワーク | 36秒 | 1.7% |
| └ スナッピング | 橋梁→道路 | 18秒 | 0.8% |
| STEP 3 | 媒介中心性計算 | 35分22秒 | 97.0% |
| STEP 4 | 説明文生成 | 0.02秒 | 0.0% |
| STEP 5 | 結果保存 | 6秒 | 0.3% |
| 合計 | - | 36分28秒 | 100% |
重要な知見:
- 媒介中心性の計算が処理時間の97%を占める
- グラフサイズ: 18,998ノード、25,666エッジ
- NetworkXの
betweenness_centrality()はO(n³)の計算量 - 今後の高速化には、サンプリング手法や近似アルゴリズムの検討が必要
- 対象橋梁数: 791橋(山口市)
- グラフ規模: 18,998ノード、25,666エッジ
- スナップ成功率: 767/791橋(97.0%)
- 処理範囲: 1,948.1 km²
- スコア範囲: 0.00 - 80.00
- 平均スコア: 25.30
- 中央値: 21.48
- 標準偏差: 11.77
| カテゴリ | 橋梁数 | 割合 |
|---|---|---|
| 高重要度(high) | 6橋 | 0.8% |
| 中重要度(medium) | 41橋 | 5.2% |
| 低重要度(low) | 85橋 | 10.7% |
| 極低重要度(very_low) | 659橋 | 83.3% |
| 順位 | 橋梁名 | 所在地 | スコア | 媒介中心性 | 特徴 |
|---|---|---|---|---|---|
| 1 | 流通ICオンランプB橋 | 山口市小郡上郷 | 80.00 | 0.3083 | 2005年架設、7.2m |
| 2 | 矢形堤橋 | 山口市小郡上郷 | 79.99 | 0.3082 | 2007年架設、71.0m、河川近接 |
| 3 | 第一御堀橋 | 山口市大内御堀 | 71.69 | 0.2656 | 1963年架設、8.0m |
| 4 | 千坊北B橋 | 山口市大内御堀 | 71.46 | 0.2644 | 2.4m、河川至近 |
| 5 | 郷之尾堤大橋 | 山口市朝田 | 70.66 | 0.2603 | 2008年架設、17.9m |
| 6 | 下榎B橋 | 山口市周布町 | 70.44 | 0.2591 | 1965年架設、2.9m |
| 7 | 葵橋 | 山口市葵 | 69.39 | 0.2538 | 1931年架設(築93年) |
| 8 | 鳴滝橋 | 山口市下小鯖 | 69.37 | 0.2536 | 1987年架設、15.6m、河川至近 |
| 9 | 平川大橋 | 山口市宮島町 | 69.02 | 0.2519 | 1974年架設、110.3m(最長) |
| 10 | 上平井B橋 | 山口市平井 | 69.02 | 0.2518 | 3.6m、河川至近 |
- 河川近接橋梁(50m以内): 413橋(52.2%)- 洪水リスク高
- 塩害リスク橋梁(海岸3km以内): 91橋(11.5%)
- トップ10のうち6橋が河川近接、洪水時の影響大
- 小郡地区が最重要エリア: トップ2橋梁が小郡上郷に集中
- 流通ICへのアクセス路として機能、ボトルネック性が高い
- 葵橋(1931年架設、築93年)が7位にランクイン
- 老朽化と重要度の両面から優先的な維持管理が必要
- トップ10のうち6橋が河川近接(50m以内)
- 洪水時に複数の重要橋梁が同時に通行不能になるリスク
- 平川大橋(110.3m)が9位、規模と重要度の相関
- 必ず対象データの実態を確認する
- カラム名、データ範囲、座標系、文字コード
- フィルタリングロジックは柔軟に設定可能にする
- ログで処理対象数・範囲を明示的に出力
- 初期段階で処理範囲を絞り込む(市町村フィルタ、バッファ縮小)
- タイムアウト設定、キャッシュ活用
- 大規模データには近似アルゴリズムを検討
- 外部API(OSM)のエラーに対する fallback 処理
- 部分的な失敗でも処理を継続できる設計
- エラー時も最小限の出力を生成
- 媒介中心性計算は**O(n³)**で極めて重い
- 18,998ノードで35分 → より大規模(10万ノード超)では実用不可
- サンプリング手法の導入が必須
-
OSMnx APIの修正
- 建物・バス停データの取得を正常化
- 最新APIドキュメントに準拠
-
可視化の追加
- Foliumによる対話的地図の生成
- スコア分布のヒートマップ
-
説明文の充実
- 橋梁名を含めた日本語説明
- 具体的な迂回路分析
-
媒介中心性の高速化
- サンプリング手法の導入(k-sample approximation)
- 並列計算の実装(multiprocessing)
-
グラフの効率化
- 不要エッジの削除
- クラスタリングによる階層化
-
リアルタイム更新対応
- 増分計算アルゴリズムの検討
- OSMキャッシュの定期更新
-
PyTorch Geometricへの拡張
- GNN(Graph Neural Network)による予測モデル
- 時系列データ(交通量・健全度)の統合
-
シナリオ分析
- 特定橋梁の通行止めシミュレーション
- 災害時の迂回路分析
-
他都市への展開
- 設定ファイルのみで他都市に対応
- 自動化パイプラインの構築
| ファイル | サイズ | 内容 |
|---|---|---|
bridge_importance_scores.csv |
577 KB | 全791橋の詳細データ |
bridge_importance_scores.geojson |
1,596 KB | 地図可視化用 |
bridge_importance_report.md |
3.7 KB | 詳細レポート |
top10_critical_bridges.csv |
4 KB | 最重要10橋 |
heterogeneous_graph.pkl |
2,512 KB | グラフデータ(再利用可) |
metadata.yaml |
44 KB | 実行メタデータ |
bridge_importance_score/
├── main.py # メインパイプライン
├── config.yaml # 設定ファイル(重要!)
├── data_loader.py # データ読み込み(フィルタリング含む)
├── graph_builder.py # グラフ構築(OSMnx利用)
├── centrality_scorer.py # 媒介中心性計算・スコアリング
├── narrative_generator.py # 説明文生成
├── visualization.py # 可視化(未実装)
├── utils.py # ユーティリティ
├── requirements.txt # 依存パッケージ
└── setup_and_run.py # セットアップスクリプト
山口市791橋を対象とした橋梁重要度スコアリングMVPの実装・実行に成功した。
成功要因:
- 処理範囲の適切な絞り込み(市町村フィルタ、バッファ縮小)
- タイムアウト設定とエラーハンドリングの実装
- データ構造の事前検証とログによる可視性確保
主要な課題:
- 媒介中心性計算の計算量が大きく、スケーラビリティに限界
- より大規模データへの対応には近似アルゴリズムが必須
実用性:
- 791橋規模では実用的な実行時間(36分)
- 生成されたスコアリング結果は解釈可能で、優先順位付けに活用可能
- トップ10橋梁は定量的根拠を持つ重要インフラとして特定
本MVPは、都市インフラの定量的評価手法として有効性を実証した。今後、可視化の充実と計算効率化により、実運用レベルのツールへと発展させる基盤が整った。
文責: Bridge Importance Scoring MVP 実行チーム
最終更新: 2026年3月28日