🗺️

ジオコーディングAPI比較

に公開

tokadev です。ジオコーディングに触れる機会があったので、現在のジオコーディングの選択肢と試したことの雑感についてメモ代わりに残しておきます。


ジオコーディング

ジオコーディングは住所や地名などのテキスト形式の地理的情報を、緯度・経度といった数値座標に変換する技術です。現代のWebアプリケーションやモバイルアプリケーションにおいて、地図サービス、配送システム、位置ベースサービス(LBS)などで広く活用されている基盤技術の一つです。
気象データなどと照らし合わせる際、影響するエリアに特定の拠点が含まれるかを判定する必要がありますが、拠点の座標を把握しているケースは少ないため住所から緯度経度に変換したい場合に用います。


ジオコーディングAPI

今回は国内の利用を主とするため、次の4つのAPI・サービスを比較検証します。

GoogleMapsPlatform - Geocoding API

https://developers.google.com/maps/documentation/geocoding/overview?hl=ja

特徴

  • 商業施設レベルの高精度な位置情報
  • Place ID による場所の一意識別
  • 住所コンポーネントの詳細分解機能
  • 大規模トラフィックに対応したインフラ

設定

GoogleMapsPlatform - Geocoding API を利用する場合はAPIキーが必要になります。
ドキュメントに従ってAPIキーを発行、対象APIに設定します。

https://developers.google.com/maps/documentation/geocoding/get-api-key?hl=ja

国土地理院 ジオコーディングAPI - GSI Maps

https://github.com/gsi-cyberjapan/gsimaps

特徴

  • 日本の地形に特化した詳細データ
  • 3D地形表示機能
  • カスタムレイヤー作成・編集機能
  • 完全オープンソースでの提供

IMI情報共有基盤 住所変換コンポーネント

元は public archive になっていましたが、有志の方が fork されていたので今回はこちらを検証

https://github.com/ypresto/imi-enrichment-address

特徴

  • 住所表記揺れの自動補正
  • 政府統計データとの整合性チェック
  • 詳細なエラー情報とメタデータ
  • JSON-LD による構造化データ出力

abr-geocoder (デジタル庁 アドレス・ベース・レジストリ ジオコーダー)

デジタル庁が整備するジオコーダーです。 Docker 環境に閉じて運用することも可能です。

https://github.com/digital-go-jp/abr-geocoder

特徴

  • 公的レジストリによる高い精度
  • マルチスレッド対応による高速処理
  • 複数出力形式(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}}]

住所データ

比較するなら普通の住所よりもやや特殊な住所の方が適しているだろうと探してみると、日本の住所のテストデータセットをまとめているリポジトリを見つけたので今回の検証に活用させて頂くことにします。感謝。

https://github.com/t-sagara/Japanese-Address-testdata

比較

簡単な地図アプリを作成して各住所を地図上にプロット、プロットした様子のスクリーンショットと各ジオコーダーの変換結果と位置座標を表にまとめました。

❤️ 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
google 日本、〒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
google 日本、〒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
google 日本、〒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
google 日本、〒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
google 日本、〒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
google 日本、〒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
google 日本、〒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
google 日本、〒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
google 日本、〒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
google 日本、〒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
google 日本、〒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
google 日本、〒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
google 日本、〒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
google 日本、〒604-0925 京都府京都市中京区寺町通御池上る上本能寺前町488 35.01161889999999 135.7680976
gsimaps 京都府京都市中京区 35.009998 135.751389
imi - - -
東京都西多摩郡瑞穂町大字箱根ケ崎2335番地

api address lat lng
abrg 東京都西多摩郡瑞穂町大字箱根ケ崎2335 35.778725 139.341994
google 日本、〒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
google 日本、〒869-2806 熊本県阿蘇市波野大字波野3742−1 32.9397968 131.2017819
gsimaps 熊本県阿蘇市波野小地野 32.958092 131.203262
imi - - -
大分県宇佐市安心院町大字古川字長坂

api address lat lng
abrg 大分県宇佐市安心院町古川長坂 33.4374 131.424405
google 日本、〒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