Class: Geokit::LatLng
- Includes:
- Mappable
- Defined in:
- lib/geokit/lat_lng.rb
Direct Known Subclasses
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
-
#lat ⇒ Object
Returns the value of attribute lat.
-
#lng ⇒ Object
Returns the value of attribute lng.
Class Method Summary collapse
- .from_json(json) ⇒ Object
- .from_string(thing) ⇒ Object
-
.normalize(thing, other = nil) ⇒ Object
A class method to take anything which can be inferred as a point and generate a LatLng from it.
Instance Method Summary collapse
-
#==(other) ⇒ Object
Returns true if the candidate object is logically equal.
- #eql?(other) ⇒ Boolean
- #hash ⇒ Object
-
#initialize(lat = nil, lng = nil) ⇒ LatLng
constructor
Accepts latitude and longitude or instantiates an empty instance if lat and lng are not provided.
-
#ll ⇒ Object
Returns the lat and lng attributes as a comma-separated string.
-
#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.
-
#to_a ⇒ Object
returns a two-element array.
-
#to_s ⇒ Object
returns a string with comma-separated lat,lng values.
-
#valid? ⇒ Boolean
Returns true if both lat and lng attributes are defined.
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
#lat ⇒ Object
Returns the value of attribute lat.
5 6 7 |
# File 'lib/geokit/lat_lng.rb', line 5 def lat @lat end |
#lng ⇒ Object
Returns the value of attribute lng.
5 6 7 |
# File 'lib/geokit/lat_lng.rb', line 5 def lng @lng end |
Class Method Details
.from_json(json) ⇒ Object
16 17 18 |
# File 'lib/geokit/lat_lng.rb', line 16 def self.from_json(json) new(json['lat'], json['lng']) end |
.from_string(thing) ⇒ Object
93 94 95 96 97 98 99 100 101 102 |
# File 'lib/geokit/lat_lng.rb', line 93 def self.from_string(thing) thing.strip! if match=thing.match(/(\-?\d+\.?\d*)[, ] ?(\-?\d+\.?\d*)$/) Geokit::LatLng.new(match[1],match[2]) else res = Geokit::Geocoders::MultiGeocoder.geocode(thing) return res if res.success? raise Geokit::Geocoders::GeocodeError end end |
.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 responding to to_lat_lng -- a LatLng will be extracted from it
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/geokit/lat_lng.rb', line 73 def self.normalize(thing,other=nil) return Geokit::LatLng.new(thing, other) if other case thing when String from_string(thing) when Array thing.size == 2 or raise ArgumentError.new("Must initialize with an Array with both latitude and longitude") Geokit::LatLng.new(thing[0],thing[1]) when LatLng # will also be true for GeoLocs thing else if thing.respond_to? :to_lat_lng thing.to_lat_lng else raise ArgumentError.new("#{thing} (#{thing.class}) cannot be normalized to a LatLng. We tried interpreting it as an array, string, etc., but no dice.") end end 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.
46 47 48 49 |
# File 'lib/geokit/lat_lng.rb', line 46 def ==(other) return false unless other.is_a?(LatLng) lat == other.lat && lng == other.lng end |
#eql?(other) ⇒ Boolean
55 56 57 |
# File 'lib/geokit/lat_lng.rb', line 55 def eql?(other) self == other end |
#hash ⇒ Object
51 52 53 |
# File 'lib/geokit/lat_lng.rb', line 51 def hash lat.hash + lng.hash end |
#ll ⇒ Object
Returns the lat and lng attributes as a comma-separated string.
31 32 33 |
# File 'lib/geokit/lat_lng.rb', line 31 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…>
117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/geokit/lat_lng.rb', line 117 def reverse_geocode( = { :using => Geokit::Geocoders::MultiGeocoder }) if [:using].is_a?(String) || [:using].is_a?(Symbol) provider = Geokit::Geocoders.const_get("#{Geokit::Inflector::camelize([:using].to_s)}Geocoder") elsif [:using].respond_to?(:do_reverse_geocode) provider = [:using] else raise ArgumentError.new("#{[:using]} is not a valid geocoder.") end provider.send(:reverse_geocode, self) end |
#to_a ⇒ Object
returns a two-element array
41 42 43 |
# File 'lib/geokit/lat_lng.rb', line 41 def to_a [lat,lng] end |
#to_s ⇒ Object
returns a string with comma-separated lat,lng values
36 37 38 |
# File 'lib/geokit/lat_lng.rb', line 36 def to_s ll end |
#valid? ⇒ Boolean
Returns true if both lat and lng attributes are defined
60 61 62 |
# File 'lib/geokit/lat_lng.rb', line 60 def valid? lat && lng end |