Skip to content

Commit 55b2a51

Browse files
committed
Merge branch 'release/v0.1'
2 parents b76a97b + 0dace12 commit 55b2a51

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+2128
-0
lines changed

Diff for: README.md

+26
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,28 @@
11
# TerraIncognita
22
One map library to rule them all.
3+
4+
The idea of TerraIncognita is to provide a common API for several maps libraries.
5+
6+
## Roadmap
7+
### v1.0 (MVP)
8+
#### v0.1
9+
1. Core Objects:
10+
* configurable map manager
11+
* add/remove markers
12+
* markers storage
13+
1. AMaps core objects
14+
1. GMaps core objects
15+
#### v0.2
16+
1. markers filtering according to map view region change
17+
1. markers customization (image)
18+
1. markers clustering
19+
#### v0.3
20+
1. map interaction delegate
21+
* markers selection
22+
* user location change
23+
#### v0.4
24+
1. shapes
25+
* line
26+
* polygon
27+
* circle
28+
1. shapes customization

Diff for: TerraIncognita/AMaps/Manager/AMapsManager.swift

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//
2+
// AMapsManager.swift
3+
// TerraIncognitaExample
4+
//
5+
// Created by Valeriy Bezuglyy on 29/07/2017.
6+
// Copyright © 2017 Valeriy Bezuglyy. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
protocol AMapsManagerDelegate:TerraManagerDelegate {
12+
}
13+
14+
protocol AMapsManager: TerraManager {
15+
}
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//
2+
// AMapsManagerConfig.swift
3+
// TerraIncognitaExample
4+
//
5+
// Created by Valeriy Bezuglyy on 29/07/2017.
6+
// Copyright © 2017 Valeriy Bezuglyy. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
protocol AMapsManagerConfig: TerraManagerConfig {
12+
}

Diff for: TerraIncognita/AMaps/Manager/AMapsManagerObj.swift

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// AMapsManagerBase.swift
3+
// TerraIncognitaExample
4+
//
5+
// Created by Valeriy Bezuglyy on 29/07/2017.
6+
// Copyright © 2017 Valeriy Bezuglyy. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
class AMapsManagerObj: TerraManagerBase {
12+
13+
weak var aMapsDelegate: AMapsManagerDelegate? {
14+
get{
15+
return delegate as? AMapsManagerDelegate
16+
}
17+
set{
18+
delegate = newValue
19+
}
20+
}
21+
22+
init(config: AMapsManagerConfig) {
23+
super.init(config: config)
24+
viewObjectsPool = AMapsViewObjectsPool()
25+
}
26+
27+
//MARK: - markers
28+
29+
//MARK: - view
30+
override func makeTerraView() -> TerraView {
31+
view = AMapsView()
32+
return view!
33+
}
34+
35+
}

Diff for: TerraIncognita/AMaps/Other/TerraRegion+AMaps.swift

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// TerraRegion+AMaps.swift
3+
// TerraIncognitaExample
4+
//
5+
// Created by Valeriy Bezuglyy on 20/08/2017.
6+
// Copyright © 2017 Valeriy Bezuglyy. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import MapKit
11+
12+
extension TerraRegion {
13+
convenience init(mkCoordinateRegion: MKCoordinateRegion) {
14+
let center = mkCoordinateRegion.center
15+
let deltaLat = mkCoordinateRegion.span.latitudeDelta
16+
let deltaLon = mkCoordinateRegion.span.longitudeDelta
17+
18+
self.init(topLeft: CLLocationCoordinate2D(latitude: center.latitude + deltaLat,
19+
longitude: center.longitude - deltaLon),
20+
topRight: CLLocationCoordinate2D(latitude: center.latitude + deltaLat,
21+
longitude: center.longitude + deltaLon),
22+
bottomLeft: CLLocationCoordinate2D(latitude: center.latitude - deltaLat,
23+
longitude: center.longitude - deltaLon),
24+
bottomRight: CLLocationCoordinate2D(latitude: center.latitude - deltaLat,
25+
longitude: center.longitude + deltaLon))
26+
}
27+
}

Diff for: TerraIncognita/AMaps/View/AMapsView.swift

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//
2+
// TerraView.swift
3+
// TerraIncognitaExample
4+
//
5+
// Created by Valeriy Bezuglyy on 29/07/2017.
6+
// Copyright © 2017 Valeriy Bezuglyy. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import MapKit
11+
12+
class AMapsView: MKMapView {
13+
14+
// required init?(coder aDecoder: NSCoder) {
15+
// fatalError("init(coder:) has not been implemented")
16+
// }
17+
}
18+
19+
extension AMapsView: TerraView {
20+
func view() -> UIView {
21+
return self
22+
}
23+
24+
func currentRegion() -> TerraRegion {
25+
let mkRegion = region
26+
let terraRegion = TerraRegion(mkCoordinateRegion: mkRegion)
27+
return terraRegion
28+
}
29+
30+
func updateViewMarkers(add viewMarkersToAdd: [TerraViewMarker], remove viewMarkersToRemove: [TerraViewMarker]) {
31+
DispatchQueue.main.async { [weak self] in
32+
guard let __self = self else { return }
33+
__self.delegate = __self
34+
__self.removeAnnotations(viewMarkersToRemove as! [AMapsViewMarker])
35+
__self.addAnnotations(viewMarkersToAdd as! [AMapsViewMarker])
36+
}
37+
}
38+
}
39+
40+
extension AMapsView: MKMapViewDelegate {
41+
42+
}

Diff for: TerraIncognita/AMaps/View/AMapsViewMarker.swift

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//
2+
// TerraViewMarker.swift
3+
// TerraIncognitaExample
4+
//
5+
// Created by Valeriy Bezuglyy on 30/07/2017.
6+
// Copyright © 2017 Valeriy Bezuglyy. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import MapKit
11+
12+
class AMapsViewMarker: NSObject, TerraViewMarker {
13+
var terra_markerId: String!
14+
var terra_reuseIdentifier: String?
15+
var terra_coordinate: CLLocationCoordinate2D!
16+
}
17+
18+
extension AMapsViewMarker: MKAnnotation {
19+
public var coordinate: CLLocationCoordinate2D {
20+
get{
21+
return terra_coordinate
22+
}
23+
}
24+
}

Diff for: TerraIncognita/AMaps/View/AMapsViewObjectsPool.swift

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//
2+
// TerraViewObjectsPool.swift
3+
// TerraIncognitaExample
4+
//
5+
// Created by Valeriy Bezuglyy on 30/07/2017.
6+
// Copyright © 2017 Valeriy Bezuglyy. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import MapKit
11+
12+
class AMapsViewObjectsPool: TerraViewObjectsPool {
13+
14+
//MARK: viewMarkers
15+
override func makeViewMarker(_ markerId: String, reuseIdentifier: String?) -> TerraViewMarker {
16+
let viewMarker = AMapsViewMarker()
17+
viewMarker.terra_markerId = markerId
18+
viewMarker.terra_reuseIdentifier = reuseIdentifier
19+
return viewMarker
20+
}
21+
}

Diff for: TerraIncognita/Core/Manager/TerraManager.swift

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//
2+
// TerraManager.swift
3+
// TerraIncognitaExample
4+
//
5+
// Created by Valeriy Bezuglyy on 29/07/2017.
6+
// Copyright © 2017 Valeriy Bezuglyy. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
protocol TerraManagerDelegate:class {
12+
}
13+
14+
protocol TerraManager: class {
15+
weak var delegate:TerraManagerDelegate? {get set}
16+
17+
//MARK: - markers
18+
func reloadMarkers(_ newMarkers:[TerraMarker])
19+
func reloadMarkers(add markersToAdd:[TerraMarker], remove markerIdsToRemove:[String])
20+
21+
//MARK - view
22+
var terraView: TerraView? {get}
23+
func makeTerraView() -> TerraView
24+
}

Diff for: TerraIncognita/Core/Manager/TerraManagerBase.swift

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
//
2+
// TerraManagerBase.swift
3+
// TerraIncognitaExample
4+
//
5+
// Created by Valeriy Bezuglyy on 29/07/2017.
6+
// Copyright © 2017 Valeriy Bezuglyy. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
class TerraManagerBase: TerraManager {
12+
13+
weak var delegate:TerraManagerDelegate?
14+
var storage: TerraStorage
15+
var view: TerraView?
16+
var viewObjectsPool: TerraViewObjectsPool
17+
var updateViewQueue:DispatchQueue
18+
19+
init(config:TerraManagerConfig) {
20+
storage = TerraStorage()
21+
updateViewQueue = DispatchQueue(label: "TerraManagerBase_updateViewQueue")
22+
viewObjectsPool = TerraViewObjectsPool()
23+
}
24+
25+
//MARK: - markers
26+
func reloadMarkers(_ newMarkers:[TerraMarker]) {
27+
storage.reloadMarkers(newMarkers) { [weak self] (markers) in
28+
guard let __self = self else { return }
29+
__self.updateViewMarkersOnTerraView(markers)
30+
}
31+
}
32+
33+
func reloadMarkers(add markersToAdd:[TerraMarker], remove markerIdsToRemove:[String]) {
34+
storage.reloadMarkers(add: markersToAdd, remove: markerIdsToRemove) { [weak self] (markers) in
35+
guard let __self = self else { return }
36+
__self.updateViewMarkersOnTerraView(markers)
37+
}
38+
}
39+
40+
//MARK: - view
41+
var terraView: TerraView? {
42+
get{
43+
return view
44+
}
45+
}
46+
47+
func makeTerraView() -> TerraView {
48+
fatalError(debugMessage_notImplemented)
49+
}
50+
51+
fileprivate func updateViewMarkersOnTerraView(_ markers:[TerraMarker]) {
52+
updateViewQueue.async { [weak self] in
53+
guard let __self = self else { return }
54+
guard let terraView = __self.terraView else { return }
55+
56+
// let region = terraView.currentRegion()
57+
// let markersInside = markers.filter({ region.containsCoordinate($0.coordinate) })
58+
let markersInside = markers
59+
60+
__self.showActualViewMarkersOnTerraView(markersInside)
61+
}
62+
}
63+
64+
fileprivate func showActualViewMarkersOnTerraView(_ actualMarkers:[TerraMarker]) {
65+
var actualViewMarkers:[TerraViewMarker] = []
66+
for item in actualMarkers {
67+
let viewMarker = viewObjectsPool.dequeueReusableViewMarker(item._id, reuseIdentifier: item.reuseIdentifier)
68+
configure(viewMarker, with: item)
69+
actualViewMarkers.append(viewMarker)
70+
}
71+
72+
let otherViewMarkers:[TerraViewMarker] = viewObjectsPool.otherUsedViewMarkers(actualViewMarkers)
73+
viewObjectsPool.enqueueReusableViewMarkers(otherViewMarkers)
74+
75+
if let terraView = terraView {
76+
terraView.updateViewMarkers(add: actualViewMarkers,
77+
remove: otherViewMarkers)
78+
}
79+
}
80+
81+
//MARK: - view marker
82+
func configure(_ viewMarker:TerraViewMarker, with terraMarker:TerraMarker) {
83+
viewMarker.terra_markerId = terraMarker._id
84+
viewMarker.terra_reuseIdentifier = terraMarker.reuseIdentifier
85+
viewMarker.terra_coordinate = terraMarker.coordinate
86+
}
87+
}

Diff for: TerraIncognita/Core/Manager/TerraManagerConfig.swift

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//
2+
// TerraManagerConfig.swift
3+
// TerraIncognitaExample
4+
//
5+
// Created by Valeriy Bezuglyy on 29/07/2017.
6+
// Copyright © 2017 Valeriy Bezuglyy. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
protocol TerraManagerConfig {
12+
}

Diff for: TerraIncognita/Core/Objects/TerraMarker.swift

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//
2+
// TerraMarker.swift
3+
// TerraIncognitaExample
4+
//
5+
// Created by Valeriy Bezuglyy on 29/07/2017.
6+
// Copyright © 2017 Valeriy Bezuglyy. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import CoreLocation
11+
12+
class TerraMarker {
13+
var _id: String
14+
var coordinate: CLLocationCoordinate2D
15+
var reuseIdentifier: String?
16+
17+
init(_id: String,
18+
coordinate: CLLocationCoordinate2D) {
19+
self._id = _id
20+
self.coordinate = coordinate
21+
}
22+
}

0 commit comments

Comments
 (0)