mars_geo 0.0.1

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.
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: