緯度経度から距離を計算するgeokit-railsの使い方

こんばんわ。
地図を移動移動した時にするサーバとの通信を、ActionController::Liveでやろうと考えましたがIEが非対応だったのでクソがとなりました。

環境

rails 4.0.2
geokit-rails (2.0.1)

https://github.com/geokit/geokit-rails
geokit-railsは、緯度経度から距離の計算をしてるgem。
緯度経度○×から周辺の施設情報を検索する時とかに使うやつ。

Gemfile

gem 'geokit-rails'

Model

class Spot <  ActiveRecord::Base
  acts_as_mappable(:default_units => :kms,
                   :default_formula => :sphere,
                   :distance_field_name => :distance,
                   :lat_column_name => :lat,
                   :lng_column_name => :lng)
end

使い方

spot = Spot.new(lat: params[:lat], lng: params[:lng])
Spot.by_distance(origin: spot).limit(10)   # 近い順で返す
Spot.within(3.9, origin: spot)            # 3.9km以内の施設を返す

by_distanceメソッドにlat、lngを持つオブジェクトを渡せば、その緯度経度でレシーバのテーブルから、近い順でレコードを返してくれる。

SQL

[1] pry(main)> Spot.by_distance(origin: Spot.last)
  Spot Load (10.4ms)  SELECT "spots".* FROM "spots" ORDER BY "spots"."id" DESC LIMIT 1
  Spot Load (7.2ms)  SELECT "spots".* FROM "spots" ORDER BY
 (ACOS(least(1,COS(0.0)*COS(0.0)*COS(RADIANS(spots.lat))*COS(RADIANS(spots.lng))+
 COS(0.0)*SIN(0.0)*COS(RADIANS(spots.lat))*SIN(RADIANS(spots.lng))+
 SIN(0.0)*SIN(RADIANS(spots.lat))))*6376.77271)
 asc

遠い順はどうするのかなと思って調べたらlastメソッドでやれとあった。

 Spot.by_distance(origin: spot).last(10)

また、緯度経度にnilが入っていると微妙な順番になるので注意。

サンプルコードはテストコードを見たほうがいいですよと教えてもらた。
https://github.com/geokit/geokit-rails/blob/master/test/acts_as_mappable_test.rb