VLMで地図を読み取る【画像AIによる地図分析】
目次
VLMを使えば、地図画像から情報を自動的に読み取れます。
この記事では、VLMを使った地図分析の実践的な方法を解説します。
VLMによる地図分析とは
概要
【従来の地図分析】
・人間が目視で確認
・手動でデータ入力
・専門知識が必要
【VLMによる分析】
・AIが地図画像を理解
・自然言語で質問
・自動で情報抽出
分析可能な地図の種類
| 地図種類 | 分析内容 |
|---|---|
| 地形図 | 地物の特定、地形の把握 |
| 都市計画図 | 用途地域、道路計画 |
| 航空写真 | 建物、土地利用 |
| 案内図 | 施設配置、経路 |
| 主題図 | データの傾向 |
仕組み
【処理フロー】
1. 地図画像を入力
2. VLMが画像を解析
3. 質問に基づいて情報抽出
4. 自然言語で回答
【例】
入力:地形図画像 + 「主要な道路は?」
出力:「画像には国道○号線が東西に走り、
県道△△号線が南北に交差しています」
できることと限界
できること
【概要把握】
・地図の種類の判別
・表示範囲の推定
・主要な地物の特定
【情報抽出】
・道路・鉄道の識別
・建物の分布
・土地利用の傾向
・地形の特徴
【説明生成】
・地図の概要説明
・特徴的な点の指摘
・エリアの比較
限界
【苦手なこと】
× 正確な座標の読み取り
× 小さな文字の認識
× 縮尺の正確な判定
× 専門的な記号の完全な理解
【注意が必要】
△ 凡例の正確な読み取り
△ 数値データの抽出
△ 細かい境界線の判定
精度の目安
| 分析タイプ | 精度 |
|---|---|
| 概要把握 | ◎ 高い |
| 主要地物の特定 | ○ 良好 |
| 詳細情報の抽出 | △ 要確認 |
| 数値の読み取り | × 不向き |
実践的な分析手法
基本的な分析
def basic_map_analysis(image_path):
prompt = """
この地図画像を分析してください:
1. 地図の種類(地形図、都市計画図等)
2. 表示されている地域の特徴
3. 主要な地物(道路、河川、建物等)
4. 特徴的なポイント
"""
return analyze_image(image_path, prompt)
道路網の分析
def analyze_road_network(image_path):
prompt = """
この地図から道路網を分析してください:
1. 主要道路(国道、県道等)
2. 道路の走行方向
3. 交差点・結節点
4. 道路の特徴(幅員、種類等)
"""
return analyze_image(image_path, prompt)
土地利用の分析
def analyze_land_use(image_path):
prompt = """
この地図から土地利用状況を分析してください:
1. 住宅地の分布
2. 商業地域
3. 工業地域
4. 農地・緑地
5. 土地利用の傾向・特徴
"""
return analyze_image(image_path, prompt)
比較分析
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での実装
基本クラス
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)
使用例
# インスタンス作成
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)
バッチ処理
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. 報告書を作成
【プロンプト例】
「この地形図から災害リスクに関連する
地形的特徴を分析してください:
- 河川との位置関係
- 傾斜地の有無
- 低地・窪地の有無
- 避難経路の確認」
精度向上のコツ
画像の準備
【推奨事項】
・高解像度の画像を使用
・明るく鮮明なもの
・凡例が含まれていると良い
・縮尺が分かると精度向上
【避けるべき画像】
・低解像度
・ぼやけている
・一部が欠けている
・極端に広い範囲
プロンプトの工夫
【具体的に指示】
× 「分析して」
○ 「道路の種類と走行方向を特定して」
【観点を明示】
「土木技術者の視点で分析してください」
「不動産評価の観点で確認してください」
【形式を指定】
「箇条書きで回答してください」
「重要度順に並べてください」
複数回の分析
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との連携
# 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
分析結果の活用
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. 結果は必ず確認
向いている用途
・事前調査
・概要把握
・レポート作成
・情報整理
関連記事
お問い合わせ
VLMを使った地図分析についてのご相談は、お気軽にお問い合わせください。
最終更新: 2025年1月