逆ジオコーディング(Reverse Geocoding)の実装について考える

こんにちは、kisseです。

今回は、逆ジオコーディング(Reverse Geocoding)の実装について考えます。
というのも、最近逆ジオコーディングを使う場面が多いんですが、リクエスト結果のキャッシュとか全くしてなくて流石にどうにかするべきかなと思って、まずは考察することにしました。

逆ジオコーディングとは??

リバースジオコーディングとは、地理的位置を人間が判別可能な住所に変換するプロセスです。
Google Maps Geocoding API デベロッパー ガイドより

地球上の座標は緯度経度の2つの値で表されますよね。
その、2つの値が示す場所の住所(例えば、市町村名とか)を取得したいときに逆ジオコーディングを行います。

この手順を行うことによって、サービスを利用しているユーザーの市区町村別の統計をとったりとかできるようになります。



逆ジオコーディングで用いられるAPI

上で引用しましたが、Google Maps Geocoding APIが有名なジオコーディングAPIの一つです。

Python, Java, Go, Node.jsには、クライアントライブラリが存在するようで、簡単にジオコーディングAPIを用いることができるようになっているようです。
僕は、PythonのGeocoderというライブラリで実装を行っていました。

問題点

Google Maps Geocoding APIでは、1日に2500件までしか無料で使えません。
課金を有効化した上でその値を超えると、1000件あたり0.50USDが課金されます。

大量の座標データを処理する場合、1日2500件は余裕で超えます。笑
なので、過去のリクエスト内容とその結果を保存して、その結果を再利用することが必要になります。

しかし、緯度経度の情報はかなり連続的なデータであり、過去と全く同じ座標についてリクエストを行うことは、あまり多くありません。
なので、どの程度値を丸めるかを検討する必要があると考えられます。



解決策案

僕の利用用途の場合、対象は日本国内のみになります。
では、そもそも日本国内の緯度経度の範囲はいくらなのでしょうか。

Google Mapで調べてきました。
(日本最北端とか調べるの小学生以来な気がする。笑笑)
結果は、

  • 緯度: 20.42195 ~ 45.5506
  • 経度: 122.93357 ~ 153.98626

でした。

この前地図で確認したのですが、緯度経度を0.01単位で丸めても、日本国内だと誤差が1km四方くらいに収まるんですね。
誤差1km四方というと、市区町村レベルであれば致命的な誤判定が出ないと推測されます。
なので、0.01ずつ緯度経度を分割すると、

  • 緯度方向: 約2500個に分割
  • 経度方向: 約3000個に分割

すると、0.01ずつのグリッドで日本を分割すると、7,500,000個の点で日本国内を分割することができます。
あれ、結構扱えそうなデータの個数じゃないか?ってなってきます。
しかも、上記で示した範囲、大体海なので保管するべきデータの個数はもっと少なくなるはずです。

ここで、どのようにリクエスト済みのデータを保管するかですが、一番実装が簡単なのはPython pandasのデータフレームで扱って、CSVで保管するとかは単純で楽そうですね。
他には、データベースに格納してしまうのも手ですね。
ここら辺は、処理速度とか実装コストとかとの相談になりそうですね。

ただ、このように値を丸めてデータの個数を制限することによって、リクエスト済みデータのキャッシュが行えそうな感じになってきました。



続く

今回はここまでです。
次回はPython pandasのデータフレーム + CSVでリクエスト済みデータの保存を行いながら、リクエスト数を減らすコードの実装をしてみようと思います。

最後まで、読んで頂きありがとうございます!

あわせて読みたい