mars_geo 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mars_geo.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 jonny
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,51 @@
1
+ # MarsGeo
2
+
3
+ 这是一个将真实经纬度转换成火星地址的Gem. 我们在做手机App开发时经常会用到地图,通常手机获得的经纬度放到
4
+ Google地图的时候会有几百米的偏差,这是因为某些原因国内地图都做了偏移加密,这个俗称火星坐标系。MarsGeo是
5
+ 根据网上的一段Java代码翻译过来的,目的是把真实经纬度转换成火星坐标系好和Google地图匹配,至于准确性如何
6
+ 我没有全面测试过,不过我自己使用的情况还是可以滴。
7
+
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ gem 'mars_geo'
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install mars_geo
22
+
23
+ ## Usage
24
+
25
+ 在要使用的文件中 include MarsGeo Moudle
26
+
27
+ ```
28
+ class HomeController < ApplicationController
29
+ include MarsGeo
30
+
31
+ def index
32
+ point = Point.new(31.108949, 121.333383)
33
+ offset_point = point.offset
34
+ p offset_point.lat
35
+ p offset_point.lng
36
+ end
37
+
38
+ end
39
+
40
+ ```
41
+
42
+
43
+
44
+
45
+ ## Contributing
46
+
47
+ 1. Fork it
48
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
49
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
50
+ 4. Push to the branch (`git push origin my-new-feature`)
51
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,167 @@
1
+ #encoding: utf-8
2
+
3
+ module MarsGeo
4
+ class Converter
5
+ attr_accessor :casm_rr,:casm_t1,:casm_t2,:casm_x1,:casm_y1, :casm_x2,:casm_y2,:casm_f
6
+
7
+ def initialize
8
+ self.casm_rr = 0
9
+ end
10
+
11
+ def yj_sin2(x)
12
+ ff = 0
13
+
14
+ if x<0
15
+ x = -x
16
+ ff = 1
17
+ end
18
+
19
+ cc = (x / 6.28318530717959).to_i
20
+ tt = x - cc * 6.28318530717959
21
+
22
+ if tt > 3.1415926535897932
23
+ tt = tt - 3.1415926535897932
24
+ if ff == 1
25
+ ff = 0
26
+ elsif ff == 0
27
+ ff = 1
28
+ end
29
+ end
30
+ x = tt
31
+ ss = x
32
+ s2 = x
33
+ tt = tt * tt
34
+ s2 = s2 * tt
35
+ ss = ss - s2 * 0.166666666666667
36
+ s2 = s2 * tt
37
+ ss = ss + s2 * 8.33333333333333E-03
38
+ s2 = s2 * tt
39
+ ss = ss - s2 * 1.98412698412698E-04
40
+ s2 = s2 * tt
41
+ ss = ss + s2 * 2.75573192239859E-06
42
+ s2 = s2 * tt
43
+ ss = ss - s2 * 2.50521083854417E-08
44
+ ss = -ss if (ff == 1)
45
+
46
+ return ss;
47
+ end
48
+
49
+
50
+ def transform_yj5(x, y)
51
+ tt = 300 + 1 * x + 2 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.sqrt(x * x))
52
+ tt = tt + (20 * yj_sin2(18.849555921538764 * x) + 20 * yj_sin2(6.283185307179588 * x)) * 0.6667
53
+ tt = tt + (20 * yj_sin2(3.141592653589794 * x) + 40 * yj_sin2(1.047197551196598 * x)) * 0.6667
54
+ tt = tt + (150 * yj_sin2(0.2617993877991495 * x) + 300 * yj_sin2(0.1047197551196598 * x)) * 0.6667
55
+ tt
56
+ end
57
+
58
+ def transform_yjy5(x,y)
59
+ tt = -100 + 2 * x + 3 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.sqrt(x * x))
60
+ tt = tt + (20 * yj_sin2(18.849555921538764 * x) + 20 * yj_sin2(6.283185307179588 * x)) * 0.6667
61
+ tt = tt + (20 * yj_sin2(3.141592653589794 * y) + 40 * yj_sin2(1.047197551196598 * y)) * 0.6667
62
+ tt = tt + (160 * yj_sin2(0.2617993877991495 * y) + 320 * yj_sin2(0.1047197551196598 * y)) * 0.6667
63
+ end
64
+
65
+ def transform_jy5(x, xx)
66
+ a = 6378245
67
+ e = 0.00669342
68
+ n = Math.sqrt(1 - e * yj_sin2(x * 0.0174532925199433) * yj_sin2(x * 0.0174532925199433))
69
+ n = (xx * 180) / (a / n * Math.cos(x * 0.0174532925199433) * 3.1415926)
70
+ end
71
+
72
+ def transform_jyj5(x,yy)
73
+ a = 6378245
74
+ e = 0.00669342
75
+ mm = 1 - e * yj_sin2(x * 0.0174532925199433) * yj_sin2(x * 0.0174532925199433)
76
+ m = (a * (1 - e)) / (mm * Math.sqrt(mm))
77
+ return (yy * 180) / (m * 3.1415926)
78
+ end
79
+
80
+ def random_yj
81
+ casm_a = 314159269
82
+ casm_c = 453806245
83
+ self.casm_rr = casm_a * self.casm_rr + casm_c
84
+ t = (self.casm_rr / 2).to_i
85
+ self.casm_rr = self.casm_rr - t * 2
86
+ self.casm_rr = self.casm_rr.to_f / 2
87
+ end
88
+
89
+ def ini_casm(w_time, w_lng, w_lat)
90
+ self.casm_t1 = w_time
91
+ self.casm_t2 = w_time
92
+ tt = (w_time / 0.357).to_i
93
+ self.casm_rr = w_time - tt * 0.357
94
+ self.casm_rr = 0.3 if (w_time == 0)
95
+ self.casm_x1 = w_lng
96
+ self.casm_y1 = w_lat
97
+ self.casm_x2 = w_lng
98
+ self.casm_y2 = w_lat
99
+ self.casm_f = 3
100
+ end
101
+
102
+
103
+
104
+ def wgtochina_lb(wg_flag,wg_lat,wg_lng,wg_heit,wg_week,wg_time)
105
+
106
+ point = {lat:0.0,lng:0.0}
107
+
108
+ return nil if (wg_heit > 5000)
109
+ x_l = wg_lng;
110
+ x_l = x_l / 3686400.0;
111
+ y_l = wg_lat;
112
+ y_l = y_l / 3686400.0;
113
+
114
+ return nil if (x_l < 72.004)
115
+ return nil if (x_l > 137.8347)
116
+ return nil if (y_l < 0.8293)
117
+ return nil if (y_l > 55.8271)
118
+
119
+ if (wg_flag == 0)
120
+ ini_casm(wg_time, wg_lng, wg_lat)
121
+ point[:lat] = wg_lng
122
+ point[:lng] = wg_lat
123
+ return point;
124
+ end
125
+
126
+ casm_t2 = wg_time
127
+ casm_t1,casm_f = 0,0
128
+ t1_t2 = (casm_t2 - casm_t1) / 1000.0
129
+ if (t1_t2 <= 0)
130
+ casm_t1 = casm_t2
131
+ casm_f = casm_f + 1
132
+ casm_x1 = casm_x2
133
+ casm_f = casm_f + 1
134
+ casm_y1 = casm_y2
135
+ casm_f = casm_f + 1
136
+ else
137
+ if t1_t2 > 120
138
+ if casm_f == 3
139
+ casm_f = 0
140
+ casm_x2 = wg_lng
141
+ casm_y2 = wg_lat
142
+ x1_x2 = casm_x2 - casm_x1
143
+ y1_y2 = casm_y2 - casm_y1
144
+ casm_v = Math.sqrt(x1_x2 * x1_x2 + y1_y2 * y1_y2) / t1_t2
145
+ return point if (casm_v > 3185)
146
+ end
147
+ casm_t1 = casm_t2
148
+ casm_f = casm_f + 1
149
+ casm_x1 = casm_x2
150
+ casm_f = casm_f + 1
151
+ casm_y1 = casm_y2
152
+ casm_f = casm_f + 1
153
+ end
154
+ end
155
+ x_add = transform_yj5(x_l - 105, y_l - 35)
156
+ y_add = transform_yjy5(x_l - 105, y_l - 35)
157
+ h_add = wg_heit
158
+
159
+
160
+ x_add = x_add + h_add * 0.001 + yj_sin2(wg_time * 0.0174532925199433) + random_yj()
161
+ y_add = y_add + h_add * 0.001 + yj_sin2(wg_time * 0.0174532925199433) + random_yj()
162
+ point[:lng] = ((x_l + transform_jy5(y_l, x_add)) * 3686400).to_i
163
+ point[:lat] = ((y_l + transform_jyj5(y_l, y_add)) * 3686400).to_i
164
+ return point
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,22 @@
1
+ module MarsGeo
2
+ class Point
3
+ attr_accessor :lat,:lng
4
+
5
+
6
+ def initialize(lat,lng)
7
+ self.lat, self.lng = lat, lng
8
+ end
9
+
10
+
11
+
12
+ def offset
13
+ temp_lat = self.lat * 3686400
14
+ temp_lng = self.lng * 3686400
15
+ converter = Converter.new
16
+ hash_point = converter.wgtochina_lb(1,temp_lat.to_i,temp_lng.to_i,0,0,0)
17
+ temp_lat = hash_point[:lat] / 3686400.0
18
+ temp_lng = hash_point[:lng] / 3686400.0
19
+ Point.new(temp_lat,temp_lng)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ module MarsGeo
2
+ VERSION = "0.0.1"
3
+ end
data/lib/mars_geo.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "mars_geo/version"
2
+
3
+ module MarsGeo
4
+ autoload :Converter, 'mars_geo/converter'
5
+ autoload :Point, 'mars_geo/point'
6
+ end
data/mars_geo.gemspec ADDED
@@ -0,0 +1,19 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mars_geo/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "mars_geo"
8
+ gem.version = MarsGeo::VERSION
9
+ gem.authors = ["Jonny"]
10
+ gem.email = ["mars131@gmail.com"]
11
+ gem.description = %q{Mars geograpic lib}
12
+ gem.summary = %q{Implementation of china geograpic encrypt which offset the position for display correctly in chinese map service }
13
+ gem.homepage = "https://github.com/jonnyzheng/mars_geo"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+ end
@@ -0,0 +1,46 @@
1
+ require 'mars_geo'
2
+
3
+ include MarsGeo
4
+
5
+ describe MarsGeo::Converter do
6
+
7
+ it 'method yj_sin2 should correct' do
8
+ converter = Converter.new
9
+ value = converter.yj_sin2(31.5566)
10
+ value.should eq(0.14020995787539087)
11
+ end
12
+
13
+ it 'method transform_yj5 should correct' do
14
+ converter = Converter.new
15
+ value = converter.transform_yj5(31.5566,121.77887615)
16
+ value.should eq(1116.0853927686755)
17
+ end
18
+
19
+ it 'method transform_yjy5 should correct' do
20
+ converter = Converter.new
21
+ value = converter.transform_yjy5(31.5566,121.77887615)
22
+ value.should eq(3767.9839409629326)
23
+ end
24
+
25
+
26
+ it 'method transform_jy5 should correct' do
27
+ converter = Converter.new
28
+ value = converter.transform_jy5(31.5566,121.77887615)
29
+ value.should eq(0.0012826033424097633)
30
+ end
31
+
32
+ it 'method transform_jyj5 should correct' do
33
+ converter = Converter.new
34
+ value = converter.transform_jyj5(31.5566,121.77887615)
35
+ value.should eq(0.0010982842446974356)
36
+ end
37
+
38
+ it 'method wgtochina_lb should correct' do
39
+ point = Point.new(31.208949, 121.533383)
40
+ offset_point = point.offset
41
+ offset_point.lat.should eq(31.2068310546875)
42
+ offset_point.lng.should eq(121.53770209418403)
43
+ end
44
+
45
+
46
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mars_geo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jonny
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-08 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Mars geograpic lib
15
+ email:
16
+ - mars131@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - .gitignore
22
+ - Gemfile
23
+ - LICENSE.txt
24
+ - README.md
25
+ - Rakefile
26
+ - lib/mars_geo.rb
27
+ - lib/mars_geo/converter.rb
28
+ - lib/mars_geo/point.rb
29
+ - lib/mars_geo/version.rb
30
+ - mars_geo.gemspec
31
+ - spec/converter_spec.rb
32
+ homepage: https://github.com/jonnyzheng/mars_geo
33
+ licenses: []
34
+ post_install_message:
35
+ rdoc_options: []
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ requirements: []
51
+ rubyforge_project:
52
+ rubygems_version: 1.8.24
53
+ signing_key:
54
+ specification_version: 3
55
+ summary: Implementation of china geograpic encrypt which offset the position for display
56
+ correctly in chinese map service
57
+ test_files:
58
+ - spec/converter_spec.rb
59
+ has_rdoc: