Class: Kaupert::Bounds

Inherits:
Object
  • Object
show all
Defined in:
lib/kaupert/mapcal.rb

Overview

Bounds represents a rectangular bounds, defined by the SW and NE corners

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(sw, ne) ⇒ Bounds

provide sw and ne to instantiate a new Bounds instance

Raises:

  • (ArgumentError)


452
453
454
455
# File 'lib/kaupert/mapcal.rb', line 452

def initialize(sw,ne)
  raise ArgumentError if !(sw.is_a?(Kaupert::LatLng) && ne.is_a?(Kaupert::LatLng))
  @sw,@ne=sw,ne
end

Instance Attribute Details

#neObject

sw and ne are LatLng objects



449
450
451
# File 'lib/kaupert/mapcal.rb', line 449

def ne
  @ne
end

#swObject

sw and ne are LatLng objects



449
450
451
# File 'lib/kaupert/mapcal.rb', line 449

def sw
  @sw
end

Class Method Details

.from_point_and_radius(point, radius, options = {}) ⇒ Object

returns an instance of bounds which completely encompases the given circle



509
510
511
512
513
514
515
516
517
518
# File 'lib/kaupert/mapcal.rb', line 509

def from_point_and_radius(point,radius,options={})
  point=LatLng.normalize(point)
  p0=point.endpoint(0,radius,options)
  p90=point.endpoint(90,radius,options)
  p180=point.endpoint(180,radius,options)
  p270=point.endpoint(270,radius,options)
  sw=Kaupert::LatLng.new(p180.lat,p270.lng)
  ne=Kaupert::LatLng.new(p0.lat,p90.lng)
  Kaupert::Bounds.new(sw,ne)
end

.normalize(thing, other = nil) ⇒ Object

Takes two main combinations of arguments to create a bounds: point,point (this is the only one which takes two arguments

point,point

. . . where a point is anything LatLng#normalize can handle (which is quite a lot)

NOTE: everything combination is assumed to pass points in the order sw, ne



526
527
528
529
530
531
532
533
534
535
536
# File 'lib/kaupert/mapcal.rb', line 526

def normalize (thing,other=nil)   
  # maybe this will be simple -- an actual bounds object is passed, and we can all go home
  return thing if thing.is_a? Bounds
  
  # no? OK, if there's no "other," the thing better be a two-element array        
  thing,other=thing if !other && thing.is_a?(Array) && thing.size==2

  # Now that we're set with a thing and another thing, let LatLng do the heavy lifting.
  # Exceptions may be thrown
  Bounds.new(Kaupert::LatLng.normalize(thing),Kaupert::LatLng.normalize(other))
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.



492
493
494
# File 'lib/kaupert/mapcal.rb', line 492

def ==(other)
  other.is_a?(Bounds) ? self.sw == other.sw && self.ne == other.ne : false
end

#centerObject

returns the a single point which is the center of the rectangular bounds



458
459
460
# File 'lib/kaupert/mapcal.rb', line 458

def center
  @sw.midpoint_to(@ne)
end

#contains?(point) ⇒ Boolean

Returns true if the bounds contain the passed point. allows for bounds which cross the meridian

Returns:

  • (Boolean)


474
475
476
477
478
479
480
481
482
483
# File 'lib/kaupert/mapcal.rb', line 474

def contains?(point)
  point=Kaupert::LatLng.normalize(point)
  res = point.lat > @sw.lat && point.lat < @ne.lat
  if crosses_meridian?
    res &= point.lng < @ne.lng || point.lng > @sw.lng
  else
    res &= point.lng < @ne.lng && point.lng > @sw.lng
  end
  res
end

#crosses_meridian?Boolean

returns true if the bounds crosses the international dateline

Returns:

  • (Boolean)


486
487
488
# File 'lib/kaupert/mapcal.rb', line 486

def crosses_meridian?
  @sw.lng > @ne.lng 
end

#to_aObject

a two-element array of two-element arrays: sw,ne



468
469
470
# File 'lib/kaupert/mapcal.rb', line 468

def to_a
  [@sw.to_a, @ne.to_a]
end

#to_sObject

a simple string representation:sw,ne



463
464
465
# File 'lib/kaupert/mapcal.rb', line 463

def to_s
  "#{@sw.to_s},#{@ne.to_s}"   
end

#to_spanObject

Equivalent to Google Maps API’s .toSpan() method on GLatLng’s.

Returns a LatLng object, whose coordinates represent the size of a rectangle defined by these bounds.



500
501
502
503
504
# File 'lib/kaupert/mapcal.rb', line 500

def to_span
  lat_span = (@ne.lat - @sw.lat).abs
  lng_span = (crosses_meridian? ? 360 + @ne.lng - @sw.lng : @ne.lng - @sw.lng).abs
  Kaupert::LatLng.new(lat_span, lng_span)
end