development > Ruby On Rails > GeocorderでRailsアプリで簡単に位置情報を扱う
Ruby On Rails

GeocorderでRailsアプリで簡単に位置情報を扱う

Large?1464650629

一昔前までは位置情報を扱うのってちょっと面倒でしたが、今やスマホやブラウザ(HTML5)で簡単に位置情報が取得できたりするので、だいぶ簡単になりました。また取得した位置情報を扱うライブラリ関係も充実してきているので、ちょっとしたことならすぐに実現できてしまいます。

Rails(というかRuby)の場合、Geocoderというgemがあるので、簡単な処理であればこいつで事足りると思います。だいたい位置情報を扱うケースでやりたいことって、

  • 住所を緯度・経度に変換(=ジオコーディング)
  • 緯度・経度を住所に変換(=逆ジオコーディング)
  • 緯度・経度情報をもとにマップを生成

あたりだと思いますが、これらがGeocoderであればものの数分で出来てしまいます。ジオコーディングとはどんなものかはこちらを見ていただけるとすぐイメージが付くと思います。

GeocoderをRailsアプリに導入

何はともあれ、gemfileに

gem 'geocoder'

を追加してbundle installしましょう。作成するモデルはとりあえず

rails g model Location address:string latitude:float longitude:float

とでもして、rake db:migrateもお忘れなく。このモデルでジオコーディングを行いたい場合は、modelに

geocoded_by :address
after_validation :geocode, if: :address_changed?

とすればOKです。こうするとaddressが保存・更新されたタイミングで緯度・経度情報も保存・更新されます。逆ジオコーディング(緯度・経度から住所へ変換)したい場合は、

reverse_geocoded_by :latitude, :longitude
after_validation :reverse_geocode

とします。

特定の位置から近い順にレコードを検索する

次は、位置情報をもとに検索・並び替えてみましょう。ここではブラウザ(HTML5)から現在地を取得して、その情報をRailsアプリに投げて現在地から近い順にレコードを検索する、という流れをやってみます。

まずはJavascriptで現在地を取得してきます。

document.addEventListener("DOMContentLoaded", function() {
  var options = {
    enableHighAccuracy: true,
    timeout: 60000,
    maximumAge: 0
  };
  window.navigator.geolocation.getCurrentPosition(success, error, options);
}, false);

function success(pos) {
  document.getElementById('location_latitude').value = pos.coords.latitude;
  document.getElementById('location_longitude').value = pos.coords.longitude;
}

function error(err) {
  console.warn('ERROR(' + err.code + '): ' + err.message);
}

次はここで取得した位置情報をフォームのhidden_fieldに納めて、それをコントローラーにPOSTしてみます。コントローラー側にnearbyというアクションを作っている想定です。

= form_for(@location, url: nearby_locations_path, html: {method: "post"}) do |f|
  = f.hidden_field :latitude
  = f.hidden_field :longitude
  .actions
    = f.submit '現在地から近いレコードを検索'

= javascript_include_tag 'さっきのjavascriptファイル'

あとは、渡されてくるparamsを使ってレコードを検索してきます。

def nearby
  @locations = Location.near([params[:location][:latitude], params[:location][:longitude]], 50)
end

Geocoderを使うと、nearというメソッドで近くのlocationを検索できるようになります。ここで集められたレコードは自動で近い順に並んでいるので、あとはview側でこれを好きなように表示してあげればOKです。

また、後ろに付いている50という数字は、現在地からの距離です。この場合は現在地から50マイル以内のレコードを近い順に並べている事になります。単位もマイルかキロメーターかを選ぶことが出来ます。

諸々の設定は

$ rails generate geocoder:config

で作成されるinitializerファイルで行ってください。

位置情報から地図を生成する。

一番簡単にすませるのであれば、viewに

= image_tag "http://maps.google.com/maps/api/staticmap?size=450x300&sensor=false&zoom=16&markers=#{@location.latitude}%2C#{@location.longitude}"

と書けばOKです。位置情報をもとにgoogleのMap APIを叩きにいって、生成された地図画像を表示してくれます。

Small?1464650629

この記事が気に入ったらいいね!して
9bar の最新記事を受け取りましょう

Thumb?1464650629

9bar の最新記事をお届けします!

新着記事