緯度経度から距離を計算する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