ジオコーディングAPI比較
tokadev です。ジオコーディングに触れる機会があったので、現在のジオコーディングの選択肢と試したことの雑感についてメモ代わりに残しておきます。
ジオコーディング
ジオコーディングは住所や地名などのテキスト形式の地理的情報を、緯度・経度といった数値座標に変換する技術です。現代のWebアプリケーションやモバイルアプリケーションにおいて、地図サービス、配送システム、位置ベースサービス(LBS)などで広く活用されている基盤技術の一つです。
気象データなどと照らし合わせる際、影響するエリアに特定の拠点が含まれるかを判定する必要がありますが、拠点の座標を把握しているケースは少ないため住所から緯度経度に変換したい場合に用います。
ジオコーディングAPI
今回は国内の利用を主とするため、次の4つのAPI・サービスを比較検証します。
GoogleMapsPlatform - Geocoding API
特徴
- 商業施設レベルの高精度な位置情報
- Place ID による場所の一意識別
- 住所コンポーネントの詳細分解機能
- 大規模トラフィックに対応したインフラ
設定
GoogleMapsPlatform - Geocoding API を利用する場合はAPIキーが必要になります。
ドキュメントに従ってAPIキーを発行、対象APIに設定します。
国土地理院 ジオコーディングAPI - GSI Maps
特徴
- 日本の地形に特化した詳細データ
- 3D地形表示機能
- カスタムレイヤー作成・編集機能
- 完全オープンソースでの提供
IMI情報共有基盤 住所変換コンポーネント
元は public archive になっていましたが、有志の方が fork されていたので今回はこちらを検証
特徴
- 住所表記揺れの自動補正
- 政府統計データとの整合性チェック
- 詳細なエラー情報とメタデータ
- JSON-LD による構造化データ出力
abr-geocoder (デジタル庁 アドレス・ベース・レジストリ ジオコーダー)
デジタル庁が整備するジオコーダーです。 Docker 環境に閉じて運用することも可能です。
特徴
- 公的レジストリによる高い精度
- マルチスレッド対応による高速処理
- 複数出力形式(CSV, JSON, GeoJSON, NDJSON)
環境構築
環境構築等でそのまま利用することを考慮して Docker で検証環境を作成します。
検証する目的であれば直接 npm install すれば利用できます。
Dockerfile
FROM node:lts-slim
ENV APP /app
WORKDIR $APP
RUN apt update \
&& apt upgrade -y \
&& apt install -y locales jq git \
&& apt clean \
&& rm -rf /var/lib/apt/lists/*
RUN sed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen \
&& locale-gen
ENV LANG=ja_JP.UTF-8
RUN npm i -g @digital-go-jp/abr-geocoder
RUN sh -c "abrg download -d $APP/.abr-geocoder"
# "@digital-go-jp/abr-geocoder":"^2.2.0"
ENTRYPOINT ["abrg", "serve", "start", "-d", "/app/.abr-geocoder"]
http://localhost:3000/geocode?address=
に住所のエンコード文字列を渡してレスポンスが返ってくれば起動完了です。札幌テレビ塔の住所で動作確認、区名からでも返してくれました。
curl 'http://localhost:3000/geocode?address=中央区大通西1丁目'
> [{"query":{"input":"中央区大通西1丁目"},"result":{"output":"北海道札幌市中央区大通西一丁目","others":[],"score":0.54,"match_level":"machiaza_detail","coordinate_level":"machiaza_detail","lat":43.061017,"lon":141.356364,"lg_code":"011011","machiaza_id":"0002001","rsdt_addr_flg":0,"blk_id":null,"rsdt_id":null,"rsdt2_id":null,"prc_id":null,"pref":"北海道","county":null,"city":"札幌市","ward":"中央区","oaza_cho":"大通西","chome":"一丁目","koaza":null,"blk_num":null,"rsdt_num":null,"rsdt_num2":null,"prc_num1":null,"prc_num2":null,"prc_num3":null}}]
住所データ
比較するなら普通の住所よりもやや特殊な住所の方が適しているだろうと探してみると、日本の住所のテストデータセットをまとめているリポジトリを見つけたので今回の検証に活用させて頂くことにします。感謝。
比較
簡単な地図アプリを作成して各住所を地図上にプロット、プロットした様子のスクリーンショットと各ジオコーダーの変換結果と位置座標を表にまとめました。
❤️ abrg: abr-geocoder (デジタル庁 アドレス・ベース・レジストリ ジオコーダー)
🩵 google: GoogleMapsPlatform - Geocoding API
💙 gsimaps: 国土地理院 ジオコーディングAPI - GSI Maps
💚 imi: IMI情報共有基盤 住所変換コンポーネント
西新宿二丁目8番1号
都道府県と市の記載がない住所。 imi は判定不可だった。
api | address | lat | lng |
---|---|---|---|
abrg | 東京都新宿区西新宿二丁目8-1 | 35.689627 | 139.691778 |
日本、〒160-0023 東京都新宿区西新宿2丁目8−1 都庁前駅 | 35.6902573 | 139.6917795 | |
gsimaps | 東京都新宿区西新宿二丁目8番 | 35.689629 | 139.691772 |
imi | - | - | - |
東京都新宿区西新宿二ノ八ノ一
「西新宿二丁目8番1号」と同じ住所で表記違い。 imi と google は差異が出た。
api | address | lat | lng |
---|---|---|---|
abrg | 東京都新宿区西新宿二丁目8 ノ一 | 35.689627 | 139.691778 |
日本、〒160-0023 東京都新宿区西新宿7丁目9−15 | 35.6947166 | 139.6982407 | |
gsimaps | 東京都新宿区西新宿二丁目8番 | 35.689629 | 139.691772 |
imi | 東京都新宿区西新宿二ノ八ノ一 | 35.68945 | 139.691774 |
山形市大字十文字1
api | address | lat | lng |
---|---|---|---|
abrg | 山形県山形市大字十文字1 | 38.309579 | 140.373946 |
日本、〒990-2211 山形県山形市十文字1 | 38.3052094 | 140.3677091 | |
gsimaps | 山形県山形市十文字1番地 | 38.305611 | 140.366669 |
imi | 山形市大字十文字1 | 38.309579 | 140.373946 |
大阪府大阪市中央区上町A-6
api | address | lat | lng |
---|---|---|---|
abrg | 大阪府大阪市中央区上町A-6 | 34.678267854 | 135.521121441 |
日本、〒540-0005 大阪府大阪市中央区上町A | 34.6773921 | 135.5212195 | |
gsimaps | 大阪府大阪市中央区上町A番6号 | 34.678268 | 135.521118 |
imi | 大阪府大阪市中央区上町A-6 | 34.677534 | 135.520976 |
岐阜県山県市高木1000番地1
abrg だけ他と離れる結果に
api | address | lat | lng |
---|---|---|---|
abrg | 岐阜県山県市高木1000-1 | 35.391199 | 136.722168 |
日本、〒501-2113 岐阜県山県市高木1000−1 | 35.5061624 | 136.7813341 | |
gsimaps | 岐阜県山県市高木1000番地 | 35.506138 | 136.781372 |
imi | 岐阜県山県市高木1000番地1 | 35.503628 | 136.775262 |
愛知県蒲郡市旭町17番1号
api | address | lat | lng |
---|---|---|---|
abrg | 愛知県蒲郡市旭町17-1 | 34.825974684 | 137.220104646 |
日本、〒443-0045 愛知県蒲郡市旭町17−1 | 34.8264465 | 137.2195037 | |
gsimaps | 愛知県蒲郡市旭町17番1号 | 34.825974 | 137.220108 |
imi | - | - | - |
石川県野々市市三納1丁目1番地
api | address | lat | lng |
---|---|---|---|
abrg | 石川県野々市市三納一丁目1 | 36.519757629 | 136.609888319 |
日本、〒921-8825 石川県野々市市三納1丁目1 | 36.5195413 | 136.6098161 | |
gsimaps | 石川県野々市市三納一丁目1番地 | 36.519417 | 136.609833 |
imi | 石川県野々市市三納1丁目1番地 | 36.518216 | 136.609562 |
愛媛県松山市市坪西町625番地1
api | address | lat | lng |
---|---|---|---|
abrg | 愛媛県松山市市坪西町625-1 | 33.809350271 | 132.747107648 |
日本、〒790-0948 愛媛県松山市市坪西町625−1 | 33.8089852 | 132.747844 | |
gsimaps | 愛媛県松山市市坪西町625番地 | 33.808781 | 132.745239 |
imi | 愛媛県松山市市坪西町625番地1 | 33.809432 | 132.744574 |
三重県四日市市市場町2124
api | address | lat | lng |
---|---|---|---|
abrg | 三重県四日市市市場町2124 | 35.058525 | 136.561189 |
日本、〒512-1302 三重県四日市市市場町2124 | 35.0576783 | 136.5620512 | |
gsimaps | 三重県四日市市市場町2124番地 | 35.057426 | 136.562225 |
imi | 三重県四日市市市場町2124 | 35.058525 | 136.561189 |
新潟県十日町市千歳町3丁目3番地
api | address | lat | lng |
---|---|---|---|
abrg | 新潟県十日町市千歳町三丁目3 | 37.127546989 | 138.755639681 |
日本、〒948-0067 新潟県十日町市千歳町3丁目3 | 37.1275457 | 138.7557115 | |
gsimaps | 新潟県十日町市千歳町三丁目3番地 | 37.12748 | 138.755569 |
imi | 新潟県十日町市千歳町3丁目3番地 | 37.127783 | 138.755795 |
宇都宮市旭1丁目1-5
api | address | lat | lng |
---|---|---|---|
abrg | 栃木県宇都宮市旭一丁目1-5 | 36.555946733 | 139.882823383 |
日本、〒320-0818 栃木県宇都宮市旭1丁目1−5 | 36.5551589 | 139.8823279 | |
gsimaps | 栃木県宇都宮市旭一丁目1番5号 | 36.555946 | 139.882828 |
imi | 宇都宮市旭1丁目1-5 | 36.554750 | 139.883257 |
札幌市中央区北3西1-7
api | address | lat | lng |
---|---|---|---|
abrg | 北海道札幌市中央区北三条西一丁目7 | 43.065516121 | 141.355272502 |
日本、〒060-0003 北海道札幌市中央区北3条西1丁目 北3西1 | 43.0650145 | 141.3559085 | |
gsimaps | 北海道札幌市中央区北三条西一丁目7番地 | 43.065571 | 141.355316 |
imi | - | - | - |
三重県津市広明町13番地
api | address | lat | lng |
---|---|---|---|
abrg | 三重県津市広明町13 | 34.729813646 | 136.508434719 |
日本、〒514-8570 三重県津市広明町13 | 34.7302837 | 136.5086839 | |
gsimaps | 三重県津市広明町13番地 | 34.730572 | 136.508896 |
imi | 三重県津市広明町13番地 | 34.731281 | 136.507031 |
京都市中京区寺町通御池上る上本能寺前町488番地
api | address | lat | lng |
---|---|---|---|
abrg | 京都府京都市中京区寺町通御池上る上本能寺前町488 | 35.011582 | 135.767914 |
日本、〒604-0925 京都府京都市中京区寺町通御池上る上本能寺前町488 | 35.01161889999999 | 135.7680976 | |
gsimaps | 京都府京都市中京区 | 35.009998 | 135.751389 |
imi | - | - | - |
東京都西多摩郡瑞穂町大字箱根ケ崎2335番地
api | address | lat | lng |
---|---|---|---|
abrg | 東京都西多摩郡瑞穂町大字箱根ケ崎2335 | 35.778725 | 139.341994 |
日本、〒190-1221 東京都西多摩郡瑞穂町箱根ケ崎2335 | 35.7719172 | 139.3537942 | |
gsimaps | 東京都西多摩郡瑞穂町箱根ケ崎2335番地 | 35.771915 | 139.353943 |
imi | 東京都西多摩郡瑞穂町大字箱根ケ崎2335番地 | 35.778725 | 139.341994 |
熊本県阿蘇市波野小地野
api | address | lat | lng |
---|---|---|---|
abrg | 熊本県阿蘇市波野大字小地野 | 32.95809 | 131.203268 |
日本、〒869-2806 熊本県阿蘇市波野大字波野3742−1 | 32.9397968 | 131.2017819 | |
gsimaps | 熊本県阿蘇市波野小地野 | 32.958092 | 131.203262 |
imi | - | - | - |
大分県宇佐市安心院町大字古川字長坂
api | address | lat | lng |
---|---|---|---|
abrg | 大分県宇佐市安心院町古川長坂 | 33.4374 | 131.424405 |
日本、〒872-0722 大分県宇佐市安心院町南畑 | 33.3647732 | 131.4162201 | |
gsimaps | 大分県宇佐市安心院町大 | 33.399052 | 131.343323 |
imi | 大分県宇佐市安心院町大字古川字長坂 | 33.399053 | 131.343329 |
終わりに
今回調査で知った abr-geocoder を含めて既存のジオコーディングサービスを比較した雑感としては、GoogleMapsAPI や Gemini など GoogleCloud のサービスをすでに利用しているプロジェクト、またはグローバル展開を目指すサービスの場合は導入コストの面でも Google Maps Platform の優位性が高いと感じました。
国内主体でいろんな住所を扱うのであれば abr-geocoder または GSI Maps が精度の面で有力に思えます。今回は特殊な住所ばかりを扱ったせいか imi は判定出来ないパターンが多かったです。
特殊な住所を扱うケースがほとんど無ければ Google Maps Platform でもまかなえそうですが、比較してみるとある程度誤差が出るのでどこまでを許容範囲にするかで検討の余地がありそうです。
国内向けであれば他にもいくつか有料サービスの選択肢があるので機会があれば使用感を試してみたいところですね。
Discussion