Class: Kaupert::LatLng
Direct Known Subclasses
Constant Summary
Constants included from Mapcal
Mapcal::EARTH_RADIUS_IN_KMS, Mapcal::EARTH_RADIUS_IN_MILES, Mapcal::EARTH_RADIUS_IN_NMS, Mapcal::KMS_PER_LATITUDE_DEGREE, Mapcal::KMS_PER_MILE, Mapcal::LATITUDE_DEGREES, Mapcal::MILES_PER_LATITUDE_DEGREE, Mapcal::NMS_PER_LATITUDE_DEGREE, Mapcal::NMS_PER_MILE, Mapcal::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
-
.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 => Kaupert::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.
Methods included from Mapcal
#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
217 218 219 220 221 222 |
# File 'lib/kaupert/mapcal.rb', line 217 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.
213 214 215 |
# File 'lib/kaupert/mapcal.rb', line 213 def lat @lat end |
#lng ⇒ Object
Returns the value of attribute lng.
213 214 215 |
# File 'lib/kaupert/mapcal.rb', line 213 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
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 |
# File 'lib/kaupert/mapcal.rb', line 271 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 Kaupert::LatLng.new(match[1],match[2]) else res = Kaupert::Geocoders::MultiGeocoder.geocode(thing) return res if res.success? raise Kaupert::Geocoders::GeocodeError end elsif thing.is_a?(Array) && thing.size==2 return Kaupert::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 elsif thing.respond_to? :to_lat_lng 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.
250 251 252 |
# File 'lib/kaupert/mapcal.rb', line 250 def ==(other) other.is_a?(LatLng) ? self.lat == other.lat && self.lng == other.lng : false end |
#eql?(other) ⇒ Boolean
258 259 260 |
# File 'lib/kaupert/mapcal.rb', line 258 def eql?(other) self == other end |
#hash ⇒ Object
254 255 256 |
# File 'lib/kaupert/mapcal.rb', line 254 def hash lat.hash + lng.hash end |
#ll ⇒ Object
Returns the lat and lng attributes as a comma-separated string.
235 236 237 |
# File 'lib/kaupert/mapcal.rb', line 235 def ll "#{lat},#{lng}" end |
#reverse_geocode(options = { :using => Kaupert::Geocoders::MultiGeocoder }) ⇒ Object
Reverse geocodes a LatLng object using the MultiGeocoder (default), or optionally using a geocoder of your choosing. Returns a new Kaupert::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 # => #<Kaupert::GeoLoc:0x12dac20 @state…> LatLng.new(51.4578329, 7.0166848).reverse_geocode(:using => :google) # => #<Kaupert::GeoLoc:0x12dac20 @state…> LatLng.new(51.4578329, 7.0166848).reverse_geocode(:using => Kaupert::Geocoders::GoogleGeocoder) # => #<Kaupert::GeoLoc:0x12dac20 @state…>
310 311 312 313 314 315 316 317 318 319 320 |
# File 'lib/kaupert/mapcal.rb', line 310 def reverse_geocode( = { :using => Kaupert::Geocoders::MultiGeocoder }) if [:using].is_a?(String) or [:using].is_a?(Symbol) provider = Kaupert::Geocoders.const_get("#{Kaupert::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
245 246 247 |
# File 'lib/kaupert/mapcal.rb', line 245 def to_a [lat,lng] end |
#to_s ⇒ Object
returns a string with comma-separated lat,lng values
240 241 242 |
# File 'lib/kaupert/mapcal.rb', line 240 def to_s ll end |