我正在使用 Here SDK 在 Xcode 中开发一个 iOS 项目。我正在使用高级版(v3.17)。使用 计算路线时NMACoreRouter
,我发现持续时间通常被高估。多少取决于国家。
示例(与 Google Maps 估计相比):
- 在墨西哥,与谷歌地图相比,一条以高速公路为主的路线被高估了 25%。
- 在德国,一条以高速公路为主的路线与谷歌地图相比被高估了 5%
- 在美国,与谷歌地图相比,一条以高速公路为主的路线被高估了 10%。
请注意,谷歌地图考虑了流量,而我没有考虑 HERE SDK 的流量,因此实际差异会更大。
如何减少/降低 HERE Maps SDK 中的路线持续时间估计?
我尝试过的事情:
routingMode
ofNMACoreRouter
有一个speedProfile
可以设置为的属性NMASpeedProfile.fast
,但是这仅适用于卡车路线,并且在将此值用于汽车路线时会导致崩溃。所以,不是我的应用程序的选项。的
dynamicPenalty
属性NMACoreRouter
:有了这个,基本上你为一个数组设置了一个自定义的速度限制NMARoadElement
。我为此创建了这个扩展:extension NMACoreRouter { func adjustDurationCalculationFor(roadElements: [NMARoadElement], factor: Float) { self.dynamicPenalty = nil let penalties = NMADynamicPenalty() for roadElement in roadElements { if roadElement.speedLimit > 0 { penalties.addPenalty(for: roadElement, drivingDirection: .both, speed: UInt(roadElement.speedLimit*3.6*factor)) } } self.dynamicPenalty = penalties } }
但是这带来了一个困难:要使 speedLimit 调整生效,dynamicPenalty
需要在计算路线之前设置。因此,在计算路线之前,您需要知道要为其调整 speedLimit 的 roadElements。我为此找到了两种解决方案:
路线边界框中的所有 NMARoadElements(在我的应用程序中,我在计算之前知道路线上的关键点,并且可以使用这些点来获取边界框)
let roadElements = self.mapView.roadElements(inArea: boundingBoxContainingTheRouteKeyPoints) self.coreRouter.adjustDurationCalculationFor(roadElements: roadElements, factor: 0.75)
但这似乎不起作用。无论是否设置惩罚,我都会得到相同的持续时间。最重要的是,缺点:设置那么多 roadElements 需要很长时间dynamicPenalty
(在 iPhone 12 Pro 上大约需要 20-30 秒,对于大约 50 公里乘 100 公里的边界框)。
- 先计算路线,不使用dynamicPenalty。从计算得到的 NMARoute 中,可以推导出路由中的 NMARoadElements。调用
adjustDurationCalculationFor
这些元素,然后重新计算路线。
我没有尝试过这个,但我想它有同样的问题,它不像 nr 1 那样工作,报告的持续时间是相同的,有或没有调整速度限制。如果它有效,那么这可能是比 1 更好的选择,因为 NMARoadElements 的数量要小得多,因此设置“dynamicPenalty”也会快得多。但是,这带来了一个缺点: - 路线计算需要进行两次,在导航期间,当用户偏离路线并且需要重新计算路线时也是如此。
所以现在,我的问题是,有没有更好的方法来减少/降低路线持续时间估计?dynamicPenalty的API 文档提到
...您可以使用此类设置区域惩罚,以指示某个区域的行驶速度比法定速度限制慢 50%。
怎么做呢?
还是有另一种我还没有找到的方法?当 NMARoadElement 的速度限制未知时,是否可能使用某种可配置的后备值?