coordinate-converter 0.1.0

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.
@@ -0,0 +1,42 @@
1
+ Converting UTM to Latitude and Longitude
2
+ ========================================
3
+
4
+ Parameters are specified in the following order:
5
+
6
+ * reference_ellipsoid
7
+ * northing
8
+ * easting
9
+ * zone
10
+
11
+ Example
12
+ -------
13
+
14
+ Coordinates.utm_to_lat_long("WGS-84", 6688940, 219165, "33N")
15
+ # => {:lat => 60.2399303597183, :long => 9.92496237547609}
16
+
17
+ Supported ellipsoids
18
+ --------------------
19
+
20
+ * Airy
21
+ * Australian National
22
+ * Bessel 1841
23
+ * Bessel 1841 (Nambia)
24
+ * Clarke 1866
25
+ * Clarke 1880
26
+ * Everest
27
+ * Fischer 1960 (Mercury)
28
+ * Fischer 1968
29
+ * GRS 1967
30
+ * GRS 1980
31
+ * Helmert 1906
32
+ * Hough
33
+ * International
34
+ * Krassovsky
35
+ * Modified Airy
36
+ * Modified Everest
37
+ * Modified Fischer 1960
38
+ * South American 1969
39
+ * WGS 60
40
+ * WGS 66
41
+ * WGS-72
42
+ * WGS-84
@@ -0,0 +1,14 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |gemspec|
4
+ gemspec.name = "coordinate-converter"
5
+ gemspec.summary = "Converting UTM to Latitude and Longitude"
6
+ gemspec.description = "Converting UTM to Latitude and Longitude"
7
+ gemspec.email = "mail@kimjoar.net"
8
+ gemspec.homepage = "http://github.com/kjbekkelund/coordinate-converter"
9
+ gemspec.authors = "Kim Joar Bekkelund"
10
+ end
11
+ Jeweler::GemcutterTasks.new
12
+ rescue LoadError
13
+ puts "Jeweler not available. Install it with: gem install jeweler"
14
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,88 @@
1
+ module Coordinates
2
+ def self.utm_to_lat_long(reference_ellipsoid, northing, easting, zone)
3
+ a = equitorial_radius(reference_ellipsoid)
4
+ ecc_squared = eccentricity_squared(reference_ellipsoid)
5
+
6
+ e1 = (1 - Math.sqrt(1 - ecc_squared)) / (1 + Math.sqrt(1 - ecc_squared))
7
+
8
+ x = easting - 500000.0
9
+ y = northing
10
+
11
+ zone_letter = zone[-1].chr
12
+ zone_number = zone[0..-2].to_i
13
+ if zone_letter >= 'S'
14
+ y -= 10000000.0
15
+ end
16
+
17
+ long_origin = (zone_number - 1) * 6 - 180 + 3
18
+ ecc_prime_squared = (ecc_squared) / (1 - ecc_squared)
19
+
20
+ k0 = 0.9996
21
+ m = y / k0
22
+ mu = m / (a * (1 - ecc_squared / 4 - 3 * ecc_squared * ecc_squared / 64 - 5 \
23
+ * ecc_squared * ecc_squared * ecc_squared / 256))
24
+
25
+ phi1_rad = (mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) \
26
+ + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) \
27
+ * Math.sin(4 * mu) + (151 * e1 * e1 * e1 / 96) \
28
+ * Math.sin(6 * mu))
29
+
30
+ n1 = a / Math.sqrt(1 - ecc_squared * Math.sin(phi1_rad) * Math.sin(phi1_rad))
31
+ t1 = Math.tan(phi1_rad) * Math.tan(phi1_rad)
32
+ c1 = ecc_prime_squared * Math.cos(phi1_rad) * Math.cos(phi1_rad)
33
+ r1 = a * (1 - ecc_squared) / (1 - ecc_squared * Math.sin(phi1_rad) * Math.sin(phi1_rad))**1.5
34
+ d = x / (n1 * k0)
35
+
36
+ lat = phi1_rad - (n1 * Math.tan(phi1_rad) / r1) * (d * d / 2 - (5 + 3 * t1 \
37
+ + 10 * c1 - 4 * c1**2 - 9 * ecc_prime_squared) * d**4 / 24 + (61 + 90 \
38
+ * t1 + 298 * c1 + 45 * t1**2 - 252 * ecc_prime_squared - 3 * c1**2) \
39
+ * d**6 / 720)
40
+ lat = lat * RAD_TO_DEG
41
+
42
+ long = (d - (1 + 2 * t1 + c1) * d * d * d / 6 + (5 - 2 * c1 + 28 \
43
+ * t1 - 3 * c1 * c1 + 8 * ecc_prime_squared + 24 * t1 * t1) \
44
+ * d * d * d * d * d / 120) / Math.cos(phi1_rad)
45
+
46
+ long = long_origin + long * RAD_TO_DEG
47
+
48
+ { :lat => lat, :long => long }
49
+ end
50
+
51
+ private
52
+
53
+ def self.equitorial_radius(ellipsoid)
54
+ ELLIPSOID[ellipsoid].first
55
+ end
56
+
57
+ def self.eccentricity_squared(ellipsoid)
58
+ ELLIPSOID[ellipsoid].last
59
+ end
60
+
61
+ ELLIPSOID = {
62
+ "Airy" => [6377563, 0.00667054],
63
+ "Australian National" => [6378160, 0.006694542],
64
+ "Bessel 1841" => [6377397, 0.006674372],
65
+ "Bessel 1841 (Nambia)" => [6377484, 0.006674372],
66
+ "Clarke 1866" => [6378206, 0.006768658],
67
+ "Clarke 1880" => [6378249, 0.006803511],
68
+ "Everest" => [6377276, 0.006637847],
69
+ "Fischer 1960 (Mercury)" => [6378166, 0.006693422],
70
+ "Fischer 1968" => [6378150, 0.006693422],
71
+ "GRS 1967" => [6378160, 0.006694605],
72
+ "GRS 1980" => [6378137, 0.00669438],
73
+ "Helmert 1906" => [6378200, 0.006693422],
74
+ "Hough" => [6378270, 0.00672267],
75
+ "International" => [6378388, 0.00672267],
76
+ "Krassovsky" => [6378245, 0.006693422],
77
+ "Modified Airy" => [6377340, 0.00667054],
78
+ "Modified Everest" => [6377304, 0.006637847],
79
+ "Modified Fischer 1960" => [6378155, 0.006693422],
80
+ "South American 1969" => [6378160, 0.006694542],
81
+ "WGS 60" => [6378165, 0.006693422],
82
+ "WGS 66" => [6378145, 0.006694542],
83
+ "WGS-72" => [6378135, 0.006694318],
84
+ "WGS-84" => [6378137, 0.00669438]
85
+ }
86
+
87
+ RAD_TO_DEG = 180.0 / Math::PI
88
+ end
@@ -0,0 +1,19 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'lib', 'coordinates')
2
+
3
+ describe Coordinates do
4
+ describe "#utm_to_lat_long" do
5
+ it "should return a hash with keys lat and long" do
6
+ ll = Coordinates.utm_to_lat_long("WGS-84", 6688940, 219165, "33N")
7
+ ll.should be_an Hash
8
+ ll.has_key?(:lat).should be_true
9
+ ll.has_key?(:long).should be_true
10
+ end
11
+
12
+ it "should return a correct lat long for the reference ellipsoid WGS-84 in the zone 33N" do
13
+ coords = Coordinates.utm_to_lat_long("WGS-84", 6688940, 219165, "33N")
14
+
15
+ coords[:lat].should be_close(60.2399303597183, 0.00000005)
16
+ coords[:long].should be_close(9.92496237547609, 0.00000005)
17
+ end
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: coordinate-converter
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Kim Joar Bekkelund
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-08-10 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: Converting UTM to Latitude and Longitude
23
+ email: mail@kimjoar.net
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files:
29
+ - README.md
30
+ files:
31
+ - README.md
32
+ - Rakefile
33
+ - VERSION
34
+ - lib/coordinate-converter.rb
35
+ - spec/conversion_spec.rb
36
+ has_rdoc: true
37
+ homepage: http://github.com/kjbekkelund/coordinate-converter
38
+ licenses: []
39
+
40
+ post_install_message:
41
+ rdoc_options:
42
+ - --charset=UTF-8
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ hash: 3
51
+ segments:
52
+ - 0
53
+ version: "0"
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ requirements: []
64
+
65
+ rubyforge_project:
66
+ rubygems_version: 1.3.7
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: Converting UTM to Latitude and Longitude
70
+ test_files:
71
+ - spec/conversion_spec.rb