Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The core component of Navmii SDK responsible for route calculation is NMRoutingService. This class provides the API for calculating new routes and snapping external routes to the map.

CREATING ROUTING SERVICE

NMSdk class contains routingService property which allows Navmii SDK user to access routing service instance. The routing service instance can only be created after the SDK was started.

...

Code Block
languagecpp
titleSample: creating routing service
collapsetrue
/// RoutingServiceContainer.h
#import <Foundation/Foundation.h>
#import <NavmiiSDK/NMSdk.h>
#import <NavmiiSDK/NMRoutingService.h>
 
@interface RoutingServiceContainer : NSObject
 
@property (nonatomic, readonly, strong, nullable) NMRoutingService *routingService;

- (nullable instancetype)initWithSdk:(nonnull NMSdk *)sdk;

- (nullable instancetype)init NS_UNAVAILABLE;

+ (nullable instancetype)new NS_UNAVAILABLE;

@end


/// RoutingServiceContainer.m
#import "RoutingServiceContainer.h"

@implementation RoutingServiceContainer {
    
    NMSdk *sdk;
}

@synthesize routingService;

- (nullable NMRoutingService *)routingService {
 
    if (routingService == nil) {
 
        routingService = sdk.routingService;
    }
 
    return routingService;
}

- (nullable instancetype)initWithSdk:(nonnull NMSdk *)sdk {
    
    if (self = [super init]) {
        
        self->sdk = sdk;
    }
    
    return self;
}
 
@end

ROUTING SERVICE BASICS

Routing service can be used to calculate new routes or to snap external routes to the map. Routing service handles both processes in the same way.

...

Code Block
languagecpp
titleSample: routing service request handling
collapsetrue
/// SimpleRouteCalculator.h
#import <Foundation/Foundation.h>
#import <NavmiiSDK/NMSdk.h>
#import <NavmiiSDK/NMRoutePlanPoint.h>
#import <NavmiiSDK/NMRouteCalculationOptions.h>
 
@interface SimpleRouteCalculator : NSObject
 
- (void)calculateRouteUsingRoutePlanPoints:(nonnull NSArray<NMRoutePlanPoint *> *)routePlanPoints
                                   options:(nullable NMRouteCalculationOptions *)options;
 
- (void)cancelRouteCalculation;
 
- (nullable instancetype)initWithSdk:(nonnull NMSdk *)sdk;

- (nullable instancetype)init NS_UNAVAILABLE;

+ (nullable instancetype)new NS_UNAVAILABLE;
 
@end

/// SimpleRouteCalculator.m
#import "SimpleRouteCalculator.h"
#import "RoutingServiceContainer.h"
#import <NavmiiSDK/NMRouteCalculationSession.h>
#import <NavmiiSDK/NMRouteCalculationListener.h>
 
@interface SessionListener: NSObject<NMRouteCalculationListener>
 
- (nullable instancetype)init NS_UNAVAILABLE;
 
- (nullable instancetype)initWithWeakCalculator:(__weak SimpleRouteCalculator *)weakCalculator;
 
@end
 
@implementation SimpleRouteCalculator {
 
    RoutingServiceContainer *routingServiceContainer;
    NMRouteCalculationSession *session;
    SessionListener *sessionListener;
}
 
- (void)calculateRouteUsingRoutePlanPoints:(nonnull NSArray<NMRoutePlanPoint *> *)routePlanPoints
                                   options:(nullable NMRouteCalculationOptions *)options {
 
    NMRoutingService *routingService = routingServiceContainer.routingService;
    if (routingService == nil) {
 
        // Routing service is not available.
        return;
    }
 
    [self cancelRouteCalculation];
 
    SessionListener *sessionListener = [[SessionListener alloc] initWithWeakCalculator:self];
    NMRouteCalculationSession *session = [routingService calculateRouteUsingRoutePlan:routePlanPoints
                                                                              options:options
                                                                 statusReportListener:sessionListener];
    if (session == nil) {
         
        // Couldn't start route calculation.
        return;
    }
 
    // Store route calculation session and its listeners.
    self->session = session;
    self->sessionListener = sessionListener;
}
 
- (void)cancelRouteCalculation {
     
    // Optional: you may not do this if you don't pass session elsewhere.
    if (session != nil) {
         
        [session cancel];
    }
 
    [self onSessionFinished];
}
 
- (void)onSessionFinished {
 
    session = nil;
    sessionListener = nil;
}
 
- (nullable instancetype)initWithSdk:(nonnull NMSdk *)sdk {
     
    if (self = [super init]) {
 
        routingServiceContainer = [[RoutingServiceContainer alloc] initWithSdk:sdk];
    }
 
    return self;
}
 
@end
 
@implementation SessionListener {
 
    __weak SimpleRouteCalculator *weakCalculator;
}
 
- (void)onRouteCalculationSucceededWithResult:(nonnull NMRouteCalculationResult *)result {
 
    // Route calculation succeeded: handling result.
     
    // Releasing session and listeners.
    SimpleRouteCalculator *calculator = weakCalculator;
    if (calculator != nil) {
 
        [calculator onSessionFinished];
    }
}
 
- (void)onRouteCalculationFailedWithInfo:(nonnull NMRouteCalculationFailureInfo *)failureInfo {
 
    // Route calculation failed: handling failure info.
     
    // Releasing session and listeners.
    SimpleRouteCalculator *calculator = weakCalculator;
    if (calculator != nil) {
 
        [calculator onSessionFinished];
    }
}
 
- (void)onNonFatalRouteCalculationErrorOccurred:(NMRouteCalculationError)error {
 
    // Non-fatal route calculation error occurred: handling it. Route calculation continues.
}
 
- (nullable instancetype)initWithWeakCalculator:(__weak SimpleRouteCalculator *)weakCalculator {
 
    if (self = [super init]) {
 
        self->weakCalculator = weakCalculator;
    }
 
    return self;
}
 
@end

CALCULATING ROUTES

CALCULATING A ROUTE USING ROUTE PLAN

Routing service allows to calculate new routes using the specified route plan. A route plan is a list of waypoints represented by instances of NMRoutePlanPoint class. A route plan should contain at least two points.

...

Code Block
languagecpp
titleSample: calculating route using route plan
collapsetrue
// ExtendedRouteCalculator.h
#import <Foundation/Foundation.h>
#import "SimpleRouteCalculator.h"
#import <NavmiiSDK/NMMapCoordinates.h>
#import <NavmiiSDK/NMPosition.h>
 
@interface ExtendedRouteCalculator : SimpleRouteCalculator
 
- (void)calculateRouteUsingRoutePlanCoords:(nonnull NSArray<NMMapCoordinates *> *)routePlanCoords
                                   options:(nullable NMRouteCalculationOptions *)options;
 
- (void)calculateRouteFromCurrentPosition:(nonnull NMPosition *)currentPosition
                     usingRoutePlanCoords:(nonnull NSArray<NMMapCoordinates *> *)routePlanCoords
                                  options:(nullable NMRouteCalculationOptions *)options;

@end

// ExtendedRouteCalculator.m
#import "ExtendedRouteCalculator.h"
 
@implementation ExtendedRouteCalculator
 
- (void)calculateRouteUsingRoutePlanCoords:(nonnull NSArray<NMMapCoordinates *> *)routePlanCoords
                                   options:(nullable NMRouteCalculationOptions *)options {
 
    NSArray<NMRoutePlanPoint *> *routePlanPoints = [ExtendedRouteCalculator pointsFromCoords:routePlanCoords];
 
    [self calculateRouteUsingRoutePlanPoints:routePlanPoints options:options];
}
 
- (void)calculateRouteFromCurrentPosition:(nonnull NMPosition *)currentPosition
                     usingRoutePlanCoords:(nonnull NSArray<NMMapCoordinates *> *)routePlanCoords
                                  options:(nullable NMRouteCalculationOptions *)options {
     
    NSArray<NMRoutePlanPoint *> *routePlanPoints = [NSArray arrayWithObject:[[NMRoutePlanPoint alloc] initWithPosition:currentPosition]];
    routePlanPoints = [routePlanPoints arrayByAddingObjectsFromArray:[ExtendedRouteCalculator pointsFromCoords:routePlanCoords]];
 
    [self calculateRouteUsingRoutePlanPoints:routePlanPoints options:options];
}
 
+ (nonnull NSArray<NMRoutePlanPoint *> *)pointsFromCoords:(nonnull NSArray<NMMapCoordinates *> *)routePlanCoords {
 
    NSMutableArray<NMRoutePlanPoint *> *routePlanPoints =
        [[NSMutableArray<NMRoutePlanPoint *> alloc] initWithCapacity:routePlanCoords.count]; 
 
    for (NMMapCoordinates *coords in routePlanCoords) {
 
        [routePlanPoints addObject:[[NMRoutePlanPoint alloc] initWithCoordinates:coords]];
    }
 
    return routePlanPoints;
}
 
@end

ROUTING SERVICE SETTINGS

As you can see in the examples above user is able to pass route calculation options within each routing service request. The specified options are used during request handling. If no options were passed default options are used. NMRouteCalculationOptions class instances represent available route calculation options.