郵便番号を入力したら半径3km内のすべての町名を取得するの記事で、Google Maps APIのジオコーディング(住所から緯度経度を検索する)と逆ジオコーディング(緯度経度から住所を検索する)を紹介したが、諸事情によりGoogle Maps APIからOpenStreetMapに書き換える必要が生じたので、OpenStreetMapのNominatimを利用してみた。

JA:Nominatim - OpenStreetMap Wiki



書き換えてみたと言っても、ほとんど同じだったので要所をピックアップしてみる。

Google Maps APIのGeocoding APIのエンドポイントが、

https://maps.googleapis.com/maps/api/geocode/json?address=調べたい住所&key=Google Cloudで取得したキー

であるのに対して、Nominatimの方が、

http://nominatim.openstreetmap.org/search?q=調べたい住所&format=json&accept-language=ja&addressdetails=1&limit=取得件数

に変更して、返ってきたJSONの結果に合わせて適宜変更で対応した。

Nominatimで利用できるパラメータは上記のエンドポイントに付与したもの以外もあり、それらのパラメータは下記のページに記載がある。

JA:Nominatim#引数 - OpenStreetMap Wiki




次にGoogle Mapsの方の逆ジオコーディングが

https://maps.googleapis.com/maps/api/geocode/json?latlng=緯度,経度&language=ja&key=Google Cloudで取得したキー

であるのに対して、Nominatimの方が、

http://nominatim.openstreetmap.org/reverse?format=json&lat=緯度&lon=経度

に変更して、返ってきたJSONの結果に合わせて適宜変更で書き換えは終了した。

Nominatimの逆ジオコーディングで利用できるパラメータは下記のページに記載がある。

JA:Nominatim#引数 - OpenStreetMap Wiki



上の図のような地図の出力とマーカーの設置はOpenStreetMap + Leafletで二つのマーカーを設置するの記事を参考に作成できる。




Open Street MapのNominatimに書き換えてみてのメリットは

・回数制限を気にしなくて良くなった。

・APIキーの取得が必要ないので、動作の検証が簡単になった。


一方デメリットは

・Nominatimの検索の速度がGoogle Mapsの方の1/10程度で、複数回の検索を行うと、検索にかかる時間が大幅に異なる。

・高槻のような曖昧な地名で検索をした時にGoogle Mapsの方は指定の地域のランドマーク的な箇所の住所を返したけれども、Nominatimにはなかった。

・郵便番号検索で結果が返ってこない地域がある。


二番目の内容は、曖昧な地名の検索の際、緯度経度の情報は得られるので、この情報から逆ジオコーディングを行い、郵便番号を取得する必要がある。

これらを思うと、Google Maps APIはよく出来ているなと。