ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

ジオコーディングしてくれるGem「geocoder」

なんでもありすぎて怖いよこの世界…
alexreisner/geocoder · GitHub
さて、このGemは座標と住所の相互変換や距離、方角を求めることができるライブラリです。

ただし…

一見すごく便利そうなのですが、実はRubyからGoogleのGeolocation APIをたたくと、なぜかものすごくレスポンスが遅いです。まあGoogleから「ジオコーディングってっくっそハードワークだからなるべく結果はキャッシュしてね☆」とのお達しもあるんですけどね。

ジオコーディングは時間とリソースを消費するタスクです。可能な場合は、既知の住所をあらかじめ(ここで説明する Geocoding API や他のジオコーディング サービスを使用して)ジオコーディングし、独自に設計した一時キャッシュにその結果を保存するようにしてください。

Google Geocoding API - Google Maps API ウェブ サービス — Google Developers

ひょっとしたら、ヘッダー情報を見て帯域をしぼったりしているのかもしれませんね。
というわけで、すごく便利そうなのですが私は今のところジオコーディングして住所を座標に変換した結果を自動で登録してくれるRakeタスク以上の使い方をすることができませんでした。取得元を変えたり、パラメーターを変えたり、Googleに課金したりすれば話は変わってくるのかもしれませんが、やや残念です。とはいえ調べた結果をいちいち登録していくような地道な作業を代わりにやってくれるので、その点だけでも十分に助かっています。

使うときの準備

Gemfileに「gem 'geocoder'」を書いていつも通りbundleしたあと、座標用のカラムを(なければ)作ります。

rails generate migration AddLatitudeAndLongitudeToModel latitude:float longitude:float

保存するときに自動的に座標情報を取ってくる設定

クラスに

geocoded_by :full_street_address   # 住所またはIPアドレス
after_validation :geocode          # 保存時に自動的にジオコーディングする

を書いてあげると保存するときに住所を取ってきてくれます。ただし前述の通り保存が結構遅くなります。チューニングせず使うときはバッチ処理や管理画面での作業で使うのが無難です。Disっているようですが、この作業手前でやると面倒なので自動でやってくれるだけでもすごくありがたいと思います。

参考

Ruby geocoderがすごい - もぎゃろぐ 知ったきっかけです。サンプルがいくつかあります。
Ruby Geocoder geocoderのサイトです。ドキュメントやソースへのリンクがあります。