Class: Geokit::LatLng

Inherits:
Object
  • Object
show all
Includes:
Mappable
Defined in:
lib/geokit/lat_lng.rb

Direct Known Subclasses

GeoLoc

Constant Summary

Constants included from Mappable

Mappable::EARTH_RADIUS_IN_KMS, Mappable::EARTH_RADIUS_IN_MILES, Mappable::EARTH_RADIUS_IN_NMS, Mappable::KMS_PER_LATITUDE_DEGREE, Mappable::KMS_PER_MILE, Mappable::LATITUDE_DEGREES, Mappable::MILES_PER_LATITUDE_DEGREE, Mappable::NMS_PER_LATITUDE_DEGREE, Mappable::NMS_PER_MILE, Mappable::PI_DIV_RAD

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Mappable

#distance_to, #endpoint, #heading_from, #heading_to, included, #midpoint_to, #to_lat_lng

Constructor Details

#initialize(lat = nil, lng = nil) ⇒ LatLng

Accepts latitude and longitude or instantiates an empty instance if lat and lng are not provided. Converted to floats if provided



9
10
11
12
13
14
# File 'lib/geokit/lat_lng.rb', line 9

def initialize(lat=nil, lng=nil)
  lat = lat.to_f if lat && !lat.is_a?(Numeric)
  lng = lng.to_f if lng && !lng.is_a?(Numeric)
  @lat = lat
  @lng = lng
end

Instance Attribute Details

#latObject

Returns the value of attribute lat.



5
6
7
# File 'lib/geokit/lat_lng.rb', line 5

def lat
  @lat
end

#lngObject

Returns the value of attribute lng.



5
6
7
# File 'lib/geokit/lat_lng.rb', line 5

def lng
  @lng
end

Class Method Details

.normalize(thing, other = nil) ⇒ Object

A class method to take anything which can be inferred as a point and generate a LatLng from it. You should use this anything you’re not sure what the input is, and want to deal with it as a LatLng if at all possible. Can take:

1) two arguments (lat,lng)
2) a string in the format "37.1234,-129.1234" or "37.1234 -129.1234"
3) a string which can be geocoded on the fly
4) an array in the format [37.1234,-129.1234]
5) a LatLng or GeoLoc (which is just passed through as-is)
6) anything which acts_as_mappable -- a LatLng will be extracted from it

Raises:

  • (ArgumentError)


63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/geokit/lat_lng.rb', line 63

def self.normalize(thing,other=nil)
  # if an 'other' thing is supplied, normalize the input by creating an array of two elements
  thing=[thing,other] if other

  if thing.is_a?(String)
    thing.strip!
    if match=thing.match(/(\-?\d+\.?\d*)[, ] ?(\-?\d+\.?\d*)$/)
      return Geokit::LatLng.new(match[1],match[2])
    else
      res = Geokit::Geocoders::MultiGeocoder.geocode(thing)
      return res if res.success?
      raise Geokit::Geocoders::GeocodeError
    end
  elsif thing.is_a?(Array) && thing.size==2
    return Geokit::LatLng.new(thing[0],thing[1])
  elsif thing.is_a?(LatLng) # will also be true for GeoLocs
    return thing
  elsif thing.class.respond_to?(:acts_as_mappable) && thing.class.respond_to?(:distance_column_name)
    return thing.to_lat_lng
  end

  raise ArgumentError.new("#{thing} (#{thing.class}) cannot be normalized to a LatLng. We tried interpreting it as an array, string, Mappable, etc., but no dice.")
end

Instance Method Details

#==(other) ⇒ Object

Returns true if the candidate object is logically equal. Logical equivalence is true if the lat and lng attributes are the same for both objects.



42
43
44
# File 'lib/geokit/lat_lng.rb', line 42

def ==(other)
  other.is_a?(LatLng) ? self.lat == other.lat && self.lng == other.lng : false
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/geokit/lat_lng.rb', line 50

def eql?(other)
  self == other
end

#hashObject



46
47
48
# File 'lib/geokit/lat_lng.rb', line 46

def hash
  lat.hash + lng.hash
end

#llObject

Returns the lat and lng attributes as a comma-separated string.



27
28
29
# File 'lib/geokit/lat_lng.rb', line 27

def ll
  "#{lat},#{lng}"
end

#reverse_geocode(options = { :using => Geokit::Geocoders::MultiGeocoder }) ⇒ Object

Reverse geocodes a LatLng object using the MultiGeocoder (default), or optionally using a geocoder of your choosing. Returns a new Geokit::GeoLoc object

Options

  • :using - Specifies the geocoder to use for reverse geocoding. Defaults to

    MultiGeocoder. Can be either the geocoder class (or any class that
    implements do_reverse_geocode for that matter), or the name of
    the class without the "Geocoder" part (e.g. :google)
    

Examples

LatLng.new(51.4578329, 7.0166848).reverse_geocode # => #<Geokit::GeoLoc:0x12dac20 @state…> LatLng.new(51.4578329, 7.0166848).reverse_geocode(:using => :google) # => #<Geokit::GeoLoc:0x12dac20 @state…> LatLng.new(51.4578329, 7.0166848).reverse_geocode(:using => Geokit::Geocoders::GoogleGeocoder) # => #<Geokit::GeoLoc:0x12dac20 @state…>



100
101
102
103
104
105
106
107
108
109
110
# File 'lib/geokit/lat_lng.rb', line 100

def reverse_geocode(options = { :using => Geokit::Geocoders::MultiGeocoder })
  if options[:using].is_a?(String) or options[:using].is_a?(Symbol)
    provider = Geokit::Geocoders.const_get("#{Geokit::Inflector::camelize(options[:using].to_s)}Geocoder")
  elsif options[:using].respond_to?(:do_reverse_geocode)
    provider = options[:using]
  else
    raise ArgumentError.new("#{options[:using]} is not a valid geocoder.")
  end

  provider.send(:reverse_geocode, self)
end

#to_aObject

returns a two-element array



37
38
39
# File 'lib/geokit/lat_lng.rb', line 37

def to_a
  [lat,lng]
end

#to_sObject

returns a string with comma-separated lat,lng values



32
33
34
# File 'lib/geokit/lat_lng.rb', line 32

def to_s
  ll
end