郵便番号を入力したら半径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はよく出来ているなと。