酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

Geocoder DB - ある場所から一定距離の範囲内の緯度経度を持つレコードを抽出

位置情報を使うようなサービスで、ある緯度経度を中心として、その場所から一定距離の範囲内の緯度経度を持つレコードを抽出したいといったユースケースがあると思います。 そんな時にもGem『alexreisner/geocoder』がめっちゃ便利だったので共有です。

アルバイトを10秒で探せるiPhone/Androidアプリ Short.Works」のアルバイト情報の抽出でも大活躍しています!


前置き

alexreisner/geocoder』の基本的な使い方は、拙著『geocoder 地名から緯度経度に変換 or 緯度経度から住所変換が簡単にできるgem - 酒と泪とRubyとRailsと』 に書いていますので、もしご興味を持って頂けるようならご一読ください^^

一定距離の範囲内のレコードを抽出するコード

ある緯度経度を中心として、その場所から一定距離の範囲内の緯度経度を持つレコードを抽出するコードです。

1
2
3
4
5
6
7
8
9
10
11
12
class Venue < ActiveRecord::Base
  reverse_geocoded_by :latitude, :longitude

  class << self
    def within_box(distance, latitude, longitude)
      distance = distance # 単位はマイル
      center_point = [latitude, longitude] # 緯度経度
      box = Geocoder::Calculations.bounding_box(center_point, distance)
      self.within_bounding_box(box)
    end
  end
end

あとはコントローラなどでVenue.within_box(distance, latitude, longitude)と呼び出してもらえれば、与えられた緯度経度から一定の距離の範囲内にあるレコードをよしなに抽出してきてくれます。

ちなみに正確にはmin_radiusといったオプションでより正確に範囲を指定できるようになるっぽいです!

お願い

GitHubの説明を斜め読みしただけなので、もし間違ってそうなら是非ツッコミお願いします!

おすすめの書籍