diff --git a/lib/geocoder.rb b/lib/geocoder.rb index 5005afd33e3bf378c3a0be6714613061d2ae59d1..fc1a813215bf08bae8f9d65025c8e28c3247085c 100644 --- a/lib/geocoder.rb +++ b/lib/geocoder.rb @@ -94,18 +94,19 @@ module Geocoder # generate hash lat_attr = geocoder_options[:latitude] lon_attr = geocoder_options[:longitude] + distance = "3956 * 2 * ASIN(SQRT(" + + "POWER(SIN((#{latitude} - #{lat_attr}) * " + + "PI() / 180 / 2), 2) + COS(#{latitude} * PI()/180) * " + + "COS(#{lat_attr} * PI() / 180) * " + + "POWER(SIN((#{longitude} - #{lon_attr}) * " + + "PI() / 180 / 2), 2) ))" { - :select => "*, 3956 * 2 * ASIN(SQRT(" + - "POWER(SIN((#{latitude} - #{lat_attr}) * " + - "PI() / 180 / 2), 2) + COS(#{latitude} * PI()/180) * " + - "COS(#{lat_attr} * PI() / 180) * " + - "POWER(SIN((#{longitude} - #{lon_attr}) * " + - "PI() / 180 / 2), 2) )) as distance", + :select => "*, #{distance} AS distance", :conditions => [ "#{lat_attr} BETWEEN ? AND ? AND " + "#{lon_attr} BETWEEN ? AND ?", lat_lo, lat_hi, lon_lo, lon_hi], - :having => "distance <= #{radius}", + :having => "#{distance} <= #{radius}", :order => options[:order], :limit => limit }