railsがんばる子

Ruby on Railsがんばる子です。胡蝶蘭のECサイトを運営しています。

Geocoderで半径XXm以内の何かを探す。

setupなどは参考サイトで。

僕が使ったのは、near機能です。

ActiveRecordモデル#nearメソッドを使うと、1km以内のレコードとかを探してきてくれます。

かっこいいです。

実行

A.near('35.659, 139.703', 0.6, :units => :km).collect(&:id)
#=> 0.6とすると600mになります

結果

A Load (29.3ms) SELECT as.*, 6371.0 * 2 * ASIN(SQRT(POWER(SIN((35.659 - as.latitude) * PI() / 180 / 2), 2) + COS(35.659 * PI() / 180) * COS(as.latitude * PI() / 180) * POWER(SIN((139.703 - as.longitude) * PI() / 180 / 2), 2))) AS distance, MOD(CAST((ATAN2( ((as.longitude - 139.703) / 57.2957795), ((as.latitude - 35.659) / 57.2957795)) * 57.2957795) + 360 AS decimal), 360) AS bearing FROM `as` WHERE (as.latitude BETWEEN 35.65360407036449 AND 35.66439592963551 AND as.longitude BETWEEN 139.6963588631264 AND 139.7096411368736 AND (6371.0 * 2 * ASIN(SQRT(POWER(SIN((35.659 - as.latitude) * PI() / 180 / 2), 2) + COS(35.659 * PI() / 180) * COS(as.latitude * PI() / 180) * POWER(SIN((139.703 - as.longitude) * PI() / 180 / 2), 2)))) BETWEEN 0.0 AND '0.6') ORDER BY distance ASC

なにやら超絶なSQLが発行されています。


qiita.com