住所から緯度経度の座標を取得することをGeocodingといいます。
一見シンプルに見えますが、入力が正規化されていなかったり、元データが日本郵便、国土交通省、法務省でカバー範囲が異なっていたりと一筋縄ではいかないのです。
そのため、ある程度整備されたデータと入力の正規化を行うライブラリやAPIが必要になります。今回は商用・OSSの日本のGeocoding手段について考えてみます。
OSS
abr-geocoder
上記の元データが散在している問題を解決するために、デジタル庁が2020年代に入ってからアドレスベースレジストリというものを作成しています。これによりある住所に対して一意のIDが割り当てられ、それによって各種情報も取得できます。
これを利用したものがabr-geocoderです。元データが国のものなのでデータが整備された部分は精度が良いものの、住居表示未実施の所に関しては番地以下の座標は取得できません。
例えば横浜市中区山下町ではどこの住所を入力しても外れにある湾岸施設の座標しか取得できません。日光市足尾町では最大10kmずれることもあります。意外と都市部にも住居表示未実施の地域が多いので要注意です。
この辺りは、デジタル庁が出しているアドレス・ベース・レジストリの推進についての説明がわかりやすいです。住居表示未実施であり、地番が任意座標系で管理されている地域は詳細な座標の取得ができないということのようです。
逆ジオコーディング(座標から住所)はまだできません。
セルフホスト型であり、Node.jsのコマンドラインツールもしくはAPIサーバーとして動作します。ローカルのSQLiteに22GBほどのデータのダウンロードが必要です。
normalize-japanese-addresses
Geolonia社が作成したNode.jsの住所正規化ライブラリで、座標も取得できます。Community Geocoderというデモもあるみたいです。
abr-geocoderと違いデータ部分はGeoloniaのサーバーから取得するので、サイズが小さくなっています。FirebaseのCloud Functionsでも動作可能です。
精度は若干改善され、住居表示未実施の地域でも地域名までは座標が取得できる?ようですが、地番の精度はありません。住所正規化のためのものなので逆ジオコーディングはできません。
jageocoder
Python用のライブラリで、複数のデータソースから専用に加工されたデータ(20GBほど)を利用します。データはローカルに保存しておくことも、リモートのサーバーを使うこともできます。公開されているデモサーバーもありますがあくまでデモ用なので本番では使わないようにしましょう。
こちらは、複数のデータを組み合わせることで地番の精度で座標取得が可能なようです。上記二つと比べて良い精度です。逆ジオコーディングもサポートしています。
データは商用利用可能ですが独自のものなのでメンテナーがいなくなった場合などを注意する必要があるかもしれません。
Nominatim
全世界に対応していますが、逆に正規化の部分で日本の住所形式は受け取ってくれないので、投入する住所形式を逆にする処理が必要そうです。精度もあまりよくありません。
商用
Google Maps API
資料にアクセスしやすいAPIとしては、Google Mapsのジオコーディングが最も精度が高いと思うのですが基本的に取得結果をローカルに保存できないというデメリットがあります。自分のデータベースに取得した座標を入れて距離の計算とかはできないので、位置情報の処理にGoogle Mapsを利用すると決めた場合にしか使えません。
Mapbox
無料のジオコーディングはGoogle Mapsと同じく保存不可で、保存可能なリクエストは月に10000回が50ドルで利用できます。個人・小規模ビジネスには結構高いと思います。
その他事業者系サービス
営業との連絡、見積取得などが必要なので多分高いと思いますが、ゼンリンなどの事業者は独自で調査を行って精度を上げているので、よりビジネスクリティカルな用途では事業者が提供するものを活用するのがいいでしょう。
最後に
- サーバーを運用してもいいから無料で精度の良いものを使いたい場合はjageocoder
- サーバーを立てたくないけど無料で使いたい場合はnormalize-japanese-addresses
- お金をかけてもいいからメンテフリーで精度が良いものを使いたい場合はMapboxや事業者系
という使い分けになると思います。