这里 API:Swift。奇怪的行为:路线中的循环 - 创建基于 GPS 轨迹的路线会产生循环。 / 直通 waypoints

HERE API:Swift. Wierd behaviour : Loops in a route - Creating a route based on GPS trace creates loops. / passthrough waypoints

我正在尝试创建一条遵循我提供的 GPS 轨迹的路线。 gps 跟踪已清理,其中没有循环并且顺序正确。 我用其他服务检查过它。 它有1920点。 您可以在此处找到跟踪 GPX Files 遗憾的是,如果我根据提供的 sdk 示例 (github) 创建路由,我的路径就会出现循环。

我希望你能帮我解决以下问题:

  1. 如何在使用 HERE ios Swift SDK

    创建路由时避免循环
  2. 我如何设置路线选项以遵循提供的点阵列而不是创建最快或平衡的路线。

因为我在 Ios sdk 中找不到这些函数,所以我使用了额外的 REST API 来稍微过滤一下路线,以删除所有根据此处地图未正确匹配的点...在绘制路线之前.. 即一切概率低、警告、距离道路很远...但结果仍然不好。这是一个清理过的文件。原始文件通过 HERE 地图映射/运行 一次后正在创建该文件。在此文件中,所有置信度低或产生警告或与原始点距离较远的点都被删除。这是我用来创建路线的路线,它仍然存在相同的问题,例如循环和奇怪的转弯。

非常感谢您! BR.

到目前为止我有这个代码:

private lazy var router = NMACoreRouter()



 @objc func do_routing_stuff( gps_trace :[NMAWaypoint]) {
    var stops = [Any]()
    stops = gps_trace
    

    let routingMode = NMARoutingMode(routingType: .fastest,
                                     transportMode: .car,
                                     routingOptions: .avoidHighway)
    
    // Trigger the route calculation
           router.calculateRoute(withStops: stops ,
                                      routingMode: routingMode)
           { [weak self] routeResult, error in
               guard error == .none else {
                   self?.showMessage("Error:route calculation returned error code \(error.rawValue)")
                   return
               }

               guard let result = routeResult, let routes = result.routes, routes.count > 0 else {
                   self?.showMessage("Error:route result returned is not valid")
                   return
               }

               // Let's add the 1st result onto the map
               self?.route = routes[0]
               self?.updateMapRoute(with: self?.route)

              // self?.startNavigation()
           }
    
}

private func updateMapRoute(with route: NMARoute?) {
    // remove previously created map route from map
    if let previousMapRoute = mapRoute {
        mapView.remove(mapObject:previousMapRoute)
    }
    
    guard let unwrappedRoute = route else {
        return
    }
    
    mapRoute = NMAMapRoute(unwrappedRoute)
    mapRoute?.traveledColor = .clear
    _ = mapRoute.map{ mapView?.add(mapObject: [=12=]) }
    
    // In order to see the entire route, we orientate the
    // map view accordingly
    if let boundingBox = unwrappedRoute.boundingBox {
        geoBoundingBox = boundingBox
        mapView.set(boundingBox: boundingBox, animation: .linear)
    }
}

比较相同的路线与传单地图。

我认为您遇到的问题是您正在为路由 API 提供大量 waypoints,所有这些都彼此靠近。

您的 GPX 文件中有将近 2000 waypoints(在您清理后的文件中约有 1300 个)。这些 waypoints 中的每一个都与最近的邻居 不到 10 米 距离。这不是路由 API 真正设计用于处理的数据类型。

我已经对您的 GPX Trace 进行了试验,并提出了以下解决方案:只需跳过您的跟踪中的一堆坐标。

首先,使用 Route Matching API(我相信你一直在做)清理你的踪迹。

其次,选择 GPX 文件中的第一个 trkpt 作为路由调用的第一个航路点。然后跳过接下来的 20 个点。选择以下 trkpoint 作为第二个路径点。重复此操作,直到到达文件末尾。然后在轨迹中添加最后一个 trkpt 作为最终航路点。

然后调用路由 API,您应该可以很好地匹配跟踪和路由,没有任何环路或其他奇怪的路由人工制品。

一些注意事项:

我选择了 20 作为要跳过的轨迹数,因为这会在每个航路点之间放置大约 200 米。这应该足够接近以确保 Routing API 不会偏离跟踪路线太多。对于较大的迹线,您可能希望增加该数字。对于有很多备选路线的城市环境中的痕迹,您可能需要使用较小的数字。

首先使用路由匹配 API 清理数据很重要,以避免选择异常值 waypoints。

此外,您可能不希望使用“avoidHighways”选项。鉴于您的用例,这似乎没有任何好处,而且我认为它会导致其他问题。

现在你可能已经解决了,但你的 waypoints 可能会降落在你的路线沿线的桥梁或隧道上,而不是在你想要的道路上。 IE。航路点本应位于桥下的道路上,但路由引擎认为您要在桥上行驶。 路由引擎在这些道路上循环,将您带到桥上或隧道中的那个航路点。 我没有找到简单的解决方案。