Loading...
Searching...
No Matches
RouteManagerExample.swift
Go to the documentation of this file.
1import Foundation
2
3/**
4 * RouteManager usage example for Swift
5 * Demonstrates working with route planning, path calculation, and navigation
6 */
7class RouteManagerExample: NSObject {
8 private var sdk: NCNavigineSdk?
9 private var locationManager: NCLocationManager?
10 private var navigationManager: NCNavigationManager?
11 private var routeManager: NCRouteManager?
12
13 override init() {
14 super.init()
15 initializeSdk()
16 setupRouteListener()
17 }
18
19 /**
20 * Initialize SDK and get managers
21 */
22 private func initializeSdk() {
23 do {
24 // [swift_NavigineSdk_getInstance]
25 // Get SDK instance
26 sdk = NCNavigineSdk.getInstance()
27 // [swift_NavigineSdk_getInstance]
28
29 // [swift_NavigineSdk_setUserHash]
30 // Set user hash
31 sdk?.setUserHash("USER-HASH-HERE")
32 // [swift_NavigineSdk_setUserHash]
33
34 // [swift_NavigineSdk_setServer]
35 // Set server URL (optional)
36 sdk?.setServer("https://custom.navigine.com")
37 // [swift_NavigineSdk_setServer]
38
39 // [swift_NavigineSdk_getLocationManager]
40 // Get LocationManager for working with locations
41 locationManager = sdk?.getLocationManager()
42 // [swift_NavigineSdk_getLocationManager]
43
44 // [swift_NavigineSdk_getNavigationManager]
45 // Get NavigationManager for working with navigation
46 navigationManager = sdk?.getNavigationManager(locationManager)
47 // [swift_NavigineSdk_getNavigationManager]
48
49 // [swift_NavigineSdk_getRouteManager]
50 // Get RouteManager for working with routes
51 routeManager = sdk?.getRouteManager(locationManager, navigationManager: navigationManager)
52 // [swift_NavigineSdk_getRouteManager]
53
54 if let locationManager = locationManager,
55 let navigationManager = navigationManager,
56 let routeManager = routeManager {
57 print("LocationManager, NavigationManager and RouteManager successfully initialized")
58 }
59 } catch {
60 print("Error initializing SDK: \‍(error)")
61 }
62 }
63
64 /**
65 * Setup route listener
66 */
67 private func setupRouteListener() {
68 // RouteListener is implemented via protocol extension
69 // No additional setup needed for Swift
70 }
71
72 /**
73 * Demonstrate RouteManager methods
74 */
75 func demonstrateRouteManagerMethods() {
76 guard let manager = routeManager else {
77 print("RouteManager not initialized")
78 return
79 }
80
81 // [swift_RouteManager_addRouteListener]
82 // Add route listener
83 manager.addRouteListener(self)
84 // [swift_RouteManager_addRouteListener]
85
86 // [swift_RouteManager_setGraphTag]
87 // Set graph tag
88 manager.setGraphTag("main")
89 // [swift_RouteManager_setGraphTag]
90
91 // [swift_RouteManager_getGraphTag]
92 // Get current graph tag
93 let currentGraphTag = manager.getGraphTag()
94 print("Current graph tag: \‍(currentGraphTag)")
95 // [swift_RouteManager_getGraphTag]
96
97 // [swift_RouteManager_getGraphTags]
98 // Get all graph tags
99 let graphTags = manager.getGraphTags()
100 print("Available graph tags: \‍(graphTags)")
101 // [swift_RouteManager_getGraphTags]
102
103 // Create test points
104 let startPoint = NCPoint(x: 10.0, y: 20.0)
105 let endPoint = NCPoint(x: 50.0, y: 60.0)
106 let startLocationPoint = NCLocationPoint(point: startPoint, locationId: 12345, sublocationId: 1)
107 let endLocationPoint = NCLocationPoint(point: endPoint, locationId: 12345, sublocationId: 1)
108
109 // [swift_RouteManager_makeRoute]
110 // Make route from point to point
111 let routePath = manager.makeRoute(startLocationPoint, to: endLocationPoint)
112 print("Route created with length: \‍(routePath.getLength()) meters")
113 // [swift_RouteManager_makeRoute]
114
115 // [swift_RouteManager_makeRoutes]
116 // Make routes to multiple destinations
117 let destinations = [
118 NCLocationPoint(point: NCPoint(x: 30.0, y: 40.0), locationId: 12345, sublocationId: 1),
119 NCLocationPoint(point: NCPoint(x: 70.0, y: 80.0), locationId: 12345, sublocationId: 1)
120 ]
121 let routePaths = manager.makeRoutes(startLocationPoint, to: destinations)
122 print("Created \‍(routePaths.count) routes")
123 // [swift_RouteManager_makeRoutes]
124
125 // [swift_RouteManager_setTarget]
126 // Set target point
127 manager.setTarget(endLocationPoint)
128 // [swift_RouteManager_setTarget]
129
130 // [swift_RouteManager_addTarget]
131 // Add additional target point
132 let additionalTarget = NCLocationPoint(point: NCPoint(x: 90.0, y: 100.0), locationId: 12345, sublocationId: 1)
133 manager.addTarget(additionalTarget)
134 // [swift_RouteManager_addTarget]
135
136 // [swift_RouteManager_cancelTarget]
137 // Cancel current target
138 manager.cancelTarget()
139 // [swift_RouteManager_cancelTarget]
140
141 // [swift_RouteManager_clearTargets]
142 // Clear all targets
143 manager.clearTargets()
144 // [swift_RouteManager_clearTargets]
145 }
146
147 /**
148 * Demonstrate RoutePath class methods
149 */
150 func demonstrateRoutePathUsage(_ paths: [NCRoutePath]) {
151 for (index, path) in paths.enumerated() {
152 print("=== Route Path \‍(index + 1) ===")
153
154 // [swift_RoutePath_getLength]
155 // Get route length
156 let length = path.getLength()
157 print("Route length: \‍(length) meters")
158 // [swift_RoutePath_getLength]
159
160 // [swift_RoutePath_getWeight]
161 // Get total route weight
162 let weight = path.getWeight()
163 print("Route weight: \‍(weight)")
164 // [swift_RoutePath_getWeight]
165
166 // [swift_RoutePath_getNodes]
167 // Get route nodes
168 let nodes = path.getNodes()
169 print("Route has \‍(nodes.count) nodes")
170 for node in nodes {
171 demonstrateRouteNodeUsage(node)
172 }
173 // [swift_RoutePath_getNodes]
174
175 // [swift_RoutePath_head]
176 // Get head of route (first 10 meters)
177 if let headPath = path.head(10.0) {
178 print("Head path length: \‍(headPath.getLength()) meters")
179 }
180 // [swift_RoutePath_head]
181
182 // [swift_RoutePath_tail]
183 // Get tail of route (remaining after 10 meters)
184 if let tailPath = path.tail(10.0) {
185 print("Tail path length: \‍(tailPath.getLength()) meters")
186 }
187 // [swift_RoutePath_tail]
188 }
189 }
190
191 func demonstrateRouteNodeUsage(_ node: NCRouteNode) {
192 // [swift_RouteNode_getPoint]
193 let point = node.getPoint()
194 demonstrateLocationPointUsage(point)
195 // [swift_RouteNode_getPoint]
196
197 // [swift_RouteNode_getWeight]
198 let weight = node.getWeight()
199 print("Node weight: \‍(weight)")
200 // [swift_RouteNode_getWeight]
201
202 // [swift_RouteNode_getDistance]
203 let distance = node.getDistance()
204 print("Node distance: \‍(distance) meters")
205 // [swift_RouteNode_getDistance]
206
207 // [swift_RouteNode_getEvents]
208 let events = node.getEvents()
209 print("Node has \‍(events.count) events")
210 for event in events {
211 demonstrateRouteEventUsage(event)
212 }
213 // [swift_RouteNode_getEvents]
214 }
215
216 /**
217 * Demonstrate RouteEvent class methods
218 */
219 func demonstrateRouteEventUsage(_ event: NCRouteEvent) {
220 // [swift_RouteEvent_getType]
221 // Get event type
222 let type = event.getType()
223 print("Event type: \‍(type)")
224 // [swift_RouteEvent_getType]
225
226 // [swift_RouteEvent_getTurnEvent]
227 if let turnEvent = event.getTurnEvent() {
228 demonstrateTurnEventUsage(turnEvent)
229 }
230 // [swift_RouteEvent_getTurnEvent]
231
232 // [swift_RouteEvent_getTransitionEntryEvent]
233 if let entryEvent = event.getTransitionEntryEvent() {
234 demonstrateTransitionEntryEventUsage(entryEvent)
235 }
236 // [swift_RouteEvent_getTransitionEntryEvent]
237
238 // [swift_RouteEvent_getTransitionExitEvent]
239 if let exitEvent = event.getTransitionExitEvent() {
240 demonstrateTransitionExitEventUsage(exitEvent)
241 }
242 // [swift_RouteEvent_getTransitionExitEvent]
243
244 // [swift_RouteEvent_getTargetReachedEvent]
245 if let targetEvent = event.getTargetReachedEvent() {
246 demonstrateTargetReachedEventUsage(targetEvent)
247 }
248 // [swift_RouteEvent_getTargetReachedEvent]
249 }
250
251 /**
252 * Demonstrate RouteEventType enum values
253 */
254 func demonstrateRouteEventTypes() {
255 // [swift_RouteEventType_values]
256 // Get all route event type values
257 let types: [NCRouteEventType] = [.turnLeft, .turnRight, .transition]
258 print("Available route event types:")
259 for type in types {
260 print(" - \‍(type)")
261 }
262 // [swift_RouteEventType_values]
263 }
264
265 func demonstrateTurnTypes() {
266 // [swift_TurnType_values]
267 let types: [NCTurnType] = [.leftSlight, .leftNormal, .leftSharp, .rightSlight, .rightNormal, .rightSharp, .complete]
268 print("Available turn types:")
269 for type in types {
270 print(" - \‍(type)")
271 }
272 // [swift_TurnType_values]
273 }
274
275 func demonstrateTurnEventUsage(_ event: NCTurnEvent) {
276 // [swift_TurnEvent_getType]
277 let type = event.getType()
278 print("Turn type: \‍(type)")
279 // [swift_TurnEvent_getType]
280
281 // [swift_TurnEvent_getAngle]
282 let angle = event.getAngle()
283 print("Turn angle: \‍(angle)")
284 // [swift_TurnEvent_getAngle]
285 }
286
287 func demonstrateTransitionEntryEventUsage(_ event: NCTransitionEntryEvent) {
288 // [swift_TransitionEntryEvent_getFrom]
289 let from = event.getFrom()
290 print("Transition entry from: \‍(from)")
291 // [swift_TransitionEntryEvent_getFrom]
292
293 // [swift_TransitionEntryEvent_getTo]
294 let to = event.getTo()
295 print("Transition entry to: \‍(to)")
296 // [swift_TransitionEntryEvent_getTo]
297 }
298
299 func demonstrateTransitionExitEventUsage(_ event: NCTransitionExitEvent) {
300 // [swift_TransitionExitEvent_getFrom]
301 let from = event.getFrom()
302 print("Transition exit from: \‍(from)")
303 // [swift_TransitionExitEvent_getFrom]
304
305 // [swift_TransitionExitEvent_getTo]
306 let to = event.getTo()
307 print("Transition exit to: \‍(to)")
308 // [swift_TransitionExitEvent_getTo]
309 }
310
311 func demonstrateTargetReachedEventUsage(_ event: NCTargetReachedEvent) {
312 // [swift_TargetReachedEvent_getIndex]
313 let index = event.getIndex()
314 print("Reached target index: \‍(index)")
315 // [swift_TargetReachedEvent_getIndex]
316
317 // [swift_TargetReachedEvent_getPoint]
318 let point = event.getPoint()
319 demonstrateLocationPointUsage(point)
320 // [swift_TargetReachedEvent_getPoint]
321 }
322
323 /**
324 * Demonstrate LocationPoint class methods
325 */
326 func demonstrateLocationPointUsage(_ locationPoint: NCLocationPoint) {
327 // [swift_LocationPoint_getPoint]
328 // Get point coordinates
329 if let point = locationPoint.getPoint() {
330 demonstratePointUsage(point)
331 }
332 // [swift_LocationPoint_getPoint]
333
334 // [swift_LocationPoint_getLocationId]
335 // Get location ID
336 let locationId = locationPoint.getLocationId()
337 print("Location ID: \‍(locationId)")
338 // [swift_LocationPoint_getLocationId]
339
340 // [swift_LocationPoint_getSublocationId]
341 // Get sublocation ID
342 let sublocationId = locationPoint.getSublocationId()
343 print("Sublocation ID: \‍(sublocationId)")
344 // [swift_LocationPoint_getSublocationId]
345
346 // [swift_LocationPoint_constructor]
347 // Create new LocationPoint
348 let newPoint = NCPoint(x: 15.0, y: 25.0)
349 let newLocationPoint = NCLocationPoint(point: newPoint, locationId: locationId, sublocationId: sublocationId)
350 print("Created new LocationPoint: \‍(newLocationPoint)")
351 // [swift_LocationPoint_constructor]
352 }
353
354 /**
355 * Demonstrate Point class methods
356 */
357 func demonstratePointUsage(_ point: NCPoint) {
358 // [swift_Point_getX]
359 // Get X coordinate
360 let x = point.getX()
361 print("Point X: \‍(x)")
362 // [swift_Point_getX]
363
364 // [swift_Point_getY]
365 // Get Y coordinate
366 let y = point.getY()
367 print("Point Y: \‍(y)")
368 // [swift_Point_getY]
369
370 // [swift_Point_constructor]
371 // Create new Point
372 let newPoint = NCPoint(x: x, y: y)
373 print("Created new Point: \‍(newPoint)")
374 // [swift_Point_constructor]
375 }
376
377 /**
378 * Demonstrate advanced routing features
379 */
380 func demonstrateAdvancedRoutingFeatures() {
381 print("=== Advanced Routing Features ===")
382
383 guard let manager = routeManager else {
384 return
385 }
386
387 // Create multiple routes with different graph tags
388 let graphTags = ["main", "elevator", "stairs"]
389
390 for tag in graphTags {
391 // [swift_RouteManager_setGraphTag_2]
392 // Set different graph tag for routing
393 manager.setGraphTag(tag)
394 // [swift_RouteManager_setGraphTag_2]
395
396 print("Routing with graph tag: \‍(tag)")
397
398 // Create test route
399 let startPoint = NCPoint(x: 0.0, y: 0.0)
400 let endPoint = NCPoint(x: 100.0, y: 100.0)
401 let startLocationPoint = NCLocationPoint(point: startPoint, locationId: 12345, sublocationId: 1)
402 let endLocationPoint = NCLocationPoint(point: endPoint, locationId: 12345, sublocationId: 1)
403
404 // [swift_RouteManager_makeRoute_2]
405 // Make route with specific graph tag
406 let routePath = manager.makeRoute(startLocationPoint, to: endLocationPoint)
407 // [swift_RouteManager_makeRoute_2]
408
409 print("Route with tag '\‍(tag)' has length: \‍(routePath.getLength()) meters")
410 }
411 }
412
413 /**
414 * Demonstrate route planning simulation
415 */
416 func demonstrateRoutePlanningSimulation() {
417 print("=== Route Planning Simulation ===")
418
419 guard let manager = routeManager else {
420 return
421 }
422
423 // Create multiple target points
424 let targets = [
425 NCLocationPoint(point: NCPoint(x: 50.0, y: 50.0), locationId: 12345, sublocationId: 1),
426 NCLocationPoint(point: NCPoint(x: 100.0, y: 100.0), locationId: 12345, sublocationId: 1),
427 NCLocationPoint(point: NCPoint(x: 150.0, y: 150.0), locationId: 12345, sublocationId: 1)
428 ]
429
430 // [swift_RouteManager_setTarget_2]
431 // Set first target
432 manager.setTarget(targets[0])
433 // [swift_RouteManager_setTarget_2]
434
435 print("Set target 1: \‍(targets[0])")
436 Thread.sleep(forTimeInterval: 1.0)
437
438 // [swift_RouteManager_addTarget_2]
439 // Add additional targets
440 for (index, target) in targets.dropFirst().enumerated() {
441 manager.addTarget(target)
442 print("Added target \‍(index + 2): \‍(target)")
443 Thread.sleep(forTimeInterval: 1.0)
444 }
445 // [swift_RouteManager_addTarget_2]
446
447 // [swift_RouteManager_cancelTarget_2]
448 // Cancel current target
449 manager.cancelTarget()
450 print("Cancelled current target")
451 // [swift_RouteManager_cancelTarget_2]
452
453 Thread.sleep(forTimeInterval: 1.0)
454
455 // [swift_RouteManager_clearTargets_2]
456 // Clear all targets
457 manager.clearTargets()
458 print("Cleared all targets")
459 // [swift_RouteManager_clearTargets_2]
460 }
461
462 /**
463 * Clean up resources
464 */
465 func cleanup() {
466 if let manager = routeManager {
467 // [swift_RouteManager_removeRouteListener]
468 // Remove route listener
469 manager.removeRouteListener(self)
470 // [swift_RouteManager_removeRouteListener]
471 }
472 }
473
474 /**
475 * Main demonstration method
476 */
477 func runExample() {
478 print("=== RouteManager Example ===")
479
480 demonstrateRouteManagerMethods()
481 demonstrateRouteEventTypes()
482 demonstrateTurnTypes()
483 demonstrateAdvancedRoutingFeatures()
484 demonstrateRoutePlanningSimulation()
485
486 // Wait a bit for route updates
487 Thread.sleep(forTimeInterval: 3.0)
488
489 cleanup()
490 print("=== Example completed ===")
491 }
492}
493
494// MARK: - NCRouteListener
495
496extension RouteManagerExample: NCRouteListener {
497 // [swift_RouteListener_onPathsUpdated]
498 func onPathsUpdated(_ paths: [NCRoutePath]) {
499 print("Routes updated successfully")
500 demonstrateRoutePathUsage(paths)
501 }
502 // [swift_RouteListener_onPathsUpdated]
503}
504
505/**
506 * Function to run the example
507 */
508func main() {
509 let example = RouteManagerExample()
510 example.runExample()
511}
512
513// Run the example
514main()