Google Maps × OpenStreetMap — 二大マップサービスのデータ連携
Google Maps と OpenStreetMap(OSM)が持つデータの性質の違いと、Portolan が両者をつなぐ「共通の読み口」になりうる理由を整理します。
2026-09-11
異なる世界観を持つ2つのマップ
| Google Maps | OpenStreetMap | |
|---|---|---|
| 運営 | 民間(Google) | コミュニティ |
| データ形式 | 独自(ベクタータイル等) | OSM XML / PBF |
| ライセンス | 固有契約 | ODbL |
| 更新 | プロプライエタリな収集 | クラウドソーシング |
両者は表現・許諾・更新方法が根本的に異なり、これまで「データを直接つなぐ」ことは難しかったと言えます。
両者の技術的な違い
座標系の差
- Google Maps: EPSG:3857(Web メルカトル投影法)
- OpenStreetMap: EPSG:4326(WGS 84)が基本。内部処理は EPSG:3857 を使う
この差を吸収しないと、ポイントの位置がずれます。Portolan では AGENTS.md に「このデータは EPSG:3857 なので、利用時は EPSG:4326 に変換すること」のように明記します。
データ粒度
| 項目 | Google Maps | OpenStreetMap |
|---|---|---|
| 建物 | 3D モデル(ボリュームデータあり) | 2D ポリゴン(高度情報は限定的) |
| 観光 | 完全性が非常に高い | 都市部は高いが地方は偏りあり |
| ライセンス | Google に依存 | ODbL(再利用可能) |
| リアルタイム性 | 常に最新 | ボランティア依存で更新に差 |
共通プロトコルとしての Portolan
Portolan は地理空間データを「AI が直接読める形で公開する」ためのルール集です。以下の表現で両者を仲介できる可能性があります。
- GeoParquet / PMTiles — タイル・列指向形式による共通の「読み」基盤
- collection.json — メタデータを標準化し、どのマップ由来かを機械可読にする
- AGENTS.md — ライセンス条件や更新頻度の違いを、使う側に事前に伝える
共通の GeoParquet カラム設計
両者のデータを扱いやすくするため、共通カラムの設計が有効です。
import geopandas as gpd
import pandas as pd
# OSM の POI を GeoParquet 化
osm = gpd.read_file("osm_poi.pbf")
osm["source"] = "openstreetmap"
osm["source_id"] = osm["osm_id"].astype(str)
osm.to_parquet("data/poi.parquet", schema_version="1.0.0")
# 同様に Google Maps 由来のデータを統合
# gmap.to_parquet(...) と同じ形式で統合
source カラムにより、どのマップ由来かをフィルタできます。
連携の用例
1. OSM 由来の POI データを GeoParquet 化し、Google 由来の境界データと同一コレクションで参照
import duckdb
# OSM の POI と Google 由来の行政境界を結合
duckdb.sql("""
SELECT p.name, b.admin_name
FROM poi.parquet p
JOIN boundary.parquet b
ON ST_Within(p.geom, b.geom)
""")
2. STAC カタログで「由来の異なるデータ」を横断検索し、AI エージェントに出典付きで提供
import json, urllib.request
# STAC カタログから由来の異なるデータを検索
catalog = json.load(urllib.request.urlopen(
"https://example.org/catalog.json"
))
for item in catalog["items"]:
print(item["properties"]["source"], item["id"])
3. 各社のタイルソースをそのまま参照(移動させず)し、ビューワ側で切り替え
<!-- PMTiles を使った 2ソース切り替え例 -->
<script>
const map = L.map("map");
L.tileLayer("https://example.org/osm/{z}/{x}/{y}.pmtiles")
.addTo(map);
L.tileLayer("https://example.org/gmap/{z}/{x}/{y}.pmtiles")
.addTo(map).setOpacity(0.5);
</script>
利用規約の違いを守る
| 規約 | Google Maps | OpenStreetMap |
|---|---|---|
| 商業利用 | Google の規約に従う | ODbL で再利用可 |
| 出典表示 | 必要(Google の表示規定) | 必要(ODbL の Attribution) |
| 再配布 | 制限あり | 自由(ODbL の ShareAlike に従う) |
Portolan の AGENTS.md では、この違いを明記します。
## ライセンス条件
- Google Maps 由来データ: Google の規約に従い、出典表示が必要
- OpenStreetMap 由来データ: ODbL。再配布時は同一ライセンス
このデモから読めること
Portolan が実現しようとしているのは、特定プラットフォームへの集約でも、データの取り込みでもありません。「すべてのデータが、それぞれの場所に開かれた状態で存在する」世界です。行政や研究機関が持つデータ主権を守りつつ、AI の力を借りられる、その可能性をこの記事は示しています。