Class: Mongoid::Geospatial::Point
- Inherits:
-
Object
- Object
- Mongoid::Geospatial::Point
- Includes:
- Enumerable
- Defined in:
- lib/mongoid/geospatial/fields/point.rb
Overview
Point
Instance Attribute Summary collapse
-
#x ⇒ Object
(also: #lng, #lon)
Returns the value of attribute x.
-
#y ⇒ Object
(also: #lat)
Returns the value of attribute y.
-
#z ⇒ Object
Returns the value of attribute z.
Class Method Summary collapse
-
.demongoize(obj) ⇒ Object
Database -> Object Get it back.
-
.evolve(obj) ⇒ Object
Converts the object that was supplied to a criteria into a database friendly form.
-
.mongoize(obj) ⇒ Object
Object -> Database Send it to MongoDB.
Instance Method Summary collapse
- #[](args) ⇒ Object
-
#distance(other, unit = :km) ⇒ Object
Crow-flies distance.
- #each {|x| ... } ⇒ Object
-
#initialize(lon, lat, alt = nil) ⇒ Point
constructor
A new instance of Point.
-
#mongoize ⇒ Array
Object -> Database Let's store NilClass if we are invalid.
-
#radius(r = 1) ⇒ Array
Helper for [self, radius].
-
#radius_sphere(r = 1, unit = :km) ⇒ Array
Radius Sphere.
-
#reverse ⇒ Array
Point inverse/reverse.
-
#to_a ⇒ Array
Object -> Database Let's store NilClass if we are invalid.
-
#to_geo_json ⇒ String
Point definition as GeoJSON.
-
#to_hsh(xkey = :x, ykey = :y) ⇒ Hash
(also: #to_hash)
Point representation as a Hash Optional param: custom keys.
-
#to_lat_lon ⇒ Hash
Point representation more commonly used Latitude, Longitude.
-
#to_lng_lat ⇒ Array
Object -> Database Let's store NilClass if we are invalid.
-
#to_s ⇒ String
Point definition as string.
-
#to_xy ⇒ Array
Object -> Database Let's store NilClass if we are invalid.
-
#valid? ⇒ Boolean
Am I valid?.
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
#x ⇒ Object 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 |
#y ⇒ Object 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 |
#z ⇒ Object
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
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".
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
43 44 45 46 |
# File 'lib/mongoid/geospatial/fields/point.rb', line 43 def each yield x yield y end |
#mongoize ⇒ Array
Object -> Database Let's store NilClass if we are invalid.
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]
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
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 |
#reverse ⇒ Array
Point inverse/reverse
MongoDB: "x, y" Reverse: "y, x"
132 133 134 |
# File 'lib/mongoid/geospatial/fields/point.rb', line 132 def reverse [y, x] end |
#to_a ⇒ Array
Object -> Database Let's store NilClass if we are invalid.
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_json ⇒ String
Point definition as GeoJSON
"x, y"
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.
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_lon ⇒ Hash
Point representation more commonly used Latitude, Longitude
108 109 110 |
# File 'lib/mongoid/geospatial/fields/point.rb', line 108 def to_lat_lon { latitude: y, longitude: x } end |
#to_lng_lat ⇒ Array
Object -> Database Let's store NilClass if we are invalid.
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_s ⇒ String
Point definition as string
"x, y"
88 89 90 |
# File 'lib/mongoid/geospatial/fields/point.rb', line 88 def to_s "#{x}, #{y}" end |
#to_xy ⇒ Array
Object -> Database Let's store NilClass if we are invalid.
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
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 |