geo_calc 0.7.1 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. data/Gemfile +4 -1
  2. data/README.textile +8 -59
  3. data/VERSION +1 -1
  4. data/geo_calc.gemspec +15 -22
  5. data/lib/geo_calc/calc/bearing.rb +1 -1
  6. data/lib/geo_calc/calc/destination.rb +3 -2
  7. data/lib/geo_calc/calc/distance.rb +1 -1
  8. data/lib/geo_calc/calc/intersection.rb +8 -8
  9. data/lib/geo_calc/calc/midpoint.rb +8 -6
  10. data/lib/geo_calc/calc/rhumb.rb +35 -16
  11. data/lib/geo_calc/calc.rb +15 -21
  12. data/lib/geo_calc/extensions/array.rb +1 -3
  13. data/lib/geo_calc/extensions/hash.rb +1 -3
  14. data/lib/geo_calc/extensions/string.rb +8 -17
  15. data/lib/geo_calc/extensions.rb +0 -1
  16. data/lib/geo_calc/pretty_print.rb +14 -14
  17. data/lib/geo_calc.rb +7 -4
  18. data/spec/geo_calc/calculations_spec.rb +2 -1
  19. data/spec/geo_calc/core_ext/array_ext_spec.rb +1 -9
  20. data/spec/geo_calc/core_ext/hash_ext_spec.rb +3 -9
  21. data/spec/geo_calc/core_ext/string_ext_spec.rb +1 -9
  22. data/spec/geo_calc/core_ext_spec.rb +1 -7
  23. data/spec/geo_calc/include_apis_spec.rb +32 -0
  24. data/spec/spec_helper.rb +13 -5
  25. metadata +52 -35
  26. data/lib/geo_calc/dms/converter.rb +0 -106
  27. data/lib/geo_calc/dms.rb +0 -5
  28. data/lib/geo_calc/extensions/math.rb +0 -6
  29. data/lib/geo_calc/extensions/numeric.rb +0 -24
  30. data/lib/geo_calc/geo_point/class_methods.rb +0 -15
  31. data/lib/geo_calc/geo_point/core_extension.rb +0 -11
  32. data/lib/geo_calc/geo_point/shared.rb +0 -29
  33. data/lib/geo_calc/geo_point.rb +0 -135
  34. data/lib/geo_units/converter.rb +0 -123
  35. data/lib/geo_units/numeric_ext.rb +0 -117
  36. data/lib/geo_units.rb +0 -21
  37. data/spec/geo_calc/dms/converter_spec.rb +0 -60
  38. data/spec/geo_calc/geo_point/class_methods_spec.rb +0 -31
  39. data/spec/geo_calc/geo_point/initializer_spec.rb +0 -148
  40. data/spec/geo_calc/geo_point/lat_lon.rb +0 -115
  41. data/spec/geo_calc/geo_point_spec.rb +0 -99
  42. data/spec/geo_units/converter_spec.rb +0 -57
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ class CalcApis
4
+ include GeoCalc
5
+ end
6
+
7
+ class CalcDistance
8
+ include GeoCalc::Distance
9
+ end
10
+
11
+
12
+
13
+ # - www.movable-type.co.uk/scripts/latlong.html
14
+ describe GeoPoint do
15
+ describe 'include all Apis' do
16
+ it 'should have Bearing api' do
17
+ CalcApis.new.should respond_to :bearing_to
18
+ end
19
+ end
20
+
21
+ describe 'include select Apis' do
22
+ it 'should not have Bearing api' do
23
+ dist = CalcDistance.new
24
+ dist.should_not respond_to :bearing_to
25
+ end
26
+
27
+ it 'should have Distance api' do
28
+ dist = CalcDistance.new
29
+ dist.should respond_to :distance_to
30
+ end
31
+ end
32
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,11 +1,19 @@
1
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- $LOAD_PATH.unshift(File.dirname(__FILE__))
3
1
  require 'rspec'
4
2
  require 'geo_calc'
5
3
 
6
- # Requires supporting files with custom matchers and macros, etc,
7
- # in ./support/ and its subdirectories.
8
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
4
+ class GeoPoint
5
+ attr_accessor :lat, :lon
6
+
7
+ def initialize lat, lon
8
+ @lat = lat
9
+ @lon = lon
10
+ end
11
+
12
+ def lng
13
+ lon
14
+ end
15
+ end
16
+
9
17
 
10
18
  RSpec.configure do |config|
11
19
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geo_calc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.7.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-06-11 00:00:00.000000000Z
12
+ date: 2011-06-13 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: require_all
16
- requirement: &2158917420 !ruby/object:Gem::Requirement
16
+ requirement: &2153783140 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,21 +21,54 @@ dependencies:
21
21
  version: 1.2.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2158917420
24
+ version_requirements: *2153783140
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: sugar-high
27
- requirement: &2158916800 !ruby/object:Gem::Requirement
27
+ requirement: &2153782640 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: 0.4.5.2
32
+ version: 0.4.6.3
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2158916800
35
+ version_requirements: *2153782640
36
+ - !ruby/object:Gem::Dependency
37
+ name: geo_units
38
+ requirement: &2153782120 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: 0.2.0
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *2153782120
47
+ - !ruby/object:Gem::Dependency
48
+ name: i18n
49
+ requirement: &2153781640 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *2153781640
58
+ - !ruby/object:Gem::Dependency
59
+ name: activesupport
60
+ requirement: &2153781060 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: 3.0.1
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *2153781060
36
69
  - !ruby/object:Gem::Dependency
37
70
  name: rspec
38
- requirement: &2158916220 !ruby/object:Gem::Requirement
71
+ requirement: &2153780540 !ruby/object:Gem::Requirement
39
72
  none: false
40
73
  requirements:
41
74
  - - ! '>='
@@ -43,10 +76,10 @@ dependencies:
43
76
  version: 2.5.0
44
77
  type: :development
45
78
  prerelease: false
46
- version_requirements: *2158916220
79
+ version_requirements: *2153780540
47
80
  - !ruby/object:Gem::Dependency
48
81
  name: bundler
49
- requirement: &2158915520 !ruby/object:Gem::Requirement
82
+ requirement: &2153779960 !ruby/object:Gem::Requirement
50
83
  none: false
51
84
  requirements:
52
85
  - - ! '>='
@@ -54,10 +87,10 @@ dependencies:
54
87
  version: '1'
55
88
  type: :development
56
89
  prerelease: false
57
- version_requirements: *2158915520
90
+ version_requirements: *2153779960
58
91
  - !ruby/object:Gem::Dependency
59
92
  name: jeweler
60
- requirement: &2158914860 !ruby/object:Gem::Requirement
93
+ requirement: &2153779440 !ruby/object:Gem::Requirement
61
94
  none: false
62
95
  requirements:
63
96
  - - ! '>='
@@ -65,10 +98,10 @@ dependencies:
65
98
  version: 1.5.2
66
99
  type: :development
67
100
  prerelease: false
68
- version_requirements: *2158914860
101
+ version_requirements: *2153779440
69
102
  - !ruby/object:Gem::Dependency
70
103
  name: rcov
71
- requirement: &2158914180 !ruby/object:Gem::Requirement
104
+ requirement: &2153778720 !ruby/object:Gem::Requirement
72
105
  none: false
73
106
  requirements:
74
107
  - - ! '>='
@@ -76,10 +109,10 @@ dependencies:
76
109
  version: '0'
77
110
  type: :development
78
111
  prerelease: false
79
- version_requirements: *2158914180
112
+ version_requirements: *2153778720
80
113
  - !ruby/object:Gem::Dependency
81
114
  name: rake
82
- requirement: &2158913340 !ruby/object:Gem::Requirement
115
+ requirement: &2153778000 !ruby/object:Gem::Requirement
83
116
  none: false
84
117
  requirements:
85
118
  - - ! '>='
@@ -87,7 +120,7 @@ dependencies:
87
120
  version: '0.9'
88
121
  type: :development
89
122
  prerelease: false
90
- version_requirements: *2158913340
123
+ version_requirements: *2153778000
91
124
  description: Geo calculations in ruby and javascript
92
125
  email: kmandrup@gmail.com
93
126
  executables: []
@@ -113,35 +146,19 @@ files:
113
146
  - lib/geo_calc/calc/intersection.rb
114
147
  - lib/geo_calc/calc/midpoint.rb
115
148
  - lib/geo_calc/calc/rhumb.rb
116
- - lib/geo_calc/dms.rb
117
- - lib/geo_calc/dms/converter.rb
118
149
  - lib/geo_calc/extensions.rb
119
150
  - lib/geo_calc/extensions/array.rb
120
151
  - lib/geo_calc/extensions/hash.rb
121
- - lib/geo_calc/extensions/math.rb
122
- - lib/geo_calc/extensions/numeric.rb
123
152
  - lib/geo_calc/extensions/string.rb
124
153
  - lib/geo_calc/extensions/symbol.rb
125
- - lib/geo_calc/geo_point.rb
126
- - lib/geo_calc/geo_point/class_methods.rb
127
- - lib/geo_calc/geo_point/core_extension.rb
128
- - lib/geo_calc/geo_point/shared.rb
129
154
  - lib/geo_calc/pretty_print.rb
130
- - lib/geo_units.rb
131
- - lib/geo_units/converter.rb
132
- - lib/geo_units/numeric_ext.rb
133
155
  - spec/geo_calc/calculations_spec.rb
134
156
  - spec/geo_calc/core_ext/array_ext_spec.rb
135
157
  - spec/geo_calc/core_ext/hash_ext_spec.rb
136
158
  - spec/geo_calc/core_ext/numeric_geo_ext_spec.rb
137
159
  - spec/geo_calc/core_ext/string_ext_spec.rb
138
160
  - spec/geo_calc/core_ext_spec.rb
139
- - spec/geo_calc/dms/converter_spec.rb
140
- - spec/geo_calc/geo_point/class_methods_spec.rb
141
- - spec/geo_calc/geo_point/initializer_spec.rb
142
- - spec/geo_calc/geo_point/lat_lon.rb
143
- - spec/geo_calc/geo_point_spec.rb
144
- - spec/geo_units/converter_spec.rb
161
+ - spec/geo_calc/include_apis_spec.rb
145
162
  - spec/spec_helper.rb
146
163
  - vendor/assets/javascript/geo_calc.js
147
164
  homepage: http://github.com/kristianmandrup/geo_calc
@@ -159,7 +176,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
159
176
  version: '0'
160
177
  segments:
161
178
  - 0
162
- hash: -4137681882050840880
179
+ hash: -4458324713817276308
163
180
  required_rubygems_version: !ruby/object:Gem::Requirement
164
181
  none: false
165
182
  requirements:
@@ -1,106 +0,0 @@
1
- module GeoCalc
2
- module Dms
3
- module Converter
4
- include GeoCalc::NumericCheckExt
5
-
6
- def parse_dms dms_str
7
- # check for signed decimal degrees without NSEW, if so return it directly
8
- return dms_str if is_numeric?(dms_str)
9
-
10
- # strip off any sign or compass dir'n & split out separate d/m/s
11
- dms = dms_str.trim.gsub(/^-/,'').gsub(/[NSEW]$/i,'').split(/[^0-9.,]+/).map(&:trim).map(&:to_f)
12
- return nil if dms.empty?
13
-
14
- # and convert to decimal degrees...
15
- deg = case dms.length
16
- when 3 # interpret 3-part result as d/m/s
17
- dms[0]/1 + dms[1]/60 + dms[2]/3600
18
- when 2 # interpret 2-part result as d/m
19
- dms[0]/1 + dms[1]/60
20
- when 1 # just d (possibly decimal) or non-separated dddmmss
21
- d = dms[0];
22
- # check for fixed-width unseparated format eg 0033709W
23
- d = "0#{d}" if (/[NS]/i.match(dms_str)) # - normalise N/S to 3-digit degrees
24
- d = "#{d.slice(0,3)/1}#{deg.slice(3,5)/60}#{deg.slice(5)/3600}" if (/[0-9]{7}/.match(deg))
25
- d
26
- else
27
- nil
28
- end
29
- return nil if !deg
30
- deg = (deg * -1) if (/^-|[WS]$/i.match(dms_str.trim)) # take '-', west and south as -ve
31
- deg.to_f
32
- end
33
-
34
- # Convert decimal degrees to deg/min/sec format
35
- # - degree, prime, double-prime symbols are added, but sign is discarded, though no compass
36
- # direction is added
37
- #
38
- #
39
- # @param {Number} deg: Degrees
40
- # @param {String} [format=dms]: Return value as 'd', 'dm', 'dms'
41
- # @param {Number} [dp=0|2|4]: No of decimal places to use - default 0 for dms, 2 for dm, 4 for d
42
- # @returns {String} deg formatted as deg/min/secs according to specified format
43
- # @throws {TypeError} deg is an object, perhaps DOM object without .value?
44
-
45
- def to_dms deg, format = :dms, dp = nil
46
- deg = begin
47
- deg.to_f
48
- rescue
49
- nil
50
- end
51
- return nil if !deg # give up here if we can't make a number from deg
52
-
53
- # default values
54
- format ||= :dms
55
- dp = if dp.nil?
56
- case format.to_sym
57
- when :d
58
- 4
59
- when :dm
60
- 2
61
- else
62
- 0 # default
63
- end
64
- end
65
- dp ||= 0
66
-
67
- deg = deg.abs # (unsigned result ready for appending compass dir'n)
68
-
69
- case format
70
- when :d
71
- d = deg.round(dp) # round degrees
72
- ds = "0#{d}" if (d <100) # pad with leading zeros
73
- ds = "0#{ds}" if (d <10)
74
- dms = ds.to_s.concat("\u00B0") # add º symbol
75
- when :dm
76
- min = (deg*60).round(dp) # convert degrees to minutes & round
77
- d = d.to_i
78
- d = (min / 60).floor # get component deg/min
79
- m = (min % 60).round(dp) # pad with trailing zeros
80
- ds = d
81
- ms = m
82
- ds = "0#{d}" if (d<100) # pad with leading zeros
83
- ds = "0#{d}" if (d<10)
84
- ms = "0#{m}" if (m<10)
85
- dms = ds.to_s.concat("\u00B0", ms, "\u2032") # add º, ' symbols
86
- when :dms
87
- sec = (deg * 3600).round # convert degrees to seconds & round
88
- d = (sec / 3600).floor # get component deg/min/sec
89
- m = ((sec / 60) % 60).floor
90
- s = (sec % 60).round(dp) # pad with trailing zeros
91
- ds = d
92
- ms = m
93
- ss = s
94
- ds = "0#{d}" if (d < 100) # pad with leading zeros
95
- ds = "0#{ds}" if (d < 10)
96
- ms = "0#{m}" if (m < 10)
97
- ss = "0#{s}" if (s < 10)
98
- dms = ds.to_s.concat("\u00B0", ms, "\u2032", ss, "\u2033") # add º, ', " symbols
99
- end
100
- return dms
101
- end
102
-
103
- extend self
104
- end
105
- end
106
- end
data/lib/geo_calc/dms.rb DELETED
@@ -1,5 +0,0 @@
1
- module GeoCalc
2
- module Dms
3
- autoload :Converter, 'geo_calc/dms/converter'
4
- end
5
- end
@@ -1,6 +0,0 @@
1
- module Math
2
- def self.log10e
3
- 0.4342944819032518
4
- end
5
- end
6
-
@@ -1,24 +0,0 @@
1
- require 'geo_units'
2
-
3
- module GeoCalc
4
- module NumericCheckExt
5
- def is_numeric? arg
6
- arg.is_a? Numeric
7
- end
8
-
9
- alias_method :is_num?, :is_numeric?
10
-
11
- def check_numeric! arg
12
- raise ArgumentError, "Argument must be Numeric" if !is_numeric? arg
13
- end
14
- end
15
- end
16
-
17
- class Fixnum
18
- include ::GeoUnits::NumericExt
19
- end
20
-
21
- class Float
22
- include ::GeoUnits::NumericExt
23
- end
24
-
@@ -1,15 +0,0 @@
1
- require 'geo_calc/geo_point/shared'
2
-
3
- class GeoPoint
4
- module ClassMethods
5
- def earth_radius_km
6
- @earth_radius_km ||= 6371
7
- end
8
-
9
- def coord_mode
10
- @coord_mode ||= :lat_lng
11
- end
12
-
13
- include Shared
14
- end
15
- end
@@ -1,11 +0,0 @@
1
- class GeoPoint
2
- module CoreExtension
3
- def to_coords
4
- send(:"to_#{GeoPoint.coord_mode}")
5
- end
6
-
7
- def geo_point
8
- GeoPoint.new to_coords
9
- end
10
- end
11
- end
@@ -1,29 +0,0 @@
1
- class GeoPoint
2
- module Shared
3
- def unit
4
- :degrees
5
- end
6
-
7
- def earth_radius_km= radius_km
8
- raise ArgumentException, "Not a valid earth km radius: #{radius_km}" unless valid_earth_radius? radius_km
9
- @earth_radius_km = radius_km
10
- end
11
-
12
- def coord_mode= mode
13
- raise ArgumentException, "Not a valid coordinates mode: #{mode}" unless valid_mode? mode
14
- @coord_mode = mode
15
- end
16
-
17
- protected
18
-
19
- include GeoCalc::NumericCheckExt
20
-
21
- def valid_earth_radius? radius_km
22
- is_numeric?(radius_km) && radius_km.is_between?(6350, 6380)
23
- end
24
-
25
- def valid_mode? mode
26
- [:lng_lat, :lat_lng].include? mode
27
- end
28
- end
29
- end
@@ -1,135 +0,0 @@
1
- require 'sugar-high/arguments'
2
- require 'geo_calc/calc'
3
- require 'geo_calc/extensions'
4
- require 'geo_calc/geo_point/shared'
5
-
6
- # Sample usage:
7
- # p1 = GeoPoint.new(51.5136, -0.0983)
8
- # p2 = GeoPoint.new(51.4778, -0.0015)
9
- # dist = p1.distance_to(p2) # in km
10
- # brng = p1.bearing_to(p2) # in degrees clockwise from north
11
- # ... etc
12
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
13
-
14
- class GeoPoint
15
- include GeoCalc::Calc::All
16
-
17
- autoload :Shared, 'geo_calc/geo_point/shared'
18
- autoload :ClassMethods, 'geo_calc/geo_point/class_methods'
19
- autoload :CoreExtension, 'geo_calc/geo_point/core_extension'
20
-
21
- attr_reader :lat, :lon
22
-
23
- # Creates a point on the earth's surface at the supplied latitude / longitude
24
- #
25
- # - Numeric latitude in numeric degrees
26
- # - Numeric longitude in numeric degrees
27
-
28
- # Optional options
29
- # - :radius - earth radius in km
30
- # - :mode - coordinates mode, either :lng_lat or :lat_lng, otherwise uses global setting as per GeoPoint.coord_mode
31
- def initialize *args
32
- options = args.is_a?(GeoPoint) ? {} : args.last_option
33
- earth_radius_km = options[:radius]
34
- coord_mode = options[:mode]
35
-
36
- case args.size
37
- when 1
38
- create_from_one args
39
- when 2
40
- create_from_two *args
41
- else
42
- raise "GeoPoint must be initialized with either one or to arguments defining the (latitude, longitude) coordinate on the map"
43
- end
44
- end
45
-
46
- extend ClassMethods
47
- include Shared
48
-
49
- def coord_mode
50
- @coord_mode ||= GeoPoint.coord_mode
51
- end
52
-
53
- def earth_radius_km
54
- @earth_radius_km ||= GeoPoint.earth_radius_km # default
55
- end
56
-
57
- def lat= value
58
- @lat = value.to_lat
59
- end
60
-
61
- def lon= value
62
- @lon = value.to_lng
63
- end
64
-
65
- (Symbol.lng_symbols - [:lon]).each do |sym|
66
- class_eval %{
67
- alias_method :#{sym}, :lon
68
- alias_method :#{sym}=, :lon=
69
- }
70
- end
71
- alias_method :to_lng, :lng
72
-
73
- (Symbol.lat_symbols - [:lat]).each do |sym|
74
- class_eval %{
75
- alias_method :#{sym}, :lat
76
- alias_method :#{sym}=, :lat=
77
- }
78
- end
79
- alias_method :to_lat, :lat
80
-
81
- def [] key
82
- case key
83
- when Fixnum
84
- raise ArgumentError, "Index must be 0 or 1" if !(0..1).cover?(key)
85
- to_a[key]
86
- when String, Symbol
87
- send(key) if respond_to? key
88
- else
89
- raise ArgumentError, "Key must be a Fixnum (index) or a method name"
90
- end
91
- end
92
-
93
- alias_method :to_dms, :to_s
94
-
95
- def reverse_point!
96
- self.lat = lat * -1
97
- self.lng = lng * -1
98
- self
99
- end
100
-
101
- def reverse_point
102
- self.dup.reverse_point!
103
- end
104
-
105
- def to_lat_lng
106
- [lat, lng]
107
- end
108
-
109
- def to_lng_lat
110
- [lng, lat]
111
- end
112
-
113
- def to_a
114
- send(:"to_#{coord_mode}")
115
- end
116
-
117
- protected
118
-
119
- include ::GeoCalc::NumericCheckExt
120
-
121
- def to_coords points
122
- points.send(:"to_#{coord_mode}")
123
- end
124
-
125
- def create_from_one args
126
- args = args.first
127
- create_from_two *to_coords(args)
128
- end
129
-
130
- def create_from_two lat, lon
131
- @lat = lat.to_lat
132
- @lon = lon.to_lng
133
- end
134
- end
135
-