spherical_mercator 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 16bd516923907417c8a6900535ae5492b8e2f028
4
+ data.tar.gz: 0d75745f7a75eec2b9b563af0461133d6d731831
5
+ SHA512:
6
+ metadata.gz: c1f7eebc8eea7dfadef4006a775e45dfa40aef3c4e763dcf0a70ddd7bef8f7cfcc38778c33239413fe2f4305a51cee228e36caeabb5b858a3ca41c3e2164b277
7
+ data.tar.gz: 525366eebcf95f726443b684462c9e702b493e8ac6a26b14cb46e61f2b633383f6b43d08c7a05f36fa9e5d694c78eb8ede60887a516fc9f4dd1279c59af4e815
@@ -0,0 +1,53 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
11
+ /tmp/
12
+
13
+ # Used by dotenv library to load environment variables.
14
+ # .env
15
+
16
+ .idea/
17
+ Gemfile.lock
18
+
19
+ ## Specific to RubyMotion:
20
+ .dat*
21
+ .repl_history
22
+ build/
23
+ *.bridgesupport
24
+ build-iPhoneOS/
25
+ build-iPhoneSimulator/
26
+
27
+ ## Specific to RubyMotion (use of CocoaPods):
28
+ #
29
+ # We recommend against adding the Pods directory to your .gitignore. However
30
+ # you should judge for yourself, the pros and cons are mentioned at:
31
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
32
+ #
33
+ # vendor/Pods/
34
+
35
+ ## Documentation cache and generated files:
36
+ /.yardoc/
37
+ /_yardoc/
38
+ /doc/
39
+ /rdoc/
40
+
41
+ ## Environment normalization:
42
+ /.bundle/
43
+ /vendor/bundle
44
+ /lib/bundler/man/
45
+
46
+ # for a library or gem, you might want to ignore these files since the code is
47
+ # intended to run in multiple environments; otherwise, check them in:
48
+ # Gemfile.lock
49
+ # .ruby-version
50
+ # .ruby-gemset
51
+
52
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
53
+ .rvmrc
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
@@ -0,0 +1,10 @@
1
+ AllCops:
2
+ Exclude:
3
+ - 'spec/**/*'
4
+ DisplayCopNames: true
5
+ Documentation:
6
+ Enabled: false
7
+ LineLength:
8
+ Max: 120
9
+ Metrics/ClassLength:
10
+ Max: 110
@@ -0,0 +1,17 @@
1
+ language: ruby
2
+ before_install: gem install bundler
3
+ bundler_args: --without yard guard benchmarks
4
+ script: "rake spec"
5
+ rvm:
6
+ - 2.0.0
7
+ - 2.2.4
8
+ - 2.3.3
9
+ - 2.4.0
10
+ - jruby-9.0.5.0
11
+ - jruby-9.1.5.0
12
+ - jruby-9.1.6.0
13
+ - ruby-head
14
+ env: JRUBY_OPTS="$JRUBY_OPTS --debug"
15
+ matrix:
16
+ allow_failures:
17
+ - rvm: ruby-head
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'coveralls', require: false
7
+ gem 'rspec', '~> 3.6'
8
+ gem 'simplecov'
9
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Nikita Bulai
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,110 @@
1
+ # Ruby port of Mapbox Spherical Mercator
2
+ [![Gem Version](https://badge.fury.io/rb/spherical_mercator.svg)](http://badge.fury.io/rb/spherical_mercator)
3
+ [![Build Status](https://travis-ci.org/nbulaj/spherical_mercator.svg?branch=master)](https://travis-ci.org/nbulaj/spherical_mercator)
4
+ [![Dependency Status](https://gemnasium.com/nbulaj/spherical_mercator.svg)](https://gemnasium.com/nbulaj/spherical_mercator)
5
+ [![Coverage Status](https://coveralls.io/repos/github/nbulaj/spherical_mercator/badge.svg)](https://coveralls.io/github/nbulaj/spherical_mercator)
6
+ [![License](http://img.shields.io/badge/license-MIT-brightgreen.svg)](#license)
7
+
8
+ Spherical Mercator gem is a port of [Mapbox sphericalmercator JS lib](https://github.com/mapbox/sphericalmercator) that provides projection math
9
+ for converting between mercator meters, screen pixels (of 256x256 or configurable-size tiles), and latitude/longitude.
10
+
11
+ ## Requirements
12
+
13
+ * Ruby >= 2.0
14
+
15
+ ## Installation
16
+
17
+ Simple:
18
+
19
+ `gem install spherical_mercator`
20
+
21
+ For Gemfile:
22
+
23
+ `gem 'spherical_mercator'`
24
+
25
+ ## API
26
+
27
+ _NOTE_: API description copied from the original repo.
28
+
29
+ Some datatypes are assumed to be arrays: `ll` is `[lon, lat]`, `xy` and `px` are
30
+ `[x, y]`.
31
+
32
+ ```ruby
33
+ # By default, precomputes up to z30
34
+ mercator = SphericalMercator.new(size: 256)
35
+ ```
36
+
37
+ ### `px(lon_lat, zoom)`
38
+
39
+ Convert lon, lat to screen pixel x, y from 0, 0 origin, at a certain zoom level.
40
+ The inverse of `ll`
41
+
42
+ ### `ll(px, zoom)`
43
+
44
+ Convert screen pixel value to lon, lat, at a certain zoom level. The inverse
45
+ of `px`
46
+
47
+ ### `bbox(x, y, zoom, tms_style, srs)`
48
+
49
+ Convert tile xyz value to bbox of the form `[w, s, e, n]`
50
+
51
+ * `x` {Number} x (longitude) number.
52
+ * `y` {Number} y (latitude) number.
53
+ * `zoom` {Number} zoom.
54
+ * `tms_style` {Boolean} whether to compute using tms-style. (optional, default `false`)
55
+ * `srs` {String} projection for resulting bbox ('WGS84'|'900913'). (optional, default 'WGS84')
56
+
57
+ Returns bbox array of values in form `[w, s, e, n]`.
58
+
59
+ ### `xyz(bbox, zoom, tms_style, srs)`
60
+
61
+ Convert bbox to xyz bounds
62
+
63
+ * `bbox` {Number} bbox in the form `[w, s, e, n]`.
64
+ * `zoom` {Number} zoom.
65
+ * `tms_style` {Boolean} whether to compute using tms-style. (optional, default `false`)
66
+ * `srs` {String} projection of input bbox ('WGS84'|'900913'). (optional, default 'WGS84')
67
+
68
+ Returns {Object} XYZ bounds containing minX, maxX, minY, maxY properties.
69
+
70
+ ### `convert(bbox, to)`
71
+
72
+ Convert bbox from 900913 to WGS84 or vice versa
73
+
74
+ * `bbox` {Number} bbox in the form `[w, s, e, n]`.
75
+ * `to` {String} projection of resulting bbox ('WGS84'|'900913'). (optional, default 'WGS84')
76
+
77
+ Returns bbox array of values in form `[w, s, e, n]`.
78
+
79
+ ### `forward(lon_lat)`
80
+
81
+ Convert lon, lat values to mercator x, y
82
+
83
+ ### `inverse(xy)`
84
+
85
+ Convert mercator x, y values to lon, lat
86
+
87
+ ## Contributing
88
+
89
+ You are very welcome to help improve spherical_mercator if you have suggestions for features that other people can use.
90
+
91
+ To contribute:
92
+
93
+ 1. Fork the project.
94
+ 2. Create your feature branch (`git checkout -b my-new-feature`).
95
+ 3. Implement your feature or bug fix.
96
+ 4. Add documentation for your feature or bug fix.
97
+ 5. Run <tt>rake doc:yard</tt>. If your changes are not 100% documented, go back to step 4.
98
+ 6. Add tests for your feature or bug fix.
99
+ 7. Run `rake` to make sure all tests pass.
100
+ 8. Commit your changes (`git commit -am 'Add new feature'`).
101
+ 9. Push to the branch (`git push origin my-new-feature`).
102
+ 10. Create new pull request.
103
+
104
+ Thanks.
105
+
106
+ ## License
107
+
108
+ Spherical Mercator gem is released under the [MIT License](http://www.opensource.org/licenses/MIT).
109
+
110
+ Copyright (c) 2017 Nikita Bulai (bulajnikita@gmail.com) and [original lib authors](https://github.com/mapbox/sphericalmercator/graphs/contributors).
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,180 @@
1
+ require 'spherical_mercator/version'
2
+
3
+ class SphericalMercator
4
+ attr_reader :options
5
+ # Closures including constants and other precalculated values.
6
+
7
+ EPSLN = 1.0e-10
8
+ D2R = Math::PI / 180
9
+ R2D = 180.0 / Math::PI
10
+ # 900913 properties.
11
+ A = 6_378_137.0
12
+ MAX_EXTENT = 20_037_508.342_789_244
13
+
14
+ attr_accessor :size, :cache
15
+
16
+ attr_accessor :ac, :bc, :cc, :zc
17
+
18
+ # SphericalMercator constructor: precaches calculations
19
+ # for fast tile lookups.
20
+ def initialize(opts = {})
21
+ @cache = {}
22
+ @options = opts || {}
23
+
24
+ self.size = (options[:size] || 256).to_f
25
+
26
+ if cache[size].nil?
27
+ size = self.size
28
+ c = cache[self.size] = {}
29
+ c['Bc'] = []
30
+ c['Cc'] = []
31
+ c['zc'] = []
32
+ c['Ac'] = []
33
+
34
+ 30.times do
35
+ c['Ac'].push(size.to_i)
36
+ c['Bc'].push(size / 360)
37
+ c['Cc'].push(size / (2 * Math::PI))
38
+ c['zc'].push((size / 2).to_i)
39
+
40
+ size *= 2
41
+ end
42
+ end
43
+
44
+ @ac = cache[self.size]['Ac']
45
+ @bc = cache[self.size]['Bc']
46
+ @cc = cache[self.size]['Cc']
47
+ @zc = cache[self.size]['zc']
48
+ end
49
+
50
+ # Convert lon lat to screen pixel value
51
+ #
52
+ # - `ll` {Array} `[lon, lat]` array of geographic coordinates.
53
+ # - `zoom` {Number} zoom level.
54
+ def px(lon_lat, zoom)
55
+ d = @zc[zoom]
56
+ # JS: Math.min(Math.max(Math.sin(D2R * ll[1]), -0.9999), 0.9999);
57
+ f = [[Math.sin(D2R * lon_lat[1]), -0.9999].max, 0.9999].min
58
+ x = (d + lon_lat[0] * @bc[zoom]).round
59
+ y = (d + 0.5 * Math.log((1 + f) / (1 - f)) * (-@cc[zoom])).round
60
+ (x > @ac[zoom]) && (x = @ac[zoom])
61
+ (y > @ac[zoom]) && (y = @ac[zoom])
62
+
63
+ # (x < 0) && (x = 0);
64
+ # (y < 0) && (y = 0);
65
+ [x, y]
66
+ end
67
+
68
+ # Convert screen pixel value to lon lat
69
+ #
70
+ # - `px` {Array} `[x, y]` array of geographic coordinates.
71
+ # - `zoom` {Number} zoom level.
72
+ def ll(px, zoom)
73
+ g = (px[1] - @zc[zoom]) / (-@cc[zoom])
74
+ lon = (px[0] - @zc[zoom]) / @bc[zoom]
75
+ lat = R2D * (2 * Math.atan(Math.exp(g)) - 0.5 * Math::PI)
76
+ [lon, lat]
77
+ end
78
+
79
+ # Convert tile xyz value to bbox of the form `[w, s, e, n]`
80
+ #
81
+ # - `x` {Number} x (longitude) number.
82
+ # - `y` {Number} y (latitude) number.
83
+ # - `zoom` {Number} zoom.
84
+ # - `tms_style` {Boolean} whether to compute using tms-style.
85
+ # - `srs` {String} projection for resulting bbox (WGS84|900913).
86
+ # - `return` {Array} bbox array of values in form `[w, s, e, n]`.
87
+ def bbox(x, y, zoom, tms_style = false, srs = 'WGS84')
88
+ # Convert xyz into bbox with srs WGS84
89
+ y = ((2**zoom) - 1) - y if tms_style
90
+
91
+ lower_left = [x * @size, (y + 1) * @size] # lower left
92
+ upper_right = [(x + 1) * @size, y * @size] # upper right
93
+
94
+ bbox = ll(lower_left, zoom).concat(ll(upper_right, zoom))
95
+
96
+ # If web mercator requested reproject to 900913.
97
+ if srs == '900913'
98
+ convert(bbox, '900913')
99
+ else
100
+ bbox
101
+ end
102
+ end
103
+
104
+ # Convert bbox to xyx bounds
105
+ #
106
+ # - `bbox` {Number} bbox in the form `[w, s, e, n]`.
107
+ # - `zoom` {Number} zoom.
108
+ # - `tms_style` {Boolean} whether to compute using tms-style.
109
+ # - `srs` {String} projection of input bbox (WGS84|900913).
110
+ # - `@return` {Object} XYZ bounds containing minX, maxX, minY, maxY properties
111
+ def xyz(bbox, zoom, tms_style = false, srs = 'WGS84')
112
+ # If web mercator provided reproject to WGS84.
113
+ bbox = convert(bbox, 'WGS84') if srs == '900913'
114
+
115
+ lower_left = [bbox[0], bbox[1]] # lower left
116
+ upper_right = [bbox[2], bbox[3]] # upper right
117
+ px_ll = px(lower_left, zoom)
118
+ px_ur = px(upper_right, zoom)
119
+
120
+ # Y = 0 for XYZ is the top hence minY uses px_ur[1].
121
+ x = [(px_ll[0] / @size).floor, ((px_ur[0] - 1) / @size).floor]
122
+ y = [(px_ur[1] / @size).floor, ((px_ll[1] - 1) / @size).floor]
123
+
124
+ bounds = {
125
+ minX: x.min < 0 ? 0 : x.min, # JS: Math.min.apply(Math, x)
126
+ minY: y.min < 0 ? 0 : y.min,
127
+ maxX: x.max,
128
+ maxY: y.max
129
+ }
130
+
131
+ if tms_style
132
+ tms = {
133
+ minY: ((2**zoom) - 1) - bounds[:maxY],
134
+ maxY: ((2**zoom) - 1) - bounds[:minY]
135
+ }
136
+
137
+ bounds[:minY] = tms[:minY]
138
+ bounds[:maxY] = tms[:maxY]
139
+ end
140
+
141
+ bounds
142
+ end
143
+
144
+ # Convert projection of given bbox.
145
+ #
146
+ # - `bbox` {Number} bbox in the form `[w, s, e, n]`.
147
+ # - `to` {String} projection of output bbox (WGS84|900913). Input bbox
148
+ # assumed to be the "other" projection.
149
+ # - `@return` {Object} bbox with reprojected coordinates.
150
+ def convert(bbox, to = 'WGS84')
151
+ if to == '900913'
152
+ forward(bbox.slice(0, 2)).concat(forward(bbox.slice(2, 4)))
153
+ else
154
+ inverse(bbox.slice(0, 2)).concat(inverse(bbox.slice(2, 4)))
155
+ end
156
+ end
157
+
158
+ # Convert lon/lat values to 900913 x/y.
159
+ def forward(lon_lat)
160
+ xy = [
161
+ A * lon_lat[0] * D2R,
162
+ A * Math.log(Math.tan((Math::PI * 0.25) + (0.5 * lon_lat[1] * D2R)))
163
+ ]
164
+
165
+ # if xy value is beyond maxextent (e.g. poles), return maxextent.
166
+ (xy[0] > MAX_EXTENT) && (xy[0] = MAX_EXTENT)
167
+ (xy[0] < -MAX_EXTENT) && (xy[0] = -MAX_EXTENT)
168
+ (xy[1] > MAX_EXTENT) && (xy[1] = MAX_EXTENT)
169
+ (xy[1] < -MAX_EXTENT) && (xy[1] = -MAX_EXTENT)
170
+ xy
171
+ end
172
+
173
+ # Convert 900913 x/y values to lon/lat.
174
+ def inverse(xy)
175
+ [
176
+ (xy[0] * R2D / A),
177
+ ((Math::PI * 0.5) - 2.0 * Math.atan(Math.exp(-xy[1] / A))) * R2D
178
+ ]
179
+ end
180
+ end
@@ -0,0 +1,19 @@
1
+ class SphericalMercator
2
+ def self.gem_version
3
+ Gem::Version.new VERSION::STRING
4
+ end
5
+
6
+ ##
7
+ # AlphaCard semantic versioning
8
+ module VERSION
9
+ # Major version number
10
+ MAJOR = 0
11
+ # Minor version number
12
+ MINOR = 1
13
+ # Smallest version number
14
+ TINY = 0
15
+
16
+ # Full version number
17
+ STRING = [MAJOR, MINOR, TINY].compact.join('.')
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ if ENV['CI'] || ENV['TRAVIS'] || ENV['COVERALLS'] || ENV['JENKINS_URL']
2
+ require 'coveralls'
3
+ Coveralls.wear!
4
+ else
5
+ require 'simplecov'
6
+ SimpleCov.start
7
+ end
8
+
9
+ require 'bundler/setup'
10
+ Bundler.setup
11
+
12
+ require 'spherical_mercator'
13
+
14
+ RSpec.configure do |config|
15
+ config.order = 'random'
16
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ MAX_EXTENT_MERC = [
4
+ -20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244
5
+ ].freeze
6
+
7
+ MAX_EXTENT_WGS84 = [
8
+ -180, -85.0511287798066, 180, 85.0511287798066
9
+ ].freeze
10
+
11
+ def rand_float
12
+ rand(0.0...1.0)
13
+ end
14
+
15
+ describe SphericalMercator do
16
+ let!(:sm) {SphericalMercator.new}
17
+
18
+ context '#bbox' do
19
+ it '[0,0,0] converted to proper bbox' do
20
+ expect(sm.bbox(0, 0, 1, true, 'WGS84')).to eq([-180, -85.05112877980659, 0, 0])
21
+ end
22
+
23
+ it '[0,0,1] converted to proper bbox' do
24
+ expect(sm.bbox(0, 0, 0, true, 'WGS84')).to eq([-180, -85.05112877980659, 180, 85.0511287798066])
25
+ end
26
+ end
27
+
28
+ context '#xyz' do
29
+ it 'World extents converted to proper tile ranges' do
30
+ expect(sm.xyz([-180, -85.05112877980659, 0, 0], 1, true, 'WGS84')).to eq({minX: 0, minY: 0, maxX: 0, maxY: 0})
31
+ end
32
+
33
+ it 'SW converted to proper tile ranges' do
34
+ expect(sm.xyz([-180, -85.05112877980659, 180, 85.0511287798066], 0, true, 'WGS84')).to eq({minX: 0, minY: 0, maxX: 0, maxY: 0})
35
+ end
36
+
37
+ it 'broken' do
38
+ extent = [-0.087891, 40.95703, 0.087891, 41.044916]
39
+ xyz = sm.xyz(extent, 3, true, 'WGS84')
40
+
41
+ expect(xyz[:minX] <= xyz[:maxX]).to be_truthy
42
+ expect(xyz[:minY] <= xyz[:maxY]).to be_truthy
43
+ end
44
+
45
+ it 'negative' do
46
+ extent = [-112.5, 85.0511, -112.5, 85.0511]
47
+ xyz = sm.xyz(extent, 0)
48
+
49
+ expect(xyz[:minY]).to be_zero
50
+ end
51
+
52
+ it 'fuzz' do
53
+ 1000.times do
54
+ x = [-180 + (360 * rand_float), -180 + (360 * rand_float)]
55
+ y = [-85 + (170 * rand_float), -85 + (170 * rand_float)]
56
+ z = (22 * rand_float).floor
57
+
58
+ extent = [
59
+ x.min,
60
+ y.min,
61
+ x.max,
62
+ y.max
63
+ ]
64
+
65
+ xyz = sm.xyz(extent, z, true, 'WGS84')
66
+
67
+ if xyz[:minX] > xyz[:maxX]
68
+ expect(xyz[:minX] <= xyz[:maxX]).to be_truthy
69
+ end
70
+
71
+ if xyz[:minY] > xyz[:maxY]
72
+ expect(xyz[:minY] <= xyz[:maxY]).to be_truthy
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ context '#convert' do
79
+ it 'MAX_EXTENT_WGS84' do
80
+ expect(sm.convert(MAX_EXTENT_WGS84, '900913')).to eq(MAX_EXTENT_MERC)
81
+ end
82
+
83
+ it 'MAX_EXTENT_MERC' do
84
+ expect(sm.convert(MAX_EXTENT_MERC, 'WGS84')).to eq(MAX_EXTENT_WGS84)
85
+ end
86
+ end
87
+
88
+ context '#extents' do
89
+ it 'Maximum extents enforced on conversion to tile ranges' do
90
+ expect(sm.xyz([-240, -90, 240, 90], 4, true, 'WGS84')).to eq({minX: 0, minY: 0, maxX: 15, maxY: 15})
91
+ end
92
+
93
+ it '' do
94
+ expect(sm.convert([-240, -90, 240, 90], '900913')).to eq(MAX_EXTENT_MERC)
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,21 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), 'lib'))
2
+
3
+ require 'spherical_mercator/version'
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.name = 'spherical_mercator'
7
+ gem.version = SphericalMercator.gem_version
8
+ gem.date = '2017-10-03'
9
+ gem.summary = 'Spherical Mercator math in Ruby'
10
+ gem.description = 'Spherical Mercator provides projection math for converting between mercator' \
11
+ 'meters, screen pixels (of 256x256 or configurable-size tiles), and latitude/longitude'
12
+ gem.authors = ['Nikita Bulai']
13
+ gem.email = 'bulajnikita@gmail.com'
14
+ gem.require_paths = ['lib']
15
+ gem.files = `git ls-files`.split($RS)
16
+ gem.homepage = 'http://github.com/nbulaj/spherical_mercator'
17
+ gem.license = 'MIT'
18
+ gem.required_ruby_version = '>= 2.0'
19
+
20
+ gem.add_development_dependency 'rspec', '~> 3.5'
21
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spherical_mercator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Nikita Bulai
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-10-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.5'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.5'
27
+ description: Spherical Mercator provides projection math for converting between mercatormeters,
28
+ screen pixels (of 256x256 or configurable-size tiles), and latitude/longitude
29
+ email: bulajnikita@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".gitignore"
35
+ - ".rspec"
36
+ - ".rubocop.yml"
37
+ - ".travis.yml"
38
+ - Gemfile
39
+ - LICENSE
40
+ - README.md
41
+ - Rakefile
42
+ - lib/spherical_mercator.rb
43
+ - lib/spherical_mercator/version.rb
44
+ - spec/spec_helper.rb
45
+ - spec/spherical_mercator/spherical_mercator_spec.rb
46
+ - spherical_mercator.gemspec
47
+ homepage: http://github.com/nbulaj/spherical_mercator
48
+ licenses:
49
+ - MIT
50
+ metadata: {}
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '2.0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 2.6.11
68
+ signing_key:
69
+ specification_version: 4
70
+ summary: Spherical Mercator math in Ruby
71
+ test_files: []