0

我试图创建一条遵循我提供的 gps 跟踪的路线。gps 跟踪已清理,其中没有循环并且顺序正确。我用其他服务检查了它。它有1920点。您可以在GPX 文件中找到跟踪 遗憾的是,如果我根据提供的 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: $0) }
    
    // 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)
    }
}

在此处输入图像描述 在此处输入图像描述

相比之下,传单地图显示了相同的路线。

图4

在此处输入图像描述

4

1 回答 1

1

我相信您遇到的问题是您正在为 Routing API 提供大量航路点,所有这些航路点都彼此靠近。

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

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

首先,使用Route Matching API(我相信您一直在这样做)清理您的跟踪。

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

然后调用 Routing API,您应该会在跟踪和路由之间获得良好的匹配,没有任何循环或其他奇怪的路由伪影。

一些注意事项:

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

首先使用 Route Matching API 清理数据很重要,以避免选择异常值作为航点。

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

于 2020-06-29T13:06:03.960 回答