Class: Terraformer::Point

Inherits:
Geometry show all
Defined in:
lib/terraformer/point.rb

Constant Summary collapse

DEFAULT_RANDOM_POINTS =
10
DEFAULT_RANDOM_DELTA =

degrees

0.05
DEFAULT_RANDOM_ROUND =
5

Constants inherited from Geometry

Geometry::MULTI_REGEX

Instance Attribute Summary

Attributes inherited from Geometry

#coordinates, #crs

Instance Method Summary collapse

Methods inherited from Geometry

#==, #convex_hull, #each_coordinate, #geographic?, #get, #intersects?, iter_coordinate, #map_coordinate, #mercator?, #to_feature, #to_geographic, #to_hash, #to_mercator

Methods included from Geometry::ClassMethods

#arrays_intersect_arrays?, #coordinates_contain_point?, #edge_intersects_edge?, #line_contains_point?

Methods inherited from Primitive

#bbox, #envelope, #to_json, #type

Constructor Details

#initialize(*args) ⇒ Point

Returns a new instance of Point.



9
10
11
12
13
14
15
16
# File 'lib/terraformer/point.rb', line 9

def initialize *args
  super

  # must be a single point
  unless Terraformer::Coordinate === coordinates
    raise ArgumentError.new 'invalid coordinates for Terraformer::Point'
  end
end

Instance Method Details

#contains?(obj) ⇒ Boolean

Returns:

  • (Boolean)


63
64
65
66
67
68
69
70
# File 'lib/terraformer/point.rb', line 63

def contains? obj
  case obj
  when Point
    self == obj
  else
    raise ArgumentError.new "unsupported type: #{obj.type rescue obj.class}"
  end
end

#distance_and_bearing_to(obj) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/terraformer/point.rb', line 22

def distance_and_bearing_to obj
  dabt = case obj
         when Point
           [first_coordinate.distance_and_bearing_to(obj.first_coordinate)]

         when MultiPoint
           obj.coordinates.map {|c| first_coordinate.distance_and_bearing_to c}

         when LineString
           obj.coordinates.map {|c| first_coordinate.distance_and_bearing_to c}

         when MultiLineString
           obj.line_strings.map {|ls| distance_and_bearing_to ls}

         when Polygon
           obj.line_strings[0].coordinates.map {|c| first_coordinate.distance_and_bearing_to c}

         when MultiPolygon
           obj.polygons.map {|p| distance_and_bearing_to p}

         # todo other cases

         else
           raise ArgumentError.new "unsupported type: #{obj.type rescue obj.class}"
         end
  dabt.flatten!
  dabt.minmax_by {|db| db[:distance]}
end

#distance_to(obj, minmax = :min) ⇒ Object



51
52
53
# File 'lib/terraformer/point.rb', line 51

def distance_to obj, minmax = :min
  distance_and_bearing_to(obj)[minmax == :min ? 0 : 1][:distance]
end

#final_bearing_to(obj) ⇒ Object



59
60
61
# File 'lib/terraformer/point.rb', line 59

def final_bearing_to obj
  distance_and_bearing_to(obj)[0][:bearing][:final]
end

#first_coordinateObject



18
19
20
# File 'lib/terraformer/point.rb', line 18

def first_coordinate
  coordinates
end

#initial_bearing_to(obj) ⇒ Object



55
56
57
# File 'lib/terraformer/point.rb', line 55

def initial_bearing_to obj
  distance_and_bearing_to(obj)[0][:bearing][:initial]
end

#random_points(n = DEFAULT_RANDOM_POINTS, delta = DEFAULT_RANDOM_DELTA, round = DEFAULT_RANDOM_ROUND) ⇒ Object



91
92
93
94
95
96
97
98
99
100
# File 'lib/terraformer/point.rb', line 91

def random_points n = DEFAULT_RANDOM_POINTS,
                  delta = DEFAULT_RANDOM_DELTA,
                  round = DEFAULT_RANDOM_ROUND
  s = ->{rand(2) * 2 - 1} # -1 or 1
  Array.new(n) do
    x = (coordinates.x + s[] * rand() * delta).round(round)
    y = (coordinates.y + s[] * rand() * delta).round(round)
    Terraformer::Point.new x, y
  end
end

#within?(obj) ⇒ Boolean

Returns:

  • (Boolean)


72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/terraformer/point.rb', line 72

def within? obj
  case obj
  when Point
    self == obj
  when MultiPoint
    obj.coordinates.any? {|c| self.coordinates == c}
  when LineString
    obj.coordinates.any? {|c| self.coordinates == c}
  when MultiLineString
    obj.line_strings.any? {|ls| within? ls}
  when Polygon
    obj.contains? self
  when MultiPolygon
    obj.polygons.any? {|p| p.contains? self}
  else
    raise ArgumentError unless Geometry === obj
  end
end