diff --git a/lib/geocoder/calculations.rb b/lib/geocoder/calculations.rb index 1e71c7876cf837ec9b661d9bf967a8d067bbd186..35136960c3a8bba49dae3bf04cf725600c52e9e7 100644 --- a/lib/geocoder/calculations.rb +++ b/lib/geocoder/calculations.rb @@ -41,9 +41,7 @@ module Geocoder def geographic_center(points) # convert objects to [lat,lon] arrays and remove nils - points = points.map{ |p| - p.is_a?(Array) ? p : (p.geocoded?? p.read_coordinates : nil) - }.compact + points.map!{ |p| p.is_a?(Array) ? p : p.to_coordinates }.compact # convert degrees to radians points.map!{ |p| [to_radians(p[0]), to_radians(p[1])] } diff --git a/lib/geocoder/orms/base.rb b/lib/geocoder/orms/base.rb index 13698ab2fe16999ba9de6c8ddc9a98ec7aa12a70..08d16a3bca6728a4579b05823b74841b2495b0ff 100644 --- a/lib/geocoder/orms/base.rb +++ b/lib/geocoder/orms/base.rb @@ -6,7 +6,14 @@ module Geocoder # Is this object geocoded? (Does it have latitude and longitude?) # def geocoded? - read_coordinates.compact.size > 0 + to_coordinates.compact.size > 0 + end + + ## + # Coordinates [lat,lon] of the object. + # + def to_coordinates + [:latitude, :longitude].map{ |i| send self.class.geocoder_options[i] } end ## @@ -16,7 +23,7 @@ module Geocoder # def distance_to(lat, lon, units = :mi) return nil unless geocoded? - mylat,mylon = read_coordinates + mylat,mylon = to_coordinates Geocoder::Calculations.distance_between(mylat, mylon, lat, lon, :units => units) end @@ -29,7 +36,7 @@ module Geocoder def nearbys(radius = 20, units = :mi) return [] unless geocoded? options = {:exclude => self, :units => units} - self.class.near(read_coordinates, radius, options) + self.class.near(to_coordinates, radius, options) end ## @@ -83,14 +90,6 @@ module Geocoder end end end - - ## - # Read the coordinates [lat,lon] of the object. - # Looks at user config to determine attributes. - # - def read_coordinates - [:latitude, :longitude].map{ |i| send self.class.geocoder_options[i] } - end end end end diff --git a/test/geocoder_test.rb b/test/geocoder_test.rb index 3b45bd1b283716f2948ed8b5208115155122c398..f55b426517c3f25271a992ecaa790f87d23c365f 100644 --- a/test/geocoder_test.rb +++ b/test/geocoder_test.rb @@ -23,13 +23,19 @@ class GeocoderTest < Test::Unit::TestCase assert_equal 69, Geocoder::Calculations.distance_between(0,0, 0,1).round end - def test_geographic_center + def test_geographic_center_with_arrays assert_equal [0.0, 0.5], Geocoder::Calculations.geographic_center([[0,0], [0,1]]) assert_equal [0.0, 1.0], Geocoder::Calculations.geographic_center([[0,0], [0,1], [0,2]]) end + def test_geographic_center_with_mixed_arguments + p1 = [0, 0] + p2 = Landmark.new("Some Cold Place", 0, 1) + assert_equal [0.0, 0.5], Geocoder::Calculations.geographic_center([p1, p2]) + end + def test_does_not_choke_on_nil_address all_lookups.each do |l| Geocoder::Configuration.lookup = l @@ -80,7 +86,7 @@ class GeocoderTest < Test::Unit::TestCase e = Event.new(*venue_params(:msg)) coords = [40.750354, -73.993371] e.geocode - assert_equal coords.map{ |c| c.to_s }.join(','), e.coordinates + assert_equal coords.map{ |c| c.to_s }.join(','), e.coords_string end def test_geocode_with_block_doesnt_auto_assign_coordinates diff --git a/test/test_helper.rb b/test/test_helper.rb index b852c32d05c01ed679473700705677f1e470ca6e..18c7aa744b5db71d443dd2560e4d915beb9b3505 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -132,7 +132,7 @@ end class Event < ActiveRecord::Base geocoded_by :address do |obj,result| if result - obj.coordinates = "#{result.latitude},#{result.longitude}" + obj.coords_string = "#{result.latitude},#{result.longitude}" end end