silva 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,6 +1,10 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+ require 'rake/testtask'
3
4
 
4
- task :test do
5
- ruby "test/test_helper.rb"
5
+ $:.unshift File.expand_path("../lib", __FILE__)
6
+ require "silva/version"
7
+
8
+ Rake::TestTask.new do |t|
9
+ t.pattern = 'test/silva/test_*.rb'
6
10
  end
@@ -1,3 +1,5 @@
1
+ require 'silva/system'
2
+
1
3
  module Silva
2
4
  ##
3
5
  # A spoonful of syntactic sugar for creating location systems from the relevant parameters:
@@ -8,7 +10,7 @@ module Silva
8
10
  module Location
9
11
  ##
10
12
  # Create a location system from the given parameters.
11
- #
13
+ #
12
14
  # @param [Symbol] system_name The name of the system -- at present, :wgs84, :en, :osgb36 or :gridref.
13
15
  # @param [Hash] options Parameters relevant to the system (see individual systems for details).
14
16
  # @return [Silva::System] A new location system.
@@ -1,20 +1,5 @@
1
1
  module Silva
2
- ##
3
- # A location system -- :wgs84, :osgb36, :en or :gridref.
4
2
  module System
5
- ##
6
- # A factory method to simplify and moderate creation of location systems.
7
- # @param [Symbol] system_name The name of the system to be created.
8
- # @param [Hash] options Parameters relevant to the given system.
9
- # @return [Silva::System] A valid location system.
10
- # @raises Silva::InvalidSystemError If the given system can't be created.
11
- def self.create(system_name, options)
12
- system = Silva::System.const_get(system_name.to_s.capitalize)
13
- system.new(options)
14
- rescue NameError
15
- raise Silva::InvalidSystemError, "Can't create system: #{system_name}"
16
- end
17
-
18
3
  ##
19
4
  # Provides basic utility functions.
20
5
  #
@@ -38,7 +23,7 @@ module Silva
38
23
 
39
24
  ##
40
25
  # Transforms the base system to a different system.
41
- #
26
+ #
42
27
  # @param [Symbol] target_system_name The system to convert to.
43
28
  # @param [Hash] options Parameters relevant to the target system.
44
29
  # @return [Silva::System] A new location system of type target_system_name.
@@ -1,3 +1,7 @@
1
+ require 'silva/system/base'
2
+ require 'silva/system/osen'
3
+ require 'silva/transform'
4
+
1
5
  module Silva
2
6
  module System
3
7
  ##
@@ -9,8 +13,8 @@ module Silva
9
13
  def to_s
10
14
  [easting, northing].to_s
11
15
  end
12
-
13
- private
16
+
17
+ private
14
18
 
15
19
  def to_osgb36(options = nil)
16
20
  Silva::Transform.en_to_osgb36(self)
@@ -1,8 +1,12 @@
1
+ require 'silva/system/base'
2
+ require 'silva/system/osen'
3
+ require 'silva/transform'
4
+
1
5
  module Silva
2
6
  module System
3
7
  ##
4
8
  # Location system representing Ordnance Survey Standard Grid References.
5
- #
9
+ #
6
10
  # Can be created given the options :easting => e, :northing => n or :gridref => g
7
11
  #
8
12
  class Gridref < Base
@@ -39,7 +43,7 @@ module Silva
39
43
  n100k = (northing / 100000).floor
40
44
  index = n100k * OSGB_GRID_WIDTH + e100k
41
45
  prefix = OSGB_PREFIXES[index]
42
-
46
+
43
47
  e = ((easting % OSGB_GRID_SCALE) / (10**(5 - @digits / 2))).round
44
48
  n = ((northing % OSGB_GRID_SCALE) / (10**(5 - @digits / 2))).round
45
49
 
@@ -1,3 +1,7 @@
1
+ require 'silva/system/base'
2
+ require 'silva/system/co_ordinate'
3
+ require 'silva/transform'
4
+
1
5
  module Silva
2
6
  module System
3
7
  ##
@@ -1,3 +1,7 @@
1
+ require 'silva/system/base'
2
+ require 'silva/system/co_ordinate'
3
+ require 'silva/transform'
4
+
1
5
  module Silva
2
6
  module System
3
7
  ##
@@ -1,3 +1,5 @@
1
+ require 'silva/system'
2
+
1
3
  module Silva
2
4
  ##
3
5
  # Encapsulates the hairy maths required to perform the various transforms.
@@ -23,7 +25,7 @@ module Silva
23
25
  LAMBDA0 = -2 * Math::PI / 180
24
26
 
25
27
  # Helmert transform parameters
26
- HELMERT_PARAMS = {
28
+ HELMERT_PARAMS = {
27
29
  :tx=> -446.448, :ty=> 125.157, :tz=> -542.060, # m
28
30
  :rx=> -0.1502, :ry=> -0.2470, :rz=> -0.8421, # sec
29
31
  :s=> 20.4894 # ppm
@@ -42,7 +44,6 @@ module Silva
42
44
  helmert_transform(osgb36, :wgs84, AIRY1830, HELMERT_PARAMS.inject({}) { |h, (k, v)| h[k] = v * -1; h }, GRS80)
43
45
  end
44
46
 
45
-
46
47
  ##
47
48
  # Convert a :wgs84 co-ordinate system to :osgb36
48
49
  #
@@ -112,7 +113,7 @@ module Silva
112
113
 
113
114
  nu, rho, eta2 = transverse_and_meridional_radii(phi, ellipsoid)
114
115
  m = meridional_arc(phi, ellipsoid)
115
-
116
+
116
117
  i = m + N0
117
118
  ii = (nu / 2) * Math.sin(phi) * Math.cos(phi)
118
119
  iii = (nu / 24) * Math.sin(phi) * Math.cos(phi)**3 * (5 - Math.tan(phi)**2 + 9 * eta2)
@@ -121,15 +122,15 @@ module Silva
121
122
  v = (nu / 6) * Math.cos(phi)**3 * (nu / rho - Math.tan(phi)**2)
122
123
  vi = (nu / 120) * Math.cos(phi)**5 * \
123
124
  (5 - 18 * Math.tan(phi)**2 + Math.tan(phi)**4 + 14 * eta2 - 58 * Math.tan(phi)**4 * eta2)
124
-
125
+
125
126
  n = i + ii * (lambda - LAMBDA0)**2 + iii * (lambda - LAMBDA0)**4 + iiia * (lambda - LAMBDA0)**6
126
127
  e = E0 + iv * (lambda - LAMBDA0) + v * (lambda - LAMBDA0)**3 + vi * (lambda - LAMBDA0)**5
127
-
128
+
128
129
  System.create(:en, :easting => e.round, :northing => n.round)
129
130
  end
130
131
 
131
132
  # Transform to/from :osgb36/:wgs84 co-ordinate systems.
132
- # Algorithm from:
133
+ # Algorithm from:
133
134
  # http://www.ordnancesurvey.co.uk/oswebsite/gps/information/coordinatesystemsinfo/guidecontents/guide6.html
134
135
  # Portions of code from:
135
136
  # http://www.harrywood.co.uk/blog/2010/06/29/ruby-code-for-converting-to-uk-ordnance-survey-coordinate-systems-from-wgs84/
@@ -138,40 +139,40 @@ module Silva
138
139
  phi = to_rad(source_system.lat)
139
140
  lambda = to_rad(source_system.long)
140
141
  h = source_system.alt
141
-
142
+
142
143
  a1 = ellipsoid_1[:a]
143
-
144
+
144
145
  # convert co-ordinates to 3D Cartesian. See:
145
146
  # http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/A_Guide_to_Coordinate_Systems_in_Great_Britain.pdf
146
147
  e_sq1 = eccentricity_squared(ellipsoid_1)
147
148
  nu = a1 / Math.sqrt(1 - e_sq1 * Math.sin(phi)**2)
148
-
149
+
149
150
  x1 = (nu + h) * Math.cos(phi) * Math.cos(lambda)
150
151
  y1 = (nu + h) * Math.cos(phi) * Math.sin(lambda)
151
152
  z1 = ((1 - e_sq1) * nu + h) * Math.sin(phi)
152
-
153
+
153
154
  # apply Helmert transformation
154
155
  tx = transform[:tx]
155
156
  ty = transform[:ty]
156
157
  tz = transform[:tz]
157
- rx = transform[:rx] / 3600 * Math::PI / 180
158
+ rx = transform[:rx] / 3600 * Math::PI / 180
158
159
  ry = transform[:ry] / 3600 * Math::PI / 180
159
160
  rz = transform[:rz] / 3600 * Math::PI / 180
160
- s1 = transform[:s] / 1e6 + 1
161
-
161
+ s1 = transform[:s] / 1e6 + 1
162
+
162
163
  x2 = tx + x1 * s1 - y1 * rz + z1 * ry
163
164
  y2 = ty + x1 * rz + y1 * s1 - z1 * rx
164
165
  z2 = tz - x1 * ry + y1 * rx + z1 * s1
165
-
166
+
166
167
  # convert 3D Cartesian co-ordinates back to lat, long, alt
167
168
  a2 = ellipsoid_2[:a]
168
169
  precision = 4 / a2
169
-
170
+
170
171
  e_sq2 = eccentricity_squared(ellipsoid_2)
171
172
  p = Math.sqrt(x2**2 + y2**2)
172
173
  phi = Math.atan2(z2, p * (1 - e_sq2))
173
174
  phi_prime = 2 * Math::PI
174
-
175
+
175
176
  while ((phi - phi_prime).abs > precision) do
176
177
  nu = a2 / Math.sqrt(1 - e_sq2 * Math.sin(phi)**2)
177
178
  phi_prime = phi
@@ -180,7 +181,7 @@ module Silva
180
181
 
181
182
  lambda = Math.atan2(y2, x2)
182
183
  h = p / Math.cos(phi) - nu
183
-
184
+
184
185
  System.create(target_system, :lat => to_deg(phi).round(DEGREE_ROUNDING_PLACES),\
185
186
  :long => to_deg(lambda).round(DEGREE_ROUNDING_PLACES), :alt => h)
186
187
  end
data/lib/silva/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Silva
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/lib/silva.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Silva makes it simple to convert WGS84 (GPS) location data to and from the UK
1
+ # Silva makes it simple to convert WGS84 (GPS) location data to and from the UK
2
2
  # Ordnance Survey OSGB36 formats (grid references, eastings/northings, and longitude/latitude).
3
3
  #
4
4
  # Silva was inspired by the work of Chris Veness and Harry Wood:
@@ -6,9 +6,9 @@
6
6
  # http://www.harrywood.co.uk/blog/2010/06/29/ruby-code-for-converting-to-uk-ordnance-survey-coordinate-systems-from-wgs84/
7
7
  #
8
8
  # Portions of Harry's code remain, especially in Silva::Transform::helmert_transform,
9
- # but algorithms have been clarified so as to be easily comparable with those given by
9
+ # but algorithms have been clarified so as to be easily comparable with those given by
10
10
  # Ordnance Survey.
11
- #
11
+ #
12
12
  # Usage:
13
13
  # location = Silva::Location.from(:wgs84, data[:wgs84]).to(:gridref, :digits => 8)
14
14
  #
@@ -17,14 +17,24 @@
17
17
  # Requires:: Ruby 1.9
18
18
  # License:: Provided under the FreeBSD License (http://www.freebsd.org/copyright/freebsd-license.html)
19
19
 
20
- require_relative 'silva/version'
21
- require_relative 'silva/exception'
22
- require_relative 'silva/location'
23
- require_relative 'silva/transform'
24
- require_relative 'silva/system/base'
25
- require_relative 'silva/system/co_ordinate'
26
- require_relative 'silva/system/osen'
27
- require_relative 'silva/system/wgs84'
28
- require_relative 'silva/system/osgb36'
29
- require_relative 'silva/system/en'
30
- require_relative 'silva/system/gridref'
20
+ require 'silva/version'
21
+ require 'silva/location'
22
+ require 'silva/system'
23
+
24
+ module Silva
25
+ ##
26
+ # Indicates that an invalid system name has been passed.
27
+ class InvalidSystemError < StandardError; end
28
+ ##
29
+ # Indicates that an invalid transform has been attempted.
30
+ class InvalidTransformError < StandardError; end
31
+ ##
32
+ # Indicates that an invalid parameter has been passed.
33
+ class InvalidParamError < StandardError; end
34
+ ##
35
+ # Indicates that an invalid parameter value has been passed.
36
+ class InvalidParamValueError < StandardError; end
37
+ ##
38
+ # Indicates that an insufficient parameters have been passed.
39
+ class InsufficientParamsError < StandardError; end
40
+ end
data/silva.gemspec CHANGED
@@ -1,5 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/silva/version', __FILE__)
2
+ lib = File.expand_path('../lib/', __FILE__)
3
+ $LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
4
+ require 'silva/version'
3
5
 
4
6
  Gem::Specification.new do |gem|
5
7
  gem.authors = ["Robert Dallas Gray"]
@@ -9,8 +11,7 @@ Gem::Specification.new do |gem|
9
11
  gem.homepage = "http://github.com/rdallasgray/silva"
10
12
  gem.license = "FreeBSD"
11
13
  gem.required_ruby_version = ">= 1.9"
12
- gem.add_development_dependency "test/unit"
13
-
14
+ gem.add_development_dependency "test-unit"
14
15
 
15
16
  gem.files = `git ls-files`.split($\)
16
17
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
@@ -1,3 +1,5 @@
1
+ require_relative '../test_helper'
2
+
1
3
  class TestBadData < Test::Unit::TestCase
2
4
  def setup
3
5
  @data = Silva::Test::DATA_BAD
@@ -16,4 +18,3 @@ class TestBadData < Test::Unit::TestCase
16
18
  end
17
19
  end
18
20
  end
19
-
File without changes
@@ -1,3 +1,5 @@
1
+ require_relative '../test_helper'
2
+
1
3
  class TestEn < Test::Unit::TestCase
2
4
 
3
5
  def test_en_to_wgs84
@@ -1,3 +1,5 @@
1
+ require_relative '../test_helper'
2
+
1
3
  class TestGridref < Test::Unit::TestCase
2
4
  def test_gridref_no_digits
3
5
  Silva::Test::DATA.each do |data|
@@ -5,7 +7,7 @@ class TestGridref < Test::Unit::TestCase
5
7
  assert_equal(data[:gridref], l.to_s)
6
8
  end
7
9
  end
8
-
10
+
9
11
  def test_gridref_to_en
10
12
  Silva::Test::DATA.each do |data|
11
13
  options = { :gridref => data[:gridref], :digits => 8 }
@@ -1,6 +1,8 @@
1
+ require_relative '../test_helper'
2
+
1
3
  class TestLocation < Test::Unit::TestCase
2
4
  def test_invalid_system_raises_error
3
- assert_raise Silva::InvalidSystemError do
5
+ assert_raise Silva::InvalidSystemError do
4
6
  l = Silva::Location.from(:invalid, nil)
5
7
  end
6
8
  end
@@ -1,3 +1,5 @@
1
+ require_relative '../test_helper'
2
+
1
3
  class TestOsgb36 < Test::Unit::TestCase
2
4
  def test_osgb36_to_en
3
5
  Silva::Test::DATA.each do |data|
@@ -1,3 +1,5 @@
1
+ require_relative '../test_helper'
2
+
1
3
  class TestWgs84 < Test::Unit::TestCase
2
4
  def test_wgs84_to_en
3
5
  Silva::Test::DATA.each do |data|
@@ -22,4 +24,3 @@ class TestWgs84 < Test::Unit::TestCase
22
24
  end
23
25
  end
24
26
  end
25
-
data/test/test_helper.rb CHANGED
@@ -1,9 +1,3 @@
1
- require 'test/unit'
2
- require_relative '../lib/silva'
3
- require_relative 'test_data'
4
- require_relative 'test_location'
5
- require_relative 'test_wgs84'
6
- require_relative 'test_en'
7
- require_relative 'test_osgb36'
8
- require_relative 'test_gridref'
9
- require_relative 'test_bad_data'
1
+ require 'test-unit'
2
+ require 'silva'
3
+ require_relative 'silva/test_data'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: silva
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,10 +9,10 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-31 00:00:00.000000000 Z
12
+ date: 2013-08-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: test/unit
15
+ name: test-unit
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
@@ -41,7 +41,6 @@ files:
41
41
  - README.md
42
42
  - Rakefile
43
43
  - lib/silva.rb
44
- - lib/silva/exception.rb
45
44
  - lib/silva/location.rb
46
45
  - lib/silva/system/base.rb
47
46
  - lib/silva/system/co_ordinate.rb
@@ -53,14 +52,14 @@ files:
53
52
  - lib/silva/transform.rb
54
53
  - lib/silva/version.rb
55
54
  - silva.gemspec
56
- - test/test_bad_data.rb
57
- - test/test_data.rb
58
- - test/test_en.rb
59
- - test/test_gridref.rb
55
+ - test/silva/test_bad_data.rb
56
+ - test/silva/test_data.rb
57
+ - test/silva/test_en.rb
58
+ - test/silva/test_gridref.rb
59
+ - test/silva/test_location.rb
60
+ - test/silva/test_osgb36.rb
61
+ - test/silva/test_wgs84.rb
60
62
  - test/test_helper.rb
61
- - test/test_location.rb
62
- - test/test_osgb36.rb
63
- - test/test_wgs84.rb
64
63
  homepage: http://github.com/rdallasgray/silva
65
64
  licenses:
66
65
  - FreeBSD
@@ -88,12 +87,12 @@ specification_version: 3
88
87
  summary: Convert between the GPS (WGS84) location standard and UK Ordnance Survey
89
88
  standards.
90
89
  test_files:
91
- - test/test_bad_data.rb
92
- - test/test_data.rb
93
- - test/test_en.rb
94
- - test/test_gridref.rb
90
+ - test/silva/test_bad_data.rb
91
+ - test/silva/test_data.rb
92
+ - test/silva/test_en.rb
93
+ - test/silva/test_gridref.rb
94
+ - test/silva/test_location.rb
95
+ - test/silva/test_osgb36.rb
96
+ - test/silva/test_wgs84.rb
95
97
  - test/test_helper.rb
96
- - test/test_location.rb
97
- - test/test_osgb36.rb
98
- - test/test_wgs84.rb
99
98
  has_rdoc:
@@ -1,17 +0,0 @@
1
- module Silva
2
- ##
3
- # Indicates that an invalid system name has been passed.
4
- class InvalidSystemError < StandardError; end
5
- ##
6
- # Indicates that an invalid transform has been attempted.
7
- class InvalidTransformError < StandardError; end
8
- ##
9
- # Indicates that an invalid parameter has been passed.
10
- class InvalidParamError < StandardError; end
11
- ##
12
- # Indicates that an invalid parameter value has been passed.
13
- class InvalidParamValueError < StandardError; end
14
- ##
15
- # Indicates that an insufficient parameters have been passed.
16
- class InsufficientParamsError < StandardError; end
17
- end