map-kit-wrapper 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 +18 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +45 -0
- data/Rakefile +14 -0
- data/lib/map_kit_wrapper.rb +1 -0
- data/lib/map_kit_wrapper/version.rb +3 -0
- data/map_kit_wrapper.gemspec +20 -0
- data/motion/core_location_data_types.rb +35 -0
- data/motion/map_kit_data_types.rb +162 -0
- data/motion/map_type.rb +25 -0
- data/motion/map_view.rb +69 -0
- data/motion/test_suite_delegate.rb +9 -0
- data/motion/zoom_level.rb +162 -0
- data/spec/core_location_data_types_spec.rb +32 -0
- data/spec/map_kit_data_types_spec.rb +182 -0
- data/spec/map_view_spec.rb +80 -0
- data/spec/zoom_level_spec.rb +71 -0
- metadata +113 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Kasper Weibel Nielsen-Refs
|
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,45 @@
|
|
1
|
+
MapKitWrapper
|
2
|
+
=============
|
3
|
+
|
4
|
+
This is a MapKit wrapper for RubyMotion. It's purpose is to make make dealing with MapKit less painfull
|
5
|
+
|
6
|
+
It is still work in progress, but right now there are wrappers for the Map Kit Data Types and the Core Location Data Types. Those will save you a lot of typing.
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
```ruby
|
10
|
+
gem install map-kit-wrapper
|
11
|
+
```
|
12
|
+
|
13
|
+
## Setup
|
14
|
+
|
15
|
+
Edit the `Rakefile` of your RubyMotion project and add the following require line.
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
require 'map-kit-wrapper'
|
19
|
+
```
|
20
|
+
|
21
|
+
## Example
|
22
|
+
```ruby
|
23
|
+
|
24
|
+
def loadView
|
25
|
+
self.view = UIView.alloc.initWithFrame(tabBarController.view.bounds)
|
26
|
+
map = MapView.new
|
27
|
+
map.frame = self.view.frame
|
28
|
+
map.delegate = self
|
29
|
+
region = CoordinateRegion.new([56, 10.6], [3.1, 3.1])
|
30
|
+
map.region = region
|
31
|
+
# Alternatively use set_region
|
32
|
+
# map.set_region(region, :animated => true)
|
33
|
+
map.showsUserLocation = true
|
34
|
+
self.view.addSubview(map)
|
35
|
+
end
|
36
|
+
```
|
37
|
+
Check if the users location has been found
|
38
|
+
```ruby
|
39
|
+
@map.user_located?
|
40
|
+
```
|
41
|
+
Get the users coordinates
|
42
|
+
```ruby
|
43
|
+
@map.user_coordinates
|
44
|
+
```
|
45
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
$:.unshift("/Library/RubyMotion/lib")
|
2
|
+
require 'motion/project'
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
Bundler.setup
|
5
|
+
Bundler.require
|
6
|
+
require 'bubble-wrap/test'
|
7
|
+
|
8
|
+
Motion::Project::App.setup do |app|
|
9
|
+
# Use `rake config' to see complete project settings.
|
10
|
+
app.name = 'MapKitWrapper'
|
11
|
+
app.files = Dir.glob(File.join(app.project_dir, 'motion/**/*.rb'))
|
12
|
+
app.files_dependencies 'motion/map_view.rb' => 'motion/zoom_level.rb'
|
13
|
+
app.frameworks += ['CoreLocation', 'MapKit']
|
14
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'map_kit_wrapper/version' unless defined?(MapKit::VERSION)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/map_kit_wrapper/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Kasper Weibel Nielsen-Refs"]
|
6
|
+
gem.email = ["weibel@gmail.com"]
|
7
|
+
gem.summary = %q{This is a MapKit wrapper for RubyMotion. It's
|
8
|
+
purpose is to make make dealing with MapKit less painfull}
|
9
|
+
gem.homepage = "https://github.com/weibel/MapKitWrapper"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "map-kit-wrapper"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = MapKit::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency 'bubble-wrap'
|
19
|
+
gem.add_development_dependency 'rake'
|
20
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module CoreLocation
|
2
|
+
# Wrappers for the Core Location Data Types
|
3
|
+
# http://developer.apple.com/library/mac/#documentation/CoreLocation/Reference/CoreLocationDataTypesRef/Reference/reference.html
|
4
|
+
module DataTypes
|
5
|
+
|
6
|
+
# Ruby wrapper for CLLocationCoordinate2D
|
7
|
+
class LocationCoordinate
|
8
|
+
attr_reader :sdk
|
9
|
+
|
10
|
+
# LocationCoordinate.new(1,2)
|
11
|
+
# LocationCoordinate.new([1,2])
|
12
|
+
# CoordinateSpan.new(CLLocationCoordinate2D)
|
13
|
+
def initialize(*args)
|
14
|
+
args.flatten!
|
15
|
+
if args.first.is_a?(CLLocationCoordinate2D)
|
16
|
+
@sdk = args.first
|
17
|
+
else
|
18
|
+
@sdk = CLLocationCoordinate2DMake(args[0], args[1])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def latitude
|
23
|
+
@sdk.latitude
|
24
|
+
end
|
25
|
+
|
26
|
+
def longitude
|
27
|
+
@sdk.longitude
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_array
|
31
|
+
[latitude, longitude]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
module MapKit
|
2
|
+
# Wrappers for the Map Kit Data Types
|
3
|
+
# http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MapKitDataTypesReference/Reference/reference.html
|
4
|
+
module DataTypes
|
5
|
+
|
6
|
+
# Wrapper for MKCoordinateSpan
|
7
|
+
class CoordinateSpan
|
8
|
+
attr_reader :sdk
|
9
|
+
|
10
|
+
# CoordinateSpan.new(1,2)
|
11
|
+
# CoordinateSpan.new([1,2])
|
12
|
+
# CoordinateSpan.new(MKCoordinateSpan)
|
13
|
+
def initialize(*args)
|
14
|
+
args.flatten!
|
15
|
+
if args.first.is_a?(MKCoordinateSpan)
|
16
|
+
@sdk = args.first
|
17
|
+
else
|
18
|
+
@sdk = MKCoordinateSpanMake(args[0], args[1])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def latitude_delta
|
23
|
+
@sdk.latitudeDelta
|
24
|
+
end
|
25
|
+
|
26
|
+
def longitude_delta
|
27
|
+
@sdk.longitudeDelta
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_array
|
31
|
+
[latitude_delta, longitude_delta]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Wrapper for MKCoordinateRegion
|
36
|
+
class CoordinateRegion
|
37
|
+
include CoreLocation::DataTypes
|
38
|
+
attr_reader :sdk
|
39
|
+
|
40
|
+
# CoordinateRegion.new(CoordinateRegion)
|
41
|
+
# CoordinateRegion.new(MKCoordinateRegion)
|
42
|
+
# CoordinateRegion.new([56, 10.6], [3.1, 3.1])
|
43
|
+
# CoordinateRegion.new(LocationCoordinate, CoordinateSpan)
|
44
|
+
# CoordinateRegion.new(CLLocationCoordinate2D, MKCoordinateSpan)
|
45
|
+
def initialize(*args)
|
46
|
+
if args.size == 1
|
47
|
+
if args[0].is_a?(CoordinateRegion)
|
48
|
+
center, span = args[0].center.sdk, args[0].span.sdk
|
49
|
+
else
|
50
|
+
center, span = args[0].center, args[0].span
|
51
|
+
end
|
52
|
+
else
|
53
|
+
center = args[0].is_a?(LocationCoordinate) ? args[0].sdk : args[0]
|
54
|
+
span = args[1].is_a?(CoordinateSpan) ? args[1].sdk : args[1]
|
55
|
+
end
|
56
|
+
@sdk = MKCoordinateRegionMake(center, span)
|
57
|
+
end
|
58
|
+
|
59
|
+
def center
|
60
|
+
LocationCoordinate.new(@sdk.center)
|
61
|
+
end
|
62
|
+
|
63
|
+
def span
|
64
|
+
CoordinateSpan.new(@sdk.span)
|
65
|
+
end
|
66
|
+
|
67
|
+
def to_hash
|
68
|
+
{:center => center.to_array, :span => span.to_array}
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# Wrapper for MKMapPoint
|
73
|
+
class MapPoint
|
74
|
+
attr_reader :sdk
|
75
|
+
|
76
|
+
# MapPoint.new(50,45)
|
77
|
+
# MapPoint.new([50,45])
|
78
|
+
# MapPoint.new(MKMapPoint)
|
79
|
+
def initialize(*args)
|
80
|
+
args.flatten!
|
81
|
+
if args.first.is_a?(MKMapPoint)
|
82
|
+
@sdk = args.first
|
83
|
+
else
|
84
|
+
@sdk = MKMapPointMake(args[0], args[1])
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def x
|
89
|
+
@sdk.x
|
90
|
+
end
|
91
|
+
|
92
|
+
def y
|
93
|
+
@sdk.y
|
94
|
+
end
|
95
|
+
|
96
|
+
def to_array
|
97
|
+
[x, y]
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Wrapper for MKMapSize
|
102
|
+
class MapSize
|
103
|
+
attr_reader :sdk
|
104
|
+
|
105
|
+
# MapSize.new(10,12)
|
106
|
+
# MapSize.new([10,12])
|
107
|
+
# MapSize.new(MKMapSize)
|
108
|
+
def initialize(*args)
|
109
|
+
args.flatten!
|
110
|
+
if args.first.is_a?(MKMapSize)
|
111
|
+
@sdk = args.first
|
112
|
+
else
|
113
|
+
@sdk = MKMapSizeMake(args[0], args[1])
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def width
|
118
|
+
@sdk.width
|
119
|
+
end
|
120
|
+
|
121
|
+
def height
|
122
|
+
@sdk.height
|
123
|
+
end
|
124
|
+
|
125
|
+
def to_array
|
126
|
+
[width, height]
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# Wrapper for MKMapRect
|
131
|
+
class MapRect
|
132
|
+
attr_reader :sdk
|
133
|
+
|
134
|
+
# MapRect.new(x, y, width, height)
|
135
|
+
# MapRect.new([x, y], [width, height])
|
136
|
+
# MapRect.new(MapPoint, MapSize)
|
137
|
+
# MapRect.new(MKMapPoint, MKMapSize)
|
138
|
+
def initialize(*args)
|
139
|
+
args.flatten!
|
140
|
+
if args.size == 2
|
141
|
+
origin = args[0].is_a?(MapPoint) ? args[0] : MapPoint.new(args[0])
|
142
|
+
size = args[1].is_a?(MapSize) ? args[1] : MapSize.new(args[1])
|
143
|
+
@sdk = MKMapRectMake(origin.sdk.x, origin.sdk.y, size.sdk.width, size.sdk.height)
|
144
|
+
elsif args.size == 4
|
145
|
+
@sdk = MKMapRectMake(args[0], args[1], args[2], args[3])
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def origin
|
150
|
+
MapPoint.new(@sdk.origin)
|
151
|
+
end
|
152
|
+
|
153
|
+
def size
|
154
|
+
MapSize.new(@sdk.size)
|
155
|
+
end
|
156
|
+
|
157
|
+
def to_hash
|
158
|
+
{:origin => origin.to_array, :size => size.to_array}
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
data/motion/map_type.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module MapKit
|
2
|
+
class MapType
|
3
|
+
def self.mkmap_to_rmap(map_type)
|
4
|
+
case map_type
|
5
|
+
when MKMapTypeStandard
|
6
|
+
:standard
|
7
|
+
when MKMapTypeSatellite
|
8
|
+
:satellite
|
9
|
+
when MKMapTypeHybrid
|
10
|
+
:hybrid
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.rmap_to_mkmap(map_type)
|
15
|
+
case map_type
|
16
|
+
when :standard
|
17
|
+
MKMapTypeStandard
|
18
|
+
when :satellite
|
19
|
+
MKMapTypeSatellite
|
20
|
+
when :hybrid
|
21
|
+
MKMapTypeHybrid
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/motion/map_view.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
module MapKit
|
2
|
+
include CoreLocation::DataTypes
|
3
|
+
include MapKit::DataTypes
|
4
|
+
|
5
|
+
# Wrapper for MKMapView
|
6
|
+
class MapView < MKMapView
|
7
|
+
include CoreLocation::DataTypes
|
8
|
+
include MapKit::DataTypes
|
9
|
+
include MapKit::ZoomLevel
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
self.alloc.init
|
13
|
+
end
|
14
|
+
|
15
|
+
# zoom methods
|
16
|
+
|
17
|
+
def zoom_enabled?
|
18
|
+
self.isZoomEnabled
|
19
|
+
end
|
20
|
+
|
21
|
+
def zoom_enabled=(enabled)
|
22
|
+
self.setZoomEnabled(enabled)
|
23
|
+
end
|
24
|
+
|
25
|
+
# scroll methods
|
26
|
+
|
27
|
+
def scroll_enabled?
|
28
|
+
self.isScrollEnabled
|
29
|
+
end
|
30
|
+
|
31
|
+
def scroll_enabled=(enabled)
|
32
|
+
self.setScrollEnabled(enabled)
|
33
|
+
end
|
34
|
+
|
35
|
+
# user location methods
|
36
|
+
|
37
|
+
def shows_user_location?
|
38
|
+
self.showsUserLocation
|
39
|
+
end
|
40
|
+
|
41
|
+
def shows_user_location=(enabled)
|
42
|
+
self.showsUserLocation = enabled
|
43
|
+
end
|
44
|
+
|
45
|
+
def user_located?
|
46
|
+
self.shows_user_location? && self.userLocation.location ? true : false
|
47
|
+
end
|
48
|
+
|
49
|
+
def user_coordinates
|
50
|
+
self.user_located? ? LocationCoordinate.new(self.userLocation.location.coordinate) : nil
|
51
|
+
end
|
52
|
+
|
53
|
+
# region methods
|
54
|
+
|
55
|
+
def get_region
|
56
|
+
CoordinateRegion.new(self.region.center, self.region.span)
|
57
|
+
end
|
58
|
+
|
59
|
+
def region=(*args)
|
60
|
+
self.set_region(CoordinateRegion.new(args.first), false)
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_region(coordinate_region, *args)
|
64
|
+
opts = {:animated => false}
|
65
|
+
opts.merge!(args.first) if args.first
|
66
|
+
self.setRegion(coordinate_region.sdk, animated:opts[:animated])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class TestSuiteDelegate
|
2
|
+
attr_accessor :window
|
3
|
+
|
4
|
+
def application(application, didFinishLaunchingWithOptions: launchOptions)
|
5
|
+
@window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
|
6
|
+
@window.rootViewController = UIViewController.alloc.init
|
7
|
+
true
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
module MapKit
|
2
|
+
# Ruby conversion of http://troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview/
|
3
|
+
module ZoomLevel
|
4
|
+
include Math
|
5
|
+
MERCATOR_OFFSET = 268435456.0
|
6
|
+
MERCATOR_RADIUS = 85445659.44705395
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
include Math
|
10
|
+
# Map conversion methods
|
11
|
+
|
12
|
+
def longitude_to_pixel_space_x(longitude)
|
13
|
+
(MERCATOR_OFFSET + MERCATOR_RADIUS * longitude * PI / 180.0).round
|
14
|
+
end
|
15
|
+
|
16
|
+
def latitude_to_pixel_space_y(latitude)
|
17
|
+
if latitude == 90.0
|
18
|
+
0
|
19
|
+
elsif latitude == -90.0
|
20
|
+
MERCATOR_OFFSET * 2
|
21
|
+
else
|
22
|
+
(MERCATOR_OFFSET - MERCATOR_RADIUS * log((1 + sin(latitude * PI / 180.0)) / (1 - sin(latitude * PI / 180.0))) / 2.0).round
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def pixel_space_x_to_longitude(pixel_x)
|
27
|
+
((pixel_x.round - MERCATOR_OFFSET) / MERCATOR_RADIUS) * 180.0 / PI
|
28
|
+
end
|
29
|
+
|
30
|
+
def pixel_space_y_to_latitude(pixel_y)
|
31
|
+
(PI / 2.0 - 2.0 * atan(exp((pixel_y.round - MERCATOR_OFFSET) / MERCATOR_RADIUS))) * 180.0 / PI
|
32
|
+
end
|
33
|
+
|
34
|
+
def coordinate_span_with_map_view(map_view, center_coordinate, zoom_level)
|
35
|
+
# convert center coordiate to pixel space
|
36
|
+
center_pixel_x = self.longitude_to_pixel_space_x(center_coordinate.longitude)
|
37
|
+
center_pixel_y = self.latitude_to_pixel_space_y(center_coordinate.latitude)
|
38
|
+
|
39
|
+
# determine the scale value from the zoom level
|
40
|
+
zoom_exponent = 20 - zoom_level
|
41
|
+
zoom_scale = 2 ** zoom_exponent
|
42
|
+
|
43
|
+
# scale the map’s size in pixel space
|
44
|
+
map_size_in_pixels = map_view.bounds.size
|
45
|
+
scaled_map_width = map_size_in_pixels.width * zoom_scale
|
46
|
+
scaled_map_height = map_size_in_pixels.height * zoom_scale
|
47
|
+
|
48
|
+
# figure out the position of the top-left pixel
|
49
|
+
top_left_pixel_x = center_pixel_x - (scaled_map_width / 2)
|
50
|
+
top_left_pixel_y = center_pixel_y - (scaled_map_height / 2)
|
51
|
+
|
52
|
+
# find delta between left and right longitudes
|
53
|
+
min_lng = self.pixel_space_x_to_longitude(top_left_pixel_x)
|
54
|
+
max_lng = self.pixel_space_x_to_longitude(top_left_pixel_x + scaled_map_width)
|
55
|
+
longitude_delta = max_lng - min_lng
|
56
|
+
|
57
|
+
# find delta between top and bottom latitudes
|
58
|
+
min_lat = self.pixel_space_y_to_latitude(top_left_pixel_y)
|
59
|
+
max_lat = self.pixel_space_y_to_latitude(top_left_pixel_y + scaled_map_height)
|
60
|
+
latitude_delta = -1 * (max_lat - min_lat)
|
61
|
+
|
62
|
+
# create and return the lat/lng span
|
63
|
+
MKCoordinateSpanMake(latitude_delta, longitude_delta)
|
64
|
+
end
|
65
|
+
|
66
|
+
# KMapView cannot display tiles that cross the pole
|
67
|
+
# This would involve wrapping the map from top to bottom, something that a Mercator projection just cannot do.
|
68
|
+
def coordinate_region_with_map_view(map_view, center_coordinate, zoom_level)
|
69
|
+
|
70
|
+
# clamp lat/long values to appropriate ranges
|
71
|
+
center_coordinate.latitude = [[-90.0, center_coordinate.latitude].max, 90.0].min
|
72
|
+
center_coordinate.longitude = center_coordinate.longitude % 180.0
|
73
|
+
|
74
|
+
# convert center coordiate to pixel space
|
75
|
+
center_pixel_x = self.longitude_to_pixel_space_x(center_coordinate.longitude)
|
76
|
+
center_pixel_y = self.latitude_to_pixel_space_y(center_coordinate.latitude)
|
77
|
+
|
78
|
+
# determine the scale value from the zoom level
|
79
|
+
zoom_exponent = 20 - zoom_level
|
80
|
+
zoom_scale = 2 ** zoom_exponent
|
81
|
+
|
82
|
+
# scale the map’s size in pixel space
|
83
|
+
map_size_in_pixels = map_view.bounds.size
|
84
|
+
scaled_map_width = map_size_in_pixels.width * zoom_scale
|
85
|
+
scaled_map_height = map_size_in_pixels.height * zoom_scale
|
86
|
+
|
87
|
+
# figure out the position of the left pixel
|
88
|
+
top_left_pixel_x = center_pixel_x - (scaled_map_width / 2)
|
89
|
+
|
90
|
+
# find delta between left and right longitudes
|
91
|
+
min_lng = self.pixel_space_x_to_longitude(top_left_pixel_x)
|
92
|
+
max_lng = self.pixel_space_x_to_longitude(top_left_pixel_x + scaled_map_width)
|
93
|
+
longitude_delta = max_lng - min_lng
|
94
|
+
|
95
|
+
# if we’re at a pole then calculate the distance from the pole towards the equator
|
96
|
+
# as MKMapView doesn’t like drawing boxes over the poles
|
97
|
+
top_pixel_y = center_pixel_y - (scaled_map_height / 2)
|
98
|
+
bottom_pixel_y = center_pixel_y + (scaled_map_height / 2)
|
99
|
+
adjusted_center_point = false
|
100
|
+
if top_pixel_y > MERCATOR_OFFSET * 2
|
101
|
+
top_pixel_y = center_pixel_y - scaled_map_height
|
102
|
+
bottom_pixel_y = MERCATOR_OFFSET * 2
|
103
|
+
adjusted_center_point = true
|
104
|
+
end
|
105
|
+
|
106
|
+
# find delta between top and bottom latitudes
|
107
|
+
min_lat = self.pixel_space_y_to_latitude(top_pixel_y)
|
108
|
+
max_lat = self.pixel_space_y_to_latitude(bottom_pixel_y)
|
109
|
+
latitude_delta = -1 * (max_lat - min_lat)
|
110
|
+
|
111
|
+
# create and return the lat/lng span
|
112
|
+
span = MKCoordinateSpanMake(latitude_delta, longitude_delta)
|
113
|
+
region = MKCoordinateRegionMake(center_coordinate, span)
|
114
|
+
# once again, MKMapView doesn’t like drawing boxes over the poles
|
115
|
+
# so adjust the center coordinate to the center of the resulting region
|
116
|
+
if adjusted_center_point
|
117
|
+
region.center.latitude = self.pixel_space_y_to_latitude((bottom_pixel_y + top_pixel_y) / 2.0)
|
118
|
+
end
|
119
|
+
|
120
|
+
region
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.included(base)
|
125
|
+
base.extend(ClassMethods)
|
126
|
+
end
|
127
|
+
|
128
|
+
# Public methods
|
129
|
+
|
130
|
+
def set_center_coordinates(center_coordinate, zoom_level, animated)
|
131
|
+
# clamp large numbers to 28
|
132
|
+
zoom_level = [zoom_level, 28].min
|
133
|
+
|
134
|
+
# use the zoom level to compute the region
|
135
|
+
span = self.class.coordinate_span_with_map_view(self, center_coordinate, zoom_level)
|
136
|
+
region = MKCoordinateRegionMake(center_coordinate, span)
|
137
|
+
|
138
|
+
# set the region like normal
|
139
|
+
self.setRegion(region, animated: animated)
|
140
|
+
end
|
141
|
+
|
142
|
+
def set_map_lat_lon(latitude, longitude, zoom_level, animated)
|
143
|
+
coordinates = CLLocationCoordinate2DMake(latitude, longitude)
|
144
|
+
self.set_center_coordinates(coordinates, zoom_level, animated)
|
145
|
+
end
|
146
|
+
|
147
|
+
def zoom_level
|
148
|
+
region = self.region
|
149
|
+
|
150
|
+
center_pixel_x = self.class.longitude_to_pixel_space_x(region.center.longitude)
|
151
|
+
top_left_pixel_x = self.class.longitude_to_pixel_space_x(region.center.longitude - region.span.longitudeDelta / 2)
|
152
|
+
|
153
|
+
scaled_map_width = (center_pixel_x - top_left_pixel_x) * 2
|
154
|
+
map_size_in_pixels = self.bounds.size
|
155
|
+
zoom_scale = scaled_map_width / map_size_in_pixels.width
|
156
|
+
zoom_exponent = log(zoom_scale) / log(2)
|
157
|
+
zoom_level = 20 - zoom_exponent
|
158
|
+
zoom_level
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
describe 'LocationCoordinate' do
|
2
|
+
before do
|
3
|
+
lc_1 = CoreLocation::DataTypes::LocationCoordinate.new(5, 8)
|
4
|
+
lc_2 = CoreLocation::DataTypes::LocationCoordinate.new([5, 8])
|
5
|
+
lc_3 = CoreLocation::DataTypes::LocationCoordinate.new(CLLocationCoordinate2DMake(5, 8))
|
6
|
+
@array = [lc_1, lc_2, lc_3]
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should return the latitude' do
|
10
|
+
@array.each do |lc|
|
11
|
+
lc.latitude.should.equal 5
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should return the longitude' do
|
16
|
+
@array.each do |lc|
|
17
|
+
lc.longitude.should.equal 8
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should return an array' do
|
22
|
+
@array.each do |lc|
|
23
|
+
lc.to_array.should.equal [5, 8]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should contain a CLLocationCoordinate2D' do
|
28
|
+
@array.each do |lc|
|
29
|
+
lc.sdk.is_a?(CLLocationCoordinate2D).should.equal true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
describe 'MapKitDataTypes' do
|
2
|
+
describe 'CoordinateSpan' do
|
3
|
+
before do
|
4
|
+
o_1 = MapKit::DataTypes::CoordinateSpan.new(5, 8)
|
5
|
+
o_2 = MapKit::DataTypes::CoordinateSpan.new([5, 8])
|
6
|
+
o_3 = MapKit::DataTypes::CoordinateSpan.new(MKCoordinateSpanMake(5, 8))
|
7
|
+
@array = [o_1, o_2, o_3]
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should return the latitude delta' do
|
11
|
+
@array.each do |o|
|
12
|
+
o.latitude_delta.should.equal 5
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should return the longitude delta' do
|
17
|
+
@array.each do |o|
|
18
|
+
o.longitude_delta.should.equal 8
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should return an array' do
|
23
|
+
@array.each do |o|
|
24
|
+
o.to_array.should.equal [5, 8]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should contain a MKCoordinateSpan' do
|
29
|
+
@array.each do |o|
|
30
|
+
o.sdk.is_a?(MKCoordinateSpan).should.equal true
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'CoordinateRegion' do
|
36
|
+
before do
|
37
|
+
lc = CoreLocation::DataTypes::LocationCoordinate.new(5, 8)
|
38
|
+
cs = MapKit::DataTypes::CoordinateSpan.new(6, 9)
|
39
|
+
mkcr = MKCoordinateRegionMake(CLLocationCoordinate2DMake(5, 8), MKCoordinateSpanMake(6, 9))
|
40
|
+
o_1 = MapKit::DataTypes::CoordinateRegion.new([5, 8], [6, 9])
|
41
|
+
o_2 = MapKit::DataTypes::CoordinateRegion.new(lc, cs)
|
42
|
+
o_3 = MapKit::DataTypes::CoordinateRegion.new(CLLocationCoordinate2DMake(5, 8), MKCoordinateSpanMake(6, 9))
|
43
|
+
o_4 = MapKit::DataTypes::CoordinateRegion.new(mkcr)
|
44
|
+
o_5 = MapKit::DataTypes::CoordinateRegion.new(o_1)
|
45
|
+
@array = [o_1, o_2, o_3, o_4, o_5]
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should return the center' do
|
49
|
+
@array.each do |o|
|
50
|
+
o.center.is_a?(CoreLocation::DataTypes::LocationCoordinate).should.equal true
|
51
|
+
o.center.latitude.should.equal 5
|
52
|
+
o.center.longitude.should.equal 8
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should return the span' do
|
57
|
+
@array.each do |o|
|
58
|
+
o.span.is_a?(MapKit::DataTypes::CoordinateSpan).should.equal true
|
59
|
+
o.span.latitude_delta.should.equal 6
|
60
|
+
o.span.longitude_delta.should.equal 9
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should return a hash' do
|
65
|
+
@array.each do |o|
|
66
|
+
o.to_hash.should.equal({:center => [5, 8], :span => [6, 9]})
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should contain a MKCoordinateRegion' do
|
71
|
+
@array.each do |o|
|
72
|
+
o.sdk.is_a?(MKCoordinateRegion).should.equal true
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe 'MapPoint' do
|
78
|
+
before do
|
79
|
+
o_1 = MapKit::DataTypes::MapPoint.new(5, 8)
|
80
|
+
o_2 = MapKit::DataTypes::MapPoint.new([5, 8])
|
81
|
+
o_3 = MapKit::DataTypes::MapPoint.new(MKMapPointMake(5, 8))
|
82
|
+
@array = [o_1, o_2, o_3]
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should return the x' do
|
86
|
+
@array.each do |o|
|
87
|
+
o.x.should.equal 5
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should return the y' do
|
92
|
+
@array.each do |o|
|
93
|
+
o.y.should.equal 8
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should return an array' do
|
98
|
+
@array.each do |o|
|
99
|
+
o.to_array.should.equal [5, 8]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should contain a MKMapPoint' do
|
104
|
+
@array.each do |o|
|
105
|
+
o.sdk.is_a?(MKMapPoint).should.equal true
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe 'MapSize' do
|
111
|
+
before do
|
112
|
+
o_1 = MapKit::DataTypes::MapSize.new(5, 8)
|
113
|
+
o_2 = MapKit::DataTypes::MapSize.new([5, 8])
|
114
|
+
o_3 = MapKit::DataTypes::MapSize.new(MKMapSizeMake(5, 8))
|
115
|
+
@array = [o_1, o_2, o_3]
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'should return the width' do
|
119
|
+
@array.each do |o|
|
120
|
+
o.width.should.equal 5
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should return the height' do
|
125
|
+
@array.each do |o|
|
126
|
+
o.height.should.equal 8
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'should return an array' do
|
131
|
+
@array.each do |o|
|
132
|
+
o.to_array.should.equal [5, 8]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should contain a MKMapSize' do
|
137
|
+
@array.each do |o|
|
138
|
+
o.sdk.is_a?(MKMapSize).should.equal true
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
describe 'MapRect' do
|
144
|
+
before do
|
145
|
+
mp = MapKit::DataTypes::MapPoint.new(5, 8)
|
146
|
+
ms = MapKit::DataTypes::MapSize.new(6, 9)
|
147
|
+
o_1 = MapKit::DataTypes::MapRect.new(5, 8, 6, 9)
|
148
|
+
o_2 = MapKit::DataTypes::MapRect.new([5, 8], [6, 9])
|
149
|
+
o_3 = MapKit::DataTypes::MapRect.new(mp, ms)
|
150
|
+
o_4 = MapKit::DataTypes::MapRect.new(MKMapPointMake(5, 8), MKMapSizeMake(6, 9))
|
151
|
+
@array = [o_1, o_2, o_3, o_4]
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'should return the origin' do
|
155
|
+
@array.each do |o|
|
156
|
+
o.origin.is_a?(MapKit::DataTypes::MapPoint).should.equal true
|
157
|
+
o.origin.x.should.equal 5
|
158
|
+
o.origin.y.should.equal 8
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'should return the size' do
|
163
|
+
@array.each do |o|
|
164
|
+
o.size.is_a?(MapKit::DataTypes::MapSize).should.equal true
|
165
|
+
o.size.width.should.equal 6
|
166
|
+
o.size.height.should.equal 9
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'should return a hash' do
|
171
|
+
@array.each do |o|
|
172
|
+
o.to_hash.should.equal({:origin => [5, 8], :size => [6, 9]})
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'should contain a MKMapRect' do
|
177
|
+
@array.each do |o|
|
178
|
+
o.sdk.is_a?(MKMapRect).should.equal true
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
describe 'MapView' do
|
2
|
+
before do
|
3
|
+
@map = MapKit::MapView.new
|
4
|
+
@map.delegate = self
|
5
|
+
@map.frame = UIScreen.mainScreen.bounds
|
6
|
+
@map.region = MapKit::CoordinateRegion.new([56, 10.6], [3.1, 3.1])
|
7
|
+
@map.zoom_enabled = false
|
8
|
+
@map.scroll_enabled = false
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should initialize' do
|
12
|
+
@map.should.satisfy { |object| object.is_a? MapKit::MapView }
|
13
|
+
end
|
14
|
+
|
15
|
+
# zoom
|
16
|
+
|
17
|
+
it 'should show zoom_enabled?' do
|
18
|
+
@map.zoom_enabled?.should.equal false
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should set zoom_enabled' do
|
22
|
+
@map.zoom_enabled = true
|
23
|
+
@map.zoom_enabled?.should.equal true
|
24
|
+
end
|
25
|
+
|
26
|
+
# scroll
|
27
|
+
|
28
|
+
it 'should show scroll_enabled?' do
|
29
|
+
@map.scroll_enabled?.should.equal false
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should show zoom_enabled' do
|
33
|
+
@map.scroll_enabled = true
|
34
|
+
@map.scroll_enabled?.should.equal true
|
35
|
+
end
|
36
|
+
|
37
|
+
# user location
|
38
|
+
|
39
|
+
it 'should show shows_user_location?' do
|
40
|
+
@map.shows_user_location?.should.equal false
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should set shows_user_location' do
|
44
|
+
@map.shows_user_location = true
|
45
|
+
@map.shows_user_location?.should == true
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should show user_located?' do
|
49
|
+
@map.user_located?.should.equal false
|
50
|
+
@map.shows_user_location = true
|
51
|
+
#wait 10 do
|
52
|
+
# @map.user_located?.should.equal true
|
53
|
+
#end
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should show user_coordinates' do
|
57
|
+
@map.user_coordinates.should.equal nil
|
58
|
+
@map.shows_user_location = true
|
59
|
+
#wait 10 do
|
60
|
+
# @map.user_coordinates.latitude.should.equal 56
|
61
|
+
#end
|
62
|
+
end
|
63
|
+
|
64
|
+
# region
|
65
|
+
|
66
|
+
it 'should show get_region' do
|
67
|
+
@map.get_region.should.satisfy { |object| object.is_a? MapKit::DataTypes::CoordinateRegion }
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should set region=' do
|
71
|
+
@map.region = MapKit::CoordinateRegion.new([56, 10.6], [3.1, 3.1])
|
72
|
+
@map.get_region.should.satisfy { |object| object.is_a? MapKit::DataTypes::CoordinateRegion }
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should set_region(coordinate_region, *args)' do
|
76
|
+
@map.set_region(MapKit::CoordinateRegion.new([56, 10.6], [3.1, 3.1]), false)
|
77
|
+
@map.get_region.should.satisfy { |object| object.is_a? MapKit::DataTypes::CoordinateRegion }
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
describe 'ZoomLevel' do
|
2
|
+
before do
|
3
|
+
@map = MapKit::MapView.new
|
4
|
+
@map.delegate = self
|
5
|
+
@map.frame = UIScreen.mainScreen.bounds
|
6
|
+
@map.region = MapKit::CoordinateRegion.new([56, 10.6], [3.1, 3.1])
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should return longitude_to_pixel_space_x' do
|
10
|
+
MapKit::MapView.longitude_to_pixel_space_x(30).should.equal 313174656
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should return latitude_to_pixel_space_y' do
|
14
|
+
MapKit::MapView.latitude_to_pixel_space_y(90).should.equal 0
|
15
|
+
MapKit::MapView.latitude_to_pixel_space_y(-90).should.equal 536870912
|
16
|
+
MapKit::MapView.latitude_to_pixel_space_y(0).should.equal 268435456
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should return pixel_space_x_to_longitude' do
|
20
|
+
MapKit::MapView.pixel_space_x_to_longitude(313174656).should.equal 29.999984741210 # 30
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should return pixel_space_y_to_latitude' do
|
24
|
+
MapKit::MapView.pixel_space_y_to_latitude(0).should.equal 85.0511169433594 # 90
|
25
|
+
MapKit::MapView.pixel_space_y_to_latitude(536870912).should.equal -85.0511169433594 # -90
|
26
|
+
MapKit::MapView.pixel_space_y_to_latitude(268435456).should.equal 0
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should return coordinate_span_with_map_view' do
|
30
|
+
span = MapKit::MapView.coordinate_span_with_map_view(@map, CLLocationCoordinate2DMake(56, 10), 2)
|
31
|
+
span.latitudeDelta.should.equal 48.452224731445
|
32
|
+
span.longitudeDelta.should.equal 56.25
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should return set_center_coordinates' do
|
36
|
+
@map.set_center_coordinates(CLLocationCoordinate2DMake(56, 10), 2, false)
|
37
|
+
center = CoreLocation::DataTypes::LocationCoordinate.new(@map.region.center)
|
38
|
+
span = MapKit::DataTypes::CoordinateSpan.new(@map.region.span)
|
39
|
+
span.latitude_delta.should.equal 48.4812927246094
|
40
|
+
span.longitude_delta.should.equal 56.25
|
41
|
+
center.latitude.should.equal 55.9737854003906
|
42
|
+
center.longitude.should.equal 10.01953125
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should return set_map_lat_lon' do
|
46
|
+
@map.set_map_lat_lon(56, 10, 2, false)
|
47
|
+
center = CoreLocation::DataTypes::LocationCoordinate.new(@map.region.center)
|
48
|
+
span = MapKit::DataTypes::CoordinateSpan.new(@map.region.span)
|
49
|
+
span.latitude_delta.should.equal 48.4812927246094
|
50
|
+
span.longitude_delta.should.equal 56.25
|
51
|
+
center.latitude.should.equal 55.9737854003906
|
52
|
+
center.longitude.should.equal 10.01953125
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should return coordinate_region_with_map_view' do
|
56
|
+
view = MKMapView.alloc.init
|
57
|
+
view.frame = @map.frame
|
58
|
+
center = CLLocationCoordinate2DMake(56, 10)
|
59
|
+
region = MapKit::MapView.coordinate_region_with_map_view(view, center, 2)
|
60
|
+
center = CoreLocation::DataTypes::LocationCoordinate.new(region.center)
|
61
|
+
span = MapKit::DataTypes::CoordinateSpan.new(region.span)
|
62
|
+
span.latitude_delta.should.equal 48.4522247314453
|
63
|
+
span.longitude_delta.should.equal 56.25
|
64
|
+
center.latitude.should.equal 56.0
|
65
|
+
center.longitude.should.equal 10.0
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should have a zoom_level' do
|
69
|
+
@map.zoom_level.should.equal 5.00000381469727
|
70
|
+
end
|
71
|
+
end
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: map-kit-wrapper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Kasper Weibel Nielsen-Refs
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-06-20 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: bubble-wrap
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rake
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
none: false
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
hash: 3
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
version: "0"
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
48
|
+
description:
|
49
|
+
email:
|
50
|
+
- weibel@gmail.com
|
51
|
+
executables: []
|
52
|
+
|
53
|
+
extensions: []
|
54
|
+
|
55
|
+
extra_rdoc_files: []
|
56
|
+
|
57
|
+
files:
|
58
|
+
- .gitignore
|
59
|
+
- Gemfile
|
60
|
+
- LICENSE
|
61
|
+
- README.md
|
62
|
+
- Rakefile
|
63
|
+
- lib/map_kit_wrapper.rb
|
64
|
+
- lib/map_kit_wrapper/version.rb
|
65
|
+
- map_kit_wrapper.gemspec
|
66
|
+
- motion/core_location_data_types.rb
|
67
|
+
- motion/map_kit_data_types.rb
|
68
|
+
- motion/map_type.rb
|
69
|
+
- motion/map_view.rb
|
70
|
+
- motion/test_suite_delegate.rb
|
71
|
+
- motion/zoom_level.rb
|
72
|
+
- spec/core_location_data_types_spec.rb
|
73
|
+
- spec/map_kit_data_types_spec.rb
|
74
|
+
- spec/map_view_spec.rb
|
75
|
+
- spec/zoom_level_spec.rb
|
76
|
+
homepage: https://github.com/weibel/MapKitWrapper
|
77
|
+
licenses: []
|
78
|
+
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
|
82
|
+
require_paths:
|
83
|
+
- lib
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
hash: 3
|
99
|
+
segments:
|
100
|
+
- 0
|
101
|
+
version: "0"
|
102
|
+
requirements: []
|
103
|
+
|
104
|
+
rubyforge_project:
|
105
|
+
rubygems_version: 1.8.24
|
106
|
+
signing_key:
|
107
|
+
specification_version: 3
|
108
|
+
summary: This is a MapKit wrapper for RubyMotion. It's purpose is to make make dealing with MapKit less painfull
|
109
|
+
test_files:
|
110
|
+
- spec/core_location_data_types_spec.rb
|
111
|
+
- spec/map_kit_data_types_spec.rb
|
112
|
+
- spec/map_view_spec.rb
|
113
|
+
- spec/zoom_level_spec.rb
|