エージェントAI × QGIS:地形スクリーニングの前処理を自動化する実験

「山の周辺で、傾きが30度以上の場所を赤くしてほしい」。今回Willow38では、エージェントAIと地図ソフトQGISを組み合わせ、標高データの取得から地形のスクリーニング(条件に合う場所の抽出)までを動かしてみました。

まず、実際にできたものをご覧ください。左は計算した地面の傾き。右は30度以上の場所を赤く重ねたものです。

計算した斜度と、30度以上の場所の比較
計算した斜度と、30度以上の場所の比較

赤色は今回の抽出条件に合う場所です。危険区域の指定や、安全性の判定を示すものではありません。

地面の高さを記録した「方眼紙」を使う

QGISは、地図に情報を重ねたり、場所に関する計算をしたりできるソフトです。材料にはDEM(数値標高モデル)を使います。地面を細かなマスに区切り、それぞれに高さを記録したデータ。「高さの数字がびっしり書かれた方眼紙」と考えるとイメージしやすいでしょう。

今回は高尾山周辺の、国土地理院の5mメッシュDEMに由来する標高タイルを9枚取得しました。タイルとは、地域ごとに分割されたデータのことです。

実際に取得した標高タイル9枚。同じ色が同じ高さを表す
実際に取得した標高タイル9枚。同じ色が同じ高さを表す

この9枚をつなぎ、計算に使う一枚のデータにしました。解析範囲はタイルから決まり、高尾山の区域や行政界で切り取ったものではありません。

9枚を接合し、計算用の座標系へ変換したDEM
9枚を接合し、計算用の座標系へ変換したDEM

高さの違いから、地面の傾きを計算する

隣のマスと高さがほとんど変わらなければ、平らに近い場所。短い距離で高さが大きく変われば、急な斜面です。高い場所だから急とは限りません。標高と傾きは別の情報です。

高さの違いから計算した斜度。明るい色ほど急な場所
高さの違いから計算した斜度。明るい色ほど急な場所

距離を正しく扱うため、対象地域に合うメートル単位の座標系へ変換してから計算しています。専門的な条件は、JGD2011平面直角座標系IX系(EPSG:6677)、5m出力格子、双一次補間、Horn法による斜度計算です。水平距離と標高の単位をメートルにそろえました。

出力格子を5mにしても元データの精度は上がりません。欠測部分と、周囲の値が足りず計算できない部分は欠測として残しています。

何を自動化すると、作業が楽になるか

従来もQGISで斜度は計算できます。既存の処理モデルやコードによる自動化も可能です。今回試したのは、言葉で伝えた目的を、AIエージェントに実行手順とコードへ落としてもらうことです。

工程 画面で操作する場合 今回のプログラム
データ取得 地域を探して取得 指定位置の周辺9枚を取得
接合と準備 接合・座標系・単位を設定 同じ条件で一括処理
傾きの計算 機能を選んで条件を入力 決めた方法で計算
抽出と保存 条件を入力し、出力を保存 30度以上を抽出し、結果と条件を保存

AIが手順をコードにし、QGISと計算ライブラリが数値処理を担当する。その結果を人が確認します。AIが地図を見て「急そうだ」と推測しているわけではありません。

今回はチャット専用のQGISプラグインを作ったわけではなく、AIエージェントがQGIS付属のPythonを使って処理を実行し、成果をQGISで開きました。条件を変えて調べ直すときにも手順を再利用できます。地域を変える際は、座標系などを再確認します。

どういう手順で開発したか:Codexと道具の分担

今回使ったAIエージェントはOpenAIのCodexです。このチャットで目的を伝え、コードの作成だけでなく、実行環境の確認、処理の実行、結果の点検まで進めました。

  1. 目的を言葉にする。DEMを取得し、斜度を計算し、30度以上を抽出する、と依頼しました。高尾山周辺はCodexが実験用の対象として設定した場所です。現場の専門家が選定・承認した実務条件ではありません。
  2. 環境と仕様を調べる。MacのQGIS 3.44 LTRと付属Pythonを確認。国土地理院の標高タイル仕様とGDALの計算仕様を参照しました。
  3. 処理をコードにする。CodexがPyQGIS(PythonからQGISを操作する仕組み)でterrain.pyを作成。Pythonの通信機能で国土地理院から9枚を取得し、NumPyで数値配列として接合。GDALで座標変換と斜度計算を行い、NumPyで30度以上を抽出しました。PyQGISは成果のレイヤー登録・色設定・プロジェクト保存を担います。
  4. 実行して、失敗を直す。最初は実行環境のネットワーク制限で取得できず、通信許可後に実データ処理が成功しました。出力ファイルを閉じるタイミングと、QGISの表示範囲・濃淡・重ね順も調整しました。
  5. 保存結果と画面を確かめる。保存ラスタの読み直し、抽出条件と欠測の点検、45度の人工斜面によるチェックを実施。Codexの画面操作機能でQGISを開き、表示も確認しました。
  6. 途中成果を説明用の図にする。保存したGeoTIFF(位置情報付き画像)をPythonで読み、Matplotlibというグラフ描画ライブラリで本文の図を作りました。地形をAI画像生成で描いたものではありません。

依頼と判断:私 → 手順作成・実行支援:Codex → 数値処理:Python/NumPy/GDAL → 地図表示:QGIS → 記事の図:Matplotlib

コードはMac上で動き、数値処理を担当します。一方、Codexとの相談にはクラウドAIを使っています。すべてが端末内で完結する構成ではありません。別エージェントによる検算は、今後の発展案です。

結果を数字と、答えのわかる入力で確かめる

斜度の分布。赤い線が今回の抽出条件30度
斜度の分布。赤い線が今回の抽出条件30度

斜度を計算できた351,508画素のうち、30度以上は259,279画素でした。抽出部分の水平投影面積は約6.48km²です。斜面の表面積でも、高尾山全体の集計でもありません。

保存データを読み直し、全有効画素で「斜度30度以上」と抽出結果が一致することを確認しました。欠測が「30度未満」に混ざっていないことも点検しています。

水平5mで高さ5m上がる人工斜面。計算結果が45度になることを確認
水平5mで高さ5m上がる人工斜面。計算結果が45度になることを確認

人工斜面の内部98×98画素で、45度からの誤差が0.001度以内であることを確かめました。これは計算動作のチェックであり、実地形の精度検証ではありません。

QGIS画面では、初期範囲、斜度の濃淡、重ねる順番に手直しが必要でした。修正して、DEM・斜度・赤い抽出結果を切り替え、表示を確認しています。本文の図は保存済みデータから作った説明用の図で、QGIS画面そのもののスクリーンショットではありません。

環境はQGIS 3.44 LTR/GDAL 3.13.3。保存データと画面表示は確認済みですが、表示改善を反映した配布コードの全工程再実行は未実施です。専門的な妥当性の評価、時間短縮やミス削減の測定も今後の課題です。

勝負どころで、脳が元気でいられるように

私の軸足はAIエンジニア・コンサルタントです。地形解析や土木の専門家ではありません。最初に何を調べるかを決め、最後に結果の妥当性を押さえるのは、その道の専門家だと考えています。

その間にある、データを探す、設定を選ぶ、保存先を確認する、といった細かな作業。私が手で進めるなら、ケアレスミスが多くてどうしよう、となりそうです。

細かな作業で疲れ切り、肝心の結果を確かめるときに力が残っていない。そんなことはないでしょうか。

間違えてはいけない初動と、最後の詰め。そのときに、脳が元気でなければならない。勝負どころで疲弊していては、勝負になりません。

繰り返す操作をAIに任せ、大事な判断に使う余力を残す。今回探りたかったのは、その分担です。

AI × アプリケーション × 専門家をつなぐ

エージェントAIが処理を組み立て、アプリケーションが計算を担い、専門家が経験と知識で方向と結果を押さえる。どこを任せ、どこで確かめるか。途中成果をどう残し、失敗をどう見つけるか。

そのトータルコーディネートをすることが、AIコンサルタントの仕事だと私は考えています。

発展形として、別エージェントによる検算や、独立した計算方法との照合も考えられます。今回は別エージェントの検算は未実施です。AI同士の答えが一致しても、専門的な妥当性の保証にはなりません。最初の方向づけと最後の押さえは専門家。その人が力を使えるよう、間の仕事を組み立てていきたいのです。


図の出典:国土地理院DEM5A標高タイルを加工(人工斜面の図を除く)。

参考:国土地理院・標高タイル仕様/GDAL・斜度計算

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA