地図上で範囲を指定してGISデータを集める ― Docker + GPU + Ollama + OpenLayersの取得エージェント r004
はじめに
GISデータを使う前には、提供元ごとに配布ページを探し、対象地域を確認し、座標系や形式をそろえる作業があります。広い範囲のデータを入手しても、解析で使うのはその一部だけ、ということも少なくありません。
GIS Data Agentは、地図で指定した範囲に必要なデータを集め、使う部分を抽出してGeoPackageやGeoTIFFに保存するWebアプリです。フォームから取得元を選ぶほか、Ollamaに自然文を読ませて取得条件を整理できます。r004がこのアプリの最初の公開バージョンです。
今回は、産総研の地質図を含む登録済みの取得元から、必要な部分の成果を作る手順を紹介します。防災科研の地すべり地形も設定に含めていますが、利用条件を確認するまで無効にしています。
注意点
実行にはGPUが必要です。 Docker ComposeからNVIDIA GPUをOllamaに渡し、qwen3:8bを読み込んで推論できる環境を用意してください。GPUの型番だけで動作を決めつけず、モデルの取得と実際の応答を起動時に確認します。
できることと取得元
ブラウザーで矩形の範囲を描くか、西・南・東・北の経緯度を入力します。取得元と出力座標系を選んで計画を確認し、取得を開始します。フォームで条件を指定しても、Ollamaに自然文を読ませても、取得計画を確認してから実行できます。
| 提供元 | r004で扱うデータ | 状態 |
|---|---|---|
| 国土地理院 | DEM10B標高タイル | 利用可能 |
| PLATEAU | 建物、標高、道路、土地利用 | 利用可能。地域によって整備状況が異なる |
| 国土交通省・国土数値情報 | 静岡県の行政区域、河川 | 利用可能。登録済みの配布ファイルに限る |
| 産総研 | 地質区分、地質境界・断層などの線 | 豊橋5237・静岡5238の4項目を登録 |
| 防災科研 | 地すべり移動体、滑落崖・側方崖 | 豊橋5237の2項目を同梱。初期状態では無効 |
| ローカルファイル | GeoPackage、GeoJSON、単バンドGeoTIFF |
data/incoming/から読み込む |
産総研の地質図は20万分の1日本シームレス地質図V2の配布ZIPを使います。線データには地質境界なども含まれ、すべてを断層として扱うことはできません。また、この縮尺の地質図を個別施設の詳細な地盤調査の代わりにはできません。
防災科研の地すべり地形GISデータは、商用利用時に著作権の使用許諾申請が必要と案内されています。利用条件を確認したうえで、config/sources.d/nied_landslide_optional.yamlの対象項目をenabled: trueに変更します。地すべり地形の判読結果は、現在の危険度をそのまま示すものではありません。
r004で扱う地質図は登録済みの区画を対象にしています。全国の区画を範囲から自動検索する機能ではありません。
データと設定ファイルの置き場所
手元のGISファイル
自分で用意したファイルは、展開したプロジェクトのdata/incoming/に置きます。ホストのgis_data_agent_r004/data/incoming/が、アプリコンテナー内では/data/incoming/として見えます。画面からファイルをアップロードする方式ではありません。
gis_data_agent_r004/
├── .env
├── config/
│ ├── sources.yaml
│ └── sources.d/
└── data/
├── incoming/ ← 手元のGISファイルを置く
├── output/ ← 取得・変換した成果と原本
└── state/ ← ジョブ履歴
対応する拡張子は.gpkg、.geojson、.tif、.tiffです。GeoPackageは空間レイヤーごとに一覧へ表示されます。GeoTIFFは単バンドを扱います。ローカルファイルは1件64 MiBまでで、座標系や内容は取得時に検査します。Shapefileの一式やZIPをこのフォルダーへ置くだけでは、ローカルファイルとして自動登録されません。必要ならGeoPackageへ変換して置きます。
cd gis_data_agent_r004
mkdir -p data/incoming/hamamatsu
cp /path/to/roads.gpkg data/incoming/hamamatsu/
cp /path/to/dem.tif data/incoming/hamamatsu/
ファイルを置いた後、画面の「取得元を更新」を押してください。「ローカルファイル」にhamamatsu/roads.gpkgなどが表示されます。元ファイルはincomingに残り、取得ジョブではraw/へコピーしたうえで指定範囲の成果を作ります。利用者のUID/GIDでファイルを読める権限も確認してください。
r004が接続する公開データ
公開データをあらかじめ手動でダウンロードする必要はありません。取得元を選んで実行すると、アプリが登録済みの配布先へ接続します。実際のURLや配布年はsrc/gis_agent/catalog_builtin.yamlとconfig/sources.d/*.yamlで確認できます。
| データ | 配布元・データの場所 | r004での扱い |
|---|---|---|
| DEM10Bと背景地図 | 国土地理院・地理院タイル一覧 | 標高タイルからGeoTIFFを作成します。背景地図のタイルはブラウザーが直接取得します |
| PLATEAUの建物・標高・道路・土地利用 | PLATEAU配信サービス・CityGML | APIで対象データを検索し、該当するCityGMLファイルを取得します |
| 静岡県の行政区域 | 国土数値情報・行政区域(2026年) | 登録済みの静岡県ZIPから抽出します |
| 静岡県の河川 | 国土数値情報・河川 | 登録済みの2008年ZIPを使います。非商用の利用条件を確認してください |
| 地質区分・地質境界等 | 産総研・20万分の1日本シームレス地質図V2 | 豊橋5237・静岡5238の登録済み図郭を取得します |
| 地すべり地形 | 防災科研・地すべり地形GISデータ | 豊橋5237の設定を同梱していますが、初期状態では無効です |
配布ページと、実際に使うZIP・タイルのURLは区別します。特に国土数値情報と産総研は、登録された地域・図郭と年度に限ります。サイトに別地域のファイルがあっても、r004が自動で全国を探すわけではありません。
この版では自動接続しないサイト
次のサイトもGISデータを探す入口になりますが、r004の取得元には登録していません。手動で入手したデータを使う場合は、利用条件と座標系を確認し、対応するGeoPackage・GeoJSON・単バンドGeoTIFFに整えてdata/incoming/へ置きます。
| サイト | 探せるデータの例 |
|---|---|
| 静岡県オープンデータ | 表層地質図など |
| e-Stat 統計地理情報システム | 境界データ、地域メッシュ、統計表 |
| G空間情報センター | 自治体などが公開する地理空間データ |
| OpenStreetMap / Overpass API | 道路、建物、施設など |
| HydroBASINS | 広域の流域界 |
| Natural Earth | 広域の河川・湖沼・行政界 |
手動取得したファイルも、変換前の形式や容量がr004のローカル入力条件に合わなければ、そのままでは読み込めません。e-Statの統計表と境界の結合、OSMの問い合わせ、HydroBASINSの区画選択はr004には実装していません。
「必要な範囲だけ」の意味
r004では、地図に描いた矩形か、西・南・東・北の経緯度で対象を指定します。座標はEPSG:4326です。流域界のポリゴンを読み込んで範囲に使う機能や、地名だけから範囲を決める機能はありません。
| 処理 | r004で行うこと |
|---|---|
| 原本の取得 | 配布元が県や図郭単位のZIPを公開している場合は、その単位でダウンロードします。PLATEAUは検索されたファイルを1件ずつ処理します |
| 成果の作成 | 指定範囲に交差する地物を選ぶか、境界で切り取ってGeoPackageへ保存します。DEMは標高タイルから範囲に合うGeoTIFFを作ります |
つまり、保存する成果を必要な範囲に絞ることと、ダウンロード量を同じ割合で減らすことは別です。元ZIPが図郭全体なら、原本は図郭単位で取得します。
「元の形で残す」では、範囲に交差した地物の全形状を残します。道路や河川が範囲外まで続くことがあります。「境界で切り取る」を選べば、成果の形状を指定範囲内に収められます。PLATEAUの道路と土地利用は、どちらの設定でも範囲内に切り取ります。PLATEAUの標高は高さを保持するため、元の形で残す設定で取得します。建物を境界で切ると面積や形状の意味が変わるので、用途に応じて選びます。
アプリの構成
画面、自然文、MCPはいずれも共通の取得処理につながります。Ollamaは登録済みの取得元IDと抽出方法を選びます。URL、保存先、実行コードを作って渡すことはありません。取得とGIS変換はPython側で行い、地図データそのものをLLMの会話に詰め込む構成にはしていません。
MCPは起動済みのAPIを呼ぶ窓口です。search_datasets、plan_acquisition、start_acquisition、get_job_statusを提供します。検索できるのは登録済みの取得元と手元のファイルで、Web全体の自動検索ではありません。
取得元は組み込みカタログとconfig/sources.d/*.yamlから読み込みます。産総研の4項目は、既存のZIP取得・ベクター変換処理を使います。出力座標系はJGD2011の日本平面直角座標系、第Ⅰ系から第XIX系(EPSG:6669~6687)です。初期値は第Ⅷ系のEPSG:6676ですが、地図の中心を変えても系番号は自動変更しません。
なぜOllamaを使うのか
取得元が増えると、「河川と道路が欲しい」「地質図をこの範囲で切り取りたい」といった依頼を、画面の項目に置き換える手間も増えます。Ollamaは、その文章を読み、登録済みの取得元IDと抽出方法を選ぶ役割です。地図で指定した範囲と出力EPSGは利用者の値をそのまま使います。条件が足りない場合は確認を求めます。返された取得元IDが登録されていなければ、アプリ側で計画を拒否します。
ここでLLMに任せるのは条件の整理までです。ダウンロード、範囲抽出、座標変換、GeoPackageへの保存は決まったPythonの処理が行います。Ollamaが返したIDもアプリ側で登録済みか再確認します。自然文を使わない場合はフォームから同じ取得処理を利用できます。
Ollamaをローカルで動かすのは、入力した依頼文や地図の範囲を外部のLLMサービスへ送らずに条件を整理したいからです。大きなGISファイルをLLMへ渡す必要もありません。既定のqwen3:8bは起動時に取得し、実際の依頼文で取得元を選べるか確認します。
ローカル処理と外部への通信
「ローカルLLMを使う」ことと「インターネットに接続しない」ことは違います。推論と成果の保存はローカルですが、公開GISデータを取りに行くときは外部へ通信します。
| 操作 | 通信・保存先 |
|---|---|
| 画面の操作、取得計画、GIS変換、履歴 | ブラウザーとローカルのアプリ間で処理し、成果はホストのdata/へ保存します |
| 自然文による条件整理 | アプリからCompose内部のOllamaへ送ります。依頼文と指定範囲を含みますが、外部のLLM APIは呼びません |
| 初回の準備 | DockerイメージやPython依存ライブラリ、qwen3:8bの取得には外部通信が必要です。モデルはOllamaの永続ボリュームへ保存します |
| GISデータの検索・取得 | 国土地理院、PLATEAU、国土数値情報、産総研など、選んだ提供元の公開サイトへ接続します。接続先によっては、検索条件や指定範囲など取得に必要な情報も送られます |
| 背景地図の表示 | 初期表示の標準地図や、選択した地理院の地図タイルをブラウザーが直接取得します。初期表示時にも通信が発生します |
Ollamaのポートはホストへ公開していません。アプリとOllamaはCompose内部で接続します。一般のHTTP取得はカタログに登録されたホストのHTTPS URLに限り、転送先も確認します。これはアプリが取得するGISデータに対する制限で、ブラウザーの背景地図やDocker・モデルの初回取得を止める設定ではありません。
起動例の--bind 0.0.0.0は、同じネットワーク上の別の端末から画面へ接続する場合の指定です。手元のPCだけで開くなら--bind 127.0.0.1に変更します。いずれの場合も、公開データの取得や初回準備に必要な外向き通信は別に発生します。
起動する
アプリのZIPにはcompose.yaml、compose.gpu.yaml、Dockerfile、Pythonの依存定義、Web画面、取得元の設定が入っています。ホスト側にはDocker Engine、Docker Compose plugin、Python 3、NVIDIAドライバー、NVIDIA Container Toolkitを用意します。qwen3:8bを読み込んで推論できるGPUが必要です。
必要なファイルとデータは次のように分かれます。OpenLayersの画面用ファイルは配布ZIPに含まれています。
| 項目 | 用意する方法 |
|---|---|
| アプリ本体と設定 |
gis_data_agent_r004.zipを展開します。compose.yaml、config/、画面・Pythonコードが入っています |
.env |
.env.exampleをコピーして、UID/GID、地図の初期位置、必要なら取得量の上限を設定します |
| Ollamaモデル |
start.shがqwen3:8bを取得します。初回は外部通信と保存容量が必要です |
| 公開GISデータ | 起動時には不要です。対象の取得元を選んだときに配布先へ接続します |
| 手元のGISファイル | 任意です。使う場合だけdata/incoming/へ置きます |
ZIPを展開して.envを用意します。コピーした設定のLOCAL_UIDとLOCAL_GIDは、実行するUbuntu/WSL2ユーザーの値に合わせます。
unzip gis_data_agent_r004.zip
cd gis_data_agent_r004
cp .env.example .env
sed -i "s/^LOCAL_UID=.*/LOCAL_UID=$(id -u)/; s/^LOCAL_GID=.*/LOCAL_GID=$(id -g)/" .env
浜松付近を初期表示する場合は、.envの地図設定を次の値にします。これは表示中心であり、取得範囲ではありません。
GIS_MAP_CENTER_LON=137.73
GIS_MAP_CENTER_LAT=34.71
GIS_MAP_ZOOM=11
GPU構成で起動します。Ollamaのqwen3:8bは起動スクリプトが取得し、Dockerの名前付きボリュームollama_modelsに保存します。モデルファイルをdata/incoming/へ置く必要はありません。
bash scripts/start.sh --gpu --port 18080 --bind 0.0.0.0
起動して、地図上で範囲を設定した画面です。
起動スクリプトはアプリのビルドと保存先の権限を確認した後、Ollamaコンテナーを起動します。続いて.envのOLLAMA_MODELで指定したモデルを取得します。既定値はqwen3:8bです。アプリ起動後に、自然文から国土地理院の標高データを選べるか2件試します。選択できなければアプリを停止し、原因を表示します。
初回のモデル取得には時間とディスク容量が必要です。起動スクリプトの完了を確認してから、http://localhost:18080を開きます。--gpuはOllamaコンテナーへNVIDIA GPUを割り当てるための指定です。推論時のGPU使用状況は、実行するマシンでも確認してください。
起動後にモデルが使えなくなったときは、画面の自然文ボタンを無効にして再準備を案内します。フォームからの取得計画はそのまま操作できます。docker compose upだけを直接実行した場合は、起動スクリプトによるモデル取得・実推論の確認を通りません。
地図の初期位置を変更した後
.envを変更した場合はアプリコンテナーを再作成し、ブラウザーを再読み込みします。
docker compose -f compose.yaml -f compose.gpu.yaml up -d --no-deps --force-recreate app
「範囲を削除・初期表示へ」を押すと、選択範囲とプレビュー、座標入力、取得計画を消し、.envの表示中心へ戻ります。保存済みの成果と履歴は残ります。出力EPSGは地図の中心とは別に選びます。
PLATEAUの取得量を調整する
.envには次の上限を設定できます。値は利用するマシンのメモリー、ディスク容量、対象範囲を見ながら調整してください。
GIS_PLATEAU_MAX_FILES=64
GIS_PLATEAU_MAX_FILE_MIB=128
GIS_PLATEAU_MAX_TOTAL_MIB=1024
GIS_ZIP_MAX_EXPANDED_MIB=512
変更後はアプリコンテナーを再作成します。PLATEAUは対象の種類をまとめて選んだ場合も、ファイル数と合計容量を合算して検査します。
操作の例
- 地図に欲しい範囲の矩形を描くか、西・南・東・北の経緯度を入力します。
- 「産総研・シームレス地質図」から対象区画の地質区分を選びます。区画境界をまたぐ場合は両方を選びます。
- 対象地域に合う出力EPSGを選択します。
- 取得計画で対象データと範囲を確認し、取得を開始します。
- 履歴から成果のGeoPackageと原本を確認します。次の範囲へ移る際は範囲リセットボタンを使います。
地質区分の属性にはsymbolを保持します。岩相や年代の説明は原本ZIPのlegend.tsvを参照してください。凡例の結合や自動色分けは、今後の課題です。
保存先と履歴
ジョブごとにdata/output/<ジョブID>/へ成果を保存します。原本と加工後のファイルを分けるので、後から出典と変換結果を確かめられます。
| ファイル・フォルダー | 内容 |
|---|---|
project_data.gpkg |
対象範囲とベクターのレイヤー。source_catalog、processing_logに取得元や処理条件を記録します |
rasters/ |
DEMなどのGeoTIFF |
raw/ |
配布元から取得した原本や、手元ファイルのコピー |
manifest.json |
指定条件、取得元ごとの結果、成果一覧 |
data/state/jobs.sqlite |
ジョブの状態と履歴 |
処理は単一ワーカーで順番に進みます。同じ条件の成功済み成果は、保存ファイルのハッシュを確認して再利用します。途中でサーバーが止まったジョブは失敗として記録し、途中から自動再開はしません。一部の取得元だけ成功した場合も、その状態を履歴に残します。
使うときに確認したい点
取得したデータは、画面のプレビューだけで判断せず、GeoPackageを開いて件数、形状、座標系、属性を確認してください。特に区画の境界に近い範囲では、隣の区画も選ぶ必要があります。配布元でデータが更新された場合は、取得した原本と出典も確認します。
産総研の線データには地質境界などが含まれます。断層だけを抽出したい場合は、保存されたLegend_Jの値を確認して絞り込んでください。地質区分の凡例は原本ZIP内のlegend.tsvを参照できます。
次に広げたいこと
この先は、流域界ポリゴンでの範囲指定、全国の図郭・年度の自動選択、未知のサイトの検索、STAC・WFS・ArcGIS RESTとの接続は今後の候補です。e-Statの統計表の結合や自治体の公開データも、形式と利用条件を確認してから追加します。
shapefileも詠み込んで処理できるようにしたいと考えています。
同じ取得形式の配布元ならconfig/sources.d/*.yamlに設定を追加できます。新しいAPIやファイル形式には、接続処理と検査の追加が必要です。
取得元GISデータの参考リンク
- 国土地理院:地理院タイル一覧(標高タイル・背景地図)
- PLATEAU:CityGMLデータ
- 国土数値情報:行政区域データ(2026年)
- 国土数値情報:河川データ
- 産総研:地質図データを使う
- 防災科研:地すべり地形GISデータ
