画像AIによる地図分析
VLMで地図を読み取る
VLMを使えば、地図画像から情報を自動的に読み取れます。この記事では、VLMを使った地図分析の実践的な方法を解説します。
VLMによる地図分析とは
概要
【従来の地図分析】 ・人間が目視で確認 ・手動でデータ入力 ・専門知識が必要 【VLMによる分析】 ・AIが地図画像を理解 ・自然言語で質問 ・自動で情報抽出
分析可能な地図の種類
| 地図種類 | 分析内容 |
|---|---|
| 地形図 | 地物の特定、地形の把握 |
| 都市計画図 | 用途地域、道路計画 |
| 航空写真 | 建物、土地利用 |
| 案内図 | 施設配置、経路 |
| 主題図 | データの傾向 |
仕組み
【処理フロー】
1. 地図画像を入力
2. VLMが画像を解析
3. 質問に基づいて情報抽出
4. 自然言語で回答
【例】
入力:地形図画像 + 「主要な道路は?」
出力:「画像には国道○号線が東西に走り、
県道△△号線が南北に交差しています」
できることと限界
できること
概要把握
- 地図の種類の判別
- 表示範囲の推定
- 主要な地物の特定
情報抽出
- 道路・鉄道の識別
- 建物の分布
- 土地利用の傾向
- 地形の特徴
説明生成
- 地図の概要説明
- 特徴的な点の指摘
- エリアの比較
限界
苦手なこと
- × 正確な座標の読み取り
- × 小さな文字の認識
- × 縮尺の正確な判定
- × 専門的な記号の完全な理解
注意が必要
- △ 凡例の正確な読み取り
- △ 数値データの抽出
- △ 細かい境界線の判定
精度の目安
| 分析タイプ | 精度 |
|---|---|
| 概要把握 | ◎ 高い |
| 主要地物の特定 | ○ 良好 |
| 詳細情報の抽出 | △ 要確認 |
| 数値の読み取り | × 不向き |
実践的な分析手法
基本的な分析
python
def basic_map_analysis(image_path):
prompt = """
この地図画像を分析してください:
1. 地図の種類(地形図、都市計画図等)
2. 表示されている地域の特徴
3. 主要な地物(道路、河川、建物等)
4. 特徴的なポイント
"""
return analyze_image(image_path, prompt)
道路網の分析
python
def analyze_road_network(image_path):
prompt = """
この地図から道路網を分析してください:
1. 主要道路(国道、県道等)
2. 道路の走行方向
3. 交差点・結節点
4. 道路の特徴(幅員、種類等)
"""
return analyze_image(image_path, prompt)
土地利用の分析
python
def analyze_land_use(image_path):
prompt = """
この地図から土地利用状況を分析してください:
1. 住宅地の分布
2. 商業地域
3. 工業地域
4. 農地・緑地
5. 土地利用の傾向・特徴
"""
return analyze_image(image_path, prompt)
比較分析
python
def compare_maps(image_path1, image_path2):
# 2つの地図を比較分析
analysis1 = basic_map_analysis(image_path1)
analysis2 = basic_map_analysis(image_path2)
prompt = f"""
以下の2つの地図分析結果を比較してください:
【地図1】
{analysis1}
【地図2】
{analysis2}
共通点と相違点を整理してください。
"""
return call_llm(prompt)
Pythonでの実装
基本クラス
python
import requests
import base64
from pathlib import Path
class MapAnalyzer:
def __init__(self, model="llava"):
self.model = model
self.base_url = "http://localhost:11434/api/generate"
def encode_image(self, image_path):
"""画像をBase64エンコード"""
with open(image_path, 'rb') as f:
return base64.b64encode(f.read()).decode('utf-8')
def analyze(self, image_path, prompt):
"""画像を分析"""
image_data = self.encode_image(image_path)
response = requests.post(
self.base_url,
json={
'model': self.model,
'prompt': prompt,
'images': [image_data],
'stream': False
}
)
return response.json()['response']
def basic_analysis(self, image_path):
"""基本分析"""
prompt = """
この地図画像を分析してください:
1. 地図の種類
2. 表示地域
3. 主要な地物
4. 特徴的なポイント
"""
return self.analyze(image_path, prompt)
def extract_features(self, image_path, feature_type):
"""特定の地物を抽出"""
prompt = f"""
この地図から{feature_type}を特定してください。
見つかった{feature_type}をリストで回答してください。
"""
return self.analyze(image_path, prompt)
使用例
python
# インスタンス作成
analyzer = MapAnalyzer()
# 基本分析
result = analyzer.basic_analysis("map.png")
print(result)
# 道路の抽出
roads = analyzer.extract_features("map.png", "道路")
print(roads)
# 建物の抽出
buildings = analyzer.extract_features("map.png", "建物")
print(buildings)
バッチ処理
python
def batch_analyze_maps(folder_path, output_file):
"""フォルダ内の地図を一括分析"""
analyzer = MapAnalyzer()
results = []
folder = Path(folder_path)
for image_path in folder.glob("*.png"):
print(f"Analyzing: {image_path.name}")
result = {
'filename': image_path.name,
'analysis': analyzer.basic_analysis(image_path)
}
results.append(result)
# 結果を保存
import json
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(results, f, ensure_ascii=False, indent=2)
return results
# 実行
batch_analyze_maps("maps/", "analysis_results.json")
活用事例
事例1: 現地調査の事前確認
目的
現場に行く前に地図から情報を収集
【手順】 1. 対象地域の地図画像を準備 2. VLMで周辺環境を分析 3. アクセスルートを確認 4. 注意点を抽出
プロンプト例
この地図から現場調査に必要な情報を抽出してください:
- アクセス道路
- 周辺施設
- 地形的な注意点
- 駐車可能な場所の推測
事例2: 土地評価の補助
目的
土地の価値評価に必要な情報を収集
【手順】 1. 対象地の都市計画図を準備 2. 用途地域を確認 3. 周辺環境を分析 4. 評価ポイントを整理
プロンプト例
この都市計画図から土地評価に関連する情報を抽出してください:
- 用途地域
- 道路状況
- 周辺の土地利用
- 開発可能性
事例3: 災害リスク評価
目的
地形から災害リスクを推測
【手順】 1. 地形図を準備 2. 地形的特徴を分析 3. リスク要因を抽出 4. 報告書を作成
プロンプト例
この地形図から災害リスクに関連する地形的特徴を分析してください:
- 河川との位置関係
- 傾斜地の有無
- 低地・窪地の有無
- 避難経路の確認
精度向上のコツ
画像の準備
推奨事項
- 高解像度の画像を使用
- 明るく鮮明なもの
- 凡例が含まれていると良い
- 縮尺が分かると精度向上
避けるべき画像
- 低解像度
- ぼやけている
- 一部が欠けている
- 極端に広い範囲
プロンプトの工夫
具体的に指示
- × 「分析して」
- ○ 「道路の種類と走行方向を特定して」
観点を明示
- 「土木技術者の視点で分析してください」
- 「不動産評価の観点で確認してください」
形式を指定
- 「箇条書きで回答してください」
- 「重要度順に並べてください」
複数回の分析
python
def thorough_analysis(image_path):
"""多角的な分析"""
analyzer = MapAnalyzer()
results = {
'概要': analyzer.analyze(image_path,
"この地図の概要を説明してください"),
'道路': analyzer.analyze(image_path,
"道路網について詳しく分析してください"),
'地形': analyzer.analyze(image_path,
"地形的特徴を分析してください"),
'土地利用': analyzer.analyze(image_path,
"土地利用状況を分析してください"),
}
return results
GISとの連携
ワークフロー
【前処理】 GIS → 地図画像エクスポート → VLM分析 【分析】 VLM → テキストで分析結果出力 【後処理】 分析結果 → GISでデータ化 → 可視化
QGISとの連携
python
# QGISから画像をエクスポートしてVLMで分析
def analyze_qgis_export(qgis_project, extent, output_path):
# 1. QGISで地図画像をエクスポート
export_map_image(qgis_project, extent, output_path)
# 2. VLMで分析
analyzer = MapAnalyzer()
result = analyzer.basic_analysis(output_path)
# 3. 結果を返す
return result
分析結果の活用
python
def create_report(image_path, output_path):
"""分析結果からレポートを作成"""
analyzer = MapAnalyzer()
# 詳細分析
analysis = thorough_analysis(image_path)
# レポート生成
report = f"""
# 地図分析レポート
## 1. 概要
{analysis['概要']}
## 2. 道路網
{analysis['道路']}
## 3. 地形
{analysis['地形']}
## 4. 土地利用
{analysis['土地利用']}
---
*自動生成レポート*
"""
with open(output_path, 'w', encoding='utf-8') as f:
f.write(report)
まとめ
VLMによる地図分析
- 地図画像から情報を自動抽出
- 自然言語で質問・回答
- 概要把握に効果的
- 詳細は要確認
活用ポイント
1. 高品質な画像を使用 2. 具体的なプロンプト 3. 複数回の分析で精度向上 4. 結果は必ず確認
向いている用途
- 事前調査
- 概要把握
- レポート作成
- 情報整理
関連記事
