-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathSwisstopoMapView.swift
119 lines (90 loc) · 3.81 KB
/
SwisstopoMapView.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
* Copyright (c) 2021 Ubique Innovation AG <https://www.ubique.ch>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* SPDX-License-Identifier: MPL-2.0
*/
@_exported import MapCore
@_exported import LayerGps
@_exported import SwisstopoMapSDKSharedModule
@_exported import MapCoreSharedModule
import UIKit
public class SwisstopoMapView: MCMapView {
private let loaders: [MCLoaderInterface]
open private(set) var baseLayer: MCTiled2dMapRasterLayerInterface
private(set) var currentBaseLayer: STSDKSwisstopoLayerType
private lazy var capabilitiesResource = SwisstopoCapabilitiesResource.capabilitiesResource
open private(set) var gpsLayer: MCGpsLayer?
public init(baseLayerType: STSDKSwisstopoLayerType = .PIXELKARTE_FARBE,
loaders: [MCLoaderInterface] = [SwisstopoTextureLoader()]) {
self.loaders = loaders
self.currentBaseLayer = baseLayerType
guard let baseLayer = STSDKSwisstopoLayerFactory.createSwisstopoTiledRasterLayer(baseLayerType, tileLoaders: loaders) else {
fatalError("unable to create SwisstopoLayer")
}
self.baseLayer = baseLayer
let coordinateSystem = MCCoordinateSystemFactory.getEpsg2056System()
super.init(mapConfig: .init(mapCoordinateSystem: coordinateSystem))
camera.setMinZoom(10_000_000)
camera.setMaxZoom(300)
camera.setZoom(10_000_000, animated: false)
add(layer: baseLayer.asLayerInterface())
}
public func setBaseLayerType(type: STSDKSwisstopoLayerType) {
guard currentBaseLayer != type else {
// base layer is already set
return
}
currentBaseLayer = type
guard let newLayer = STSDKSwisstopoLayerFactory.createSwisstopoTiledRasterLayer(type, tileLoaders: loaders) else {
fatalError("unable to create SwisstopoLayer")
}
if let oldCallbackHandler = baseLayer.getCallbackHandler() {
newLayer.setCallbackHandler(oldCallbackHandler)
}
remove(layer: baseLayer.asLayerInterface())
baseLayer = newLayer
insert(layer: newLayer.asLayerInterface(), at: 0)
}
@discardableResult
public func addSwisstopoLayer(type: STSDKSwisstopoLayerType) -> MCTiled2dMapRasterLayerInterface {
guard let layer = STSDKSwisstopoLayerFactory.createSwisstopoTiledRasterLayer(type, tileLoaders: loaders) else {
fatalError("unable to create SwisstopoLayer")
}
if let gpsLayer = gpsLayer {
insert(layer: layer.asLayerInterface(), below: gpsLayer.asLayerInterface())
} else {
add(layer: layer.asLayerInterface())
}
return layer
}
@discardableResult
public func addSwisstopoLayer(identifier: String) -> MCTiled2dMapRasterLayerInterface {
guard let layer = capabilitiesResource.createLayer(identifier, tileLoaders: loaders) else {
fatalError("Layer does not exist")
}
if let gpsLayer = gpsLayer {
insert(layer: layer.asLayerInterface(), below: gpsLayer.asLayerInterface())
} else {
add(layer: layer.asLayerInterface())
}
return layer
}
@discardableResult
public func addGpsLayer(style: MCGpsStyleInfoInterface = .defaultStyle, layerIndex: Int? = nil) -> MCGpsLayer {
if let gpsLayer = gpsLayer {
return gpsLayer
}
let layer = MCGpsLayer(style: style)
gpsLayer = layer
if let layerIndex = layerIndex {
insert(layer: layer.asLayerInterface(), at: layerIndex)
} else {
add(layer: layer.asLayerInterface())
}
return layer
}
}