了解Here Map iOS SDK中的错误代码

问题描述

我正在使用Here Map iOS SDK版本3.16.3 我正在使用Here地图绘制具有多个航路点的路线。在路线中计算ETA时,出现错误 NMARoutingErrorViolatesOptions 。当我在 NMARouteResult 类中进行进一步检查时,该类中的属性 violatedOptions 将在数组中返回 4096 。请在下面找到 violatedOptions 属性的评论。

  /**
    * NSArray of NSNumber objects,one per route calculated,* representing which options (if any) were violated for the
    * corresponding route. The NSNumber objects should be converted to
    * NSUInteger before checking. The value will be an OR combination of
    * NMARoutingOption and `NMARoutingViolatedOption` values,or
    * NMARoutingViolatedOptionNone if no options were violated. If route calculation
    * failed,the array will contain a single object containing all the routing
    * options (if any).
    */
    
     @property (nonatomic,readonly,nullable) NSArray <NSNumber *> *violatedOptions;

我已将 NMACoreRouter 对象中的路由选项设置为 NMARoutingOptionAvoidBoatFerry

NMARoutingOptionAvoidBoatFerry = 1

下面是违反选项的枚举,我正在尝试查找在路线中发生的确切错误。

/**
 * Implicit routing options that may be violated by routing calculation operations.
 *
 * @note Violations which depend on traffic data (e.g. BlockedRoad) will only be returned if
 * the traffic feature is available.
 */
// The violatedOptions value returned from NMARouter will be an OR
// combination of NMARoutingOption and NMARoutingViolatedOption values. Thus the
// NMARoutingViolatedOption values offset from a larger value to leave room
// for NMARoutingOption values to grow in the future.
typedef NS_OPTIONS(NSInteger,NMARoutingViolatedOption) {
    /** The returned route does not violate any options */
    NMARoutingViolatedOptionNone NS_SWIFT_NAME(none)                       = 0,/** The route passes through a blocked road (e.g. due to construction or a traffic accident) */
    NMARoutingViolatedOptionBlockedRoad NS_SWIFT_NAME(blockedRoad)         = 1 << 12,/** The route passes through a road with a time-based turn restriction */
    NMARoutingViolatedOptionTurnRestriction NS_SWIFT_NAME(turnRestriction) = 1 << 13,/** The route's start direction is not as requested */
    NMARoutingViolatedOptionStartDirection NS_SWIFT_NAME(startDirection)   = 1 << 14,/** The route uses roads or turns which are permanently forbidden for given truck */
    NMARoutingViolatedPermanentTruckRestriction                            = 1 << 15,/** The route uses roads that belong to restricted areas. */
    NMARoutingViolatedOptionZoneRestriction NS_SWIFT_NAME(zoneRestriction) = 1 << 16
};

因为4096的二进制代码是1000000000000 = 1

从NMARouter返回的strictedOptions值将为OR NMARoutingOption和NMARoutingViolatedOption值的组合。 因此,NMARoutingViolatedOption值从较大的值偏移为 为将来的NMARoutingOption值增长留有空间。

1

这是获取NMARoutingViolatedOption值的正确逻辑吗? NMARoutingViolatedOption 值均不适用于上述逻辑。谁能帮助我更好地理解这一点?

解决方法

您可以像这样检查违反的错误:

目标-C:

NSInteger violatedOption = [routeResult.violatedOptions[0] integerValue];

if (violatedOption & NMARoutingViolatedOptionBlockedRoad) {
      // handle blocked road violated option (4096)
}

斯威夫特:

guard let violatedOption = routeResult?.violatedOptions?.first?.intValue else { return }

if (violatedOption & NMARoutingViolatedOption.blockedRoad.rawValue) != 0 {
      // handle blocked road violated option (4096)
}
,

@dashchark 答案的补充:

violatedOptions 还可以包含一个或多个“NMARoutingOption”选项,计算出的路由不满足这些选项。 所以还要检查 NMARoutingOption 的所有可能的枚举值

斯威夫特:

guard let violatedOption = routeResult?.violatedOptions?.first?.uintValue else { return }

if (violatedOption & NMARoutingOption.avoidTunnel.rawValue) != 0 {
    // route does not satisfy the route option "avoid tunnel"
}

if (violatedOption & NMARoutingOption.avoidTollRoad.rawValue) != 0 {
    // route does not satisfy the route option "avoid tunnel"
}
...

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...