silva 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -133,26 +133,24 @@ module Silva
133
133
  # Portions of code from:
134
134
  # http://www.harrywood.co.uk/blog/2010/06/29/ruby-code-for-converting-to-uk-ordnance-survey-coordinate-systems-from-wgs84/
135
135
 
136
- def self.helmert_transform(system, target_system, ellipsoid_1, transform, ellipsoid_2)
137
- phi = to_rad(system.lat)
138
- lambda = to_rad(system.long)
139
- alt = system.alt
136
+ def self.helmert_transform(source_system, target_system, ellipsoid_1, transform, ellipsoid_2)
137
+ phi = to_rad(source_system.lat)
138
+ lambda = to_rad(source_system.long)
139
+ h = source_system.alt
140
140
 
141
141
  a1 = ellipsoid_1[:a]
142
142
  b1 = ellipsoid_1[:b]
143
143
 
144
- sin_phi = Math.sin(phi)
145
- cos_phi = Math.cos(phi)
146
- sin_lambda = Math.sin(lambda)
147
- cos_lambda = Math.cos(lambda)
148
-
144
+ # convert co-ordinates to 3D Cartesian. See:
145
+ # http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/A_Guide_to_Coordinate_Systems_in_Great_Britain.pdf
149
146
  e_sq1 = eccentricity_squared(ellipsoid_1)
150
- nu = a1 / Math.sqrt(1 - e_sq1 * sin_phi**2)
147
+ nu = a1 / Math.sqrt(1 - e_sq1 * Math.sin(phi)**2)
151
148
 
152
- x1 = (nu + alt) * cos_phi * cos_lambda
153
- y1 = (nu + alt) * cos_phi * sin_lambda
154
- z1 = ((1 - e_sq1) * nu + alt) * sin_phi
149
+ x1 = (nu + h) * Math.cos(phi) * Math.cos(lambda)
150
+ y1 = (nu + h) * Math.cos(phi) * Math.sin(lambda)
151
+ z1 = ((1 - e_sq1) * nu + h) * Math.sin(phi)
155
152
 
153
+ # apply Helmert transformation
156
154
  tx = transform[:tx]
157
155
  ty = transform[:ty]
158
156
  tz = transform[:tz]
@@ -165,18 +163,19 @@ module Silva
165
163
  y2 = ty + x1 * rz + y1 * s1 - z1 * rx
166
164
  z2 = tz - x1 * ry + y1 * rx + z1 * s1
167
165
 
166
+ # convert 3D Cartesian co-ordinates back to lat, long, alt
168
167
  a2 = ellipsoid_2[:a]
169
168
  b2 = ellipsoid_2[:b]
170
169
  precision = 4 / a2
171
170
 
172
171
  e_sq2 = eccentricity_squared(ellipsoid_2)
173
- p = Math.sqrt(x2 * x2 + y2 * y2)
172
+ p = Math.sqrt(x2**2 + y2**2)
174
173
  phi = Math.atan2(z2, p * (1 - e_sq2))
175
- phi_p = 2 * Math::PI
174
+ phi_prime = 2 * Math::PI
176
175
 
177
- while ((phi - phi_p).abs > precision) do
176
+ while ((phi - phi_prime).abs > precision) do
178
177
  nu = a2 / Math.sqrt(1 - e_sq2 * Math.sin(phi)**2)
179
- phi_p = phi
178
+ phi_prime = phi
180
179
  phi = Math.atan2(z2 + e_sq2 * nu * Math.sin(phi), p)
181
180
  end
182
181
 
@@ -195,7 +194,7 @@ module Silva
195
194
  # Calculate M (meridional arc) given latitude and relevant ellipsoid
196
195
  def self.meridional_arc(phi, ellipsoid = AIRY1830)
197
196
  a, b = ellipsoid[:a], ellipsoid[:b]
198
- n = self.n(ellipsoid)
197
+ n = n(ellipsoid)
199
198
 
200
199
  ma = (1 + n + (5.0 / 4.0) * n**2 + (5.0 / 4.0) * n**3) * (phi - PHI0)
201
200
  mb = (3 * n + 3 * n**2 + (21.0 / 8.0) * n**3) * Math.sin(phi - PHI0) * Math.cos(phi + PHI0)
@@ -208,7 +207,7 @@ module Silva
208
207
  # Calculate nu, rho, eta2 (transverse and meridional radii) given latitude and relevant ellipsoid.
209
208
  def self.transverse_and_meridional_radii(phi, ellipsoid = AIRY1830)
210
209
  a, b = ellipsoid[:a], ellipsoid[:b]
211
- e2 = self.eccentricity_squared(ellipsoid)
210
+ e2 = eccentricity_squared(ellipsoid)
212
211
 
213
212
  nu = a * F0 / Math.sqrt(1 - e2 * Math.sin(phi)**2)
214
213
  rho = a * F0 * (1 - e2) / ((1 - e2 * Math.sin(phi)**2)**1.5)
data/lib/silva/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Silva
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
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.0.7
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-15 00:00:00.000000000 Z
12
+ date: 2012-06-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: test/unit