Class: Mongoid::Geospatial::Point

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/mongoid/geospatial/fields/point.rb

Overview

Point

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(lon, lat, alt = nil) ⇒ Point

Returns a new instance of Point.



18
19
20
21
22
# File 'lib/mongoid/geospatial/fields/point.rb', line 18

def initialize(lon, lat, alt = nil)
  @x = lon
  @y = lat
  @z = alt
end

Instance Attribute Details

#xObject Also known as: lng, lon

Returns the value of attribute x.



10
11
12
# File 'lib/mongoid/geospatial/fields/point.rb', line 10

def x
  @x
end

#yObject Also known as: lat

Returns the value of attribute y.



10
11
12
# File 'lib/mongoid/geospatial/fields/point.rb', line 10

def y
  @y
end

#zObject

Returns the value of attribute z.



10
11
12
# File 'lib/mongoid/geospatial/fields/point.rb', line 10

def z
  @z
end

Class Method Details

.demongoize(obj) ⇒ Object

Database -> Object Get it back



157
158
159
# File 'lib/mongoid/geospatial/fields/point.rb', line 157

def demongoize(obj)
  obj && new(*obj)
end

.evolve(obj) ⇒ Object

Converts the object that was supplied to a criteria into a database friendly form.



180
181
182
183
184
185
# File 'lib/mongoid/geospatial/fields/point.rb', line 180

def evolve(obj)
  case obj
  when Point then obj.mongoize
  else obj
  end
end

.mongoize(obj) ⇒ Object

Object -> Database Send it to MongoDB



164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/mongoid/geospatial/fields/point.rb', line 164

def mongoize(obj)
  case obj
  when Point  then obj.mongoize
  when String then from_string(obj)
  when Array  then from_array(obj)
  when Hash   then from_hash(obj)
  when NilClass then nil
  else
    return obj.to_xy if obj.respond_to?(:to_xy)

    raise 'Invalid Point'
  end
end

Instance Method Details

#[](args) ⇒ Object

Raises:

  • (ArgumentError)


37
38
39
40
41
# File 'lib/mongoid/geospatial/fields/point.rb', line 37

def [](args)
  raise ArgumentError, "Invalid point: #{inspect}" unless (pair = mongoize)

  pair[args]
end

#distance(other, unit = :km) ⇒ Object

Crow-flies distance. Haversine, Mongo's earth radius (6371 km). RGeo/GeoRuby still win for projections; this is ETA and "how far".

Raises:

  • (ArgumentError)


140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/mongoid/geospatial/fields/point.rb', line 140

def distance(other, unit = :km) # rubocop:disable Metrics/AbcSize
  xy = other.is_a?(Point) ? [other.x, other.y] : self.class.mongoize(other)
  raise ArgumentError, "Invalid point: #{other.inspect}" unless xy&.size == 2

  dlat = (xy[1] - y) * RAD_PER_DEG
  dlon = (xy[0] - x) * RAD_PER_DEG
  a = (Math.sin(dlat / 2)**2) +
      (Math.cos(y * RAD_PER_DEG) * Math.cos(xy[1] * RAD_PER_DEG) *
       (Math.sin(dlon / 2)**2))
  c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
  Mongoid::Geospatial.earth_radius[unit] * c
end

#each {|x| ... } ⇒ Object

Yields:

  • (x)


43
44
45
46
# File 'lib/mongoid/geospatial/fields/point.rb', line 43

def each
  yield x
  yield y
end

#mongoizeArray

Object -> Database Let's store NilClass if we are invalid.

Returns:

  • (Array)


28
29
30
31
32
# File 'lib/mongoid/geospatial/fields/point.rb', line 28

def mongoize
  return nil unless x && y

  [x, y]
end

#radius(r = 1) ⇒ Array

Helper for [self, radius]

Returns:

  • (Array)

    with [self, radius]



53
54
55
56
57
# File 'lib/mongoid/geospatial/fields/point.rb', line 53

def radius(r = 1) # rubocop:disable Naming/MethodParameterName
  return nil unless (pair = mongoize)

  [pair, r]
end

#radius_sphere(r = 1, unit = :km) ⇒ Array

Radius Sphere

Validates that #x & #y are Numeric

Returns:

  • (Array)

    with [self, radius / earth radius]



66
67
68
# File 'lib/mongoid/geospatial/fields/point.rb', line 66

def radius_sphere(r = 1, unit = :km) # rubocop:disable Naming/MethodParameterName
  radius r.to_f / Mongoid::Geospatial.earth_radius.fetch(unit)
end

#reverseArray

Point inverse/reverse

MongoDB: "x, y" Reverse: "y, x"

Returns:

  • (Array)

    Point reversed: "y, x"



132
133
134
# File 'lib/mongoid/geospatial/fields/point.rb', line 132

def reverse
  [y, x]
end

#to_aArray

Object -> Database Let's store NilClass if we are invalid.

Returns:

  • (Array)


33
34
35
36
37
# File 'lib/mongoid/geospatial/fields/point.rb', line 33

def mongoize
  return nil unless x && y

  [x, y]
end

#to_geo_jsonString

Point definition as GeoJSON

"x, y"

Returns:

  • (String)

    Point as comma separated String



119
120
121
122
# File 'lib/mongoid/geospatial/fields/point.rb', line 119

def to_geo_json
  # Return a GeoJSON point hash that MongoDB can use
  { type: 'Point', coordinates: [x, y] }
end

#to_hsh(xkey = :x, ykey = :y) ⇒ Hash Also known as: to_hash

Point representation as a Hash Optional param: custom keys.

Returns:

  • (Hash)

    with { lng_key => x, lat_key => y }



98
99
100
# File 'lib/mongoid/geospatial/fields/point.rb', line 98

def to_hsh(xkey = :x, ykey = :y)
  { xkey => x, ykey => y }
end

#to_lat_lonHash

Point representation more commonly used Latitude, Longitude

Returns:

  • (Hash)

    with { latitude: y, longitude: x }



108
109
110
# File 'lib/mongoid/geospatial/fields/point.rb', line 108

def to_lat_lon
  { latitude: y, longitude: x }
end

#to_lng_latArray

Object -> Database Let's store NilClass if we are invalid.

Returns:

  • (Array)


35
36
37
38
39
# File 'lib/mongoid/geospatial/fields/point.rb', line 35

def mongoize
  return nil unless x && y

  [x, y]
end

#to_sString

Point definition as string

"x, y"

Returns:

  • (String)

    Point as comma separated String



88
89
90
# File 'lib/mongoid/geospatial/fields/point.rb', line 88

def to_s
  "#{x}, #{y}"
end

#to_xyArray

Object -> Database Let's store NilClass if we are invalid.

Returns:

  • (Array)


34
35
36
37
38
# File 'lib/mongoid/geospatial/fields/point.rb', line 34

def mongoize
  return nil unless x && y

  [x, y]
end

#valid?Boolean

Am I valid?

Validates that #x & #y are Numeric

Returns:

  • (Boolean)

    if self #x && #y are valid



77
78
79
# File 'lib/mongoid/geospatial/fields/point.rb', line 77

def valid?
  x && y && x.is_a?(Numeric) && y.is_a?(Numeric)
end