如何解决了解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"
}
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。