使用Mapbox Direction API

时间:2018-06-02 18:27:36

标签: ios swift mapbox mapbox-gl directions

我一直在使用Mapbox为我的应用程序生成路线和转弯导航,并且它运行良好。但是我想避免通过路线的某些坐标,但我无法弄明白。

获取路线的代码:

Directions.shared.calculate(options) { [unowned self] (waypoints, routes, error) in
        // Take first route and customize it in a way to get around some coordinates
    }

以下是一个场景:

1-用户位置为latitude = 37.332331410000002, longitude = -122.0312186

2-用户将转到Santa Clara Unified School

上的latitude = 37.354100000000003,longitude = -121.9552

3- Api生成以下路线:

 [0] = {
latitude = 37.332329999999999
longitude = -122.03118000000001
}
  [1] = {
    latitude = 37.332619999999999
    longitude = -122.03118000000001
  }
  [2] = {
    latitude = 37.332609999999995
    longitude = -122.03097000000001
  }
  [3] = {
    latitude = 37.332609999999995
    longitude = -122.03076000000001
  }
  [4] = {
    latitude = 37.332199999999993
    longitude = -122.03076000000001
  }
  [5] = {
    latitude = 37.331689999999995
    longitude = -122.03076000000001
  }
  [6] = {
    latitude = 37.331689999999995
    longitude = -122.03190000000002
  }
  [7] = {
    latitude = 37.331719999999997
    longitude = -122.03199000000002
  }
  [8] = {
    latitude = 37.331759999999996
    longitude = -122.03205000000003
  } ...

4-假设生成的路线经过East Homestead Rd,我希望能够避开这条路并产生一条新路线,即使它更长。在下面的屏幕中避免路线为红色,因为经过东家园路(East Homestead Rd),沿着没有经过东家园路(East Homestead Rd)的最快路线行驶 enter image description here

任何帮助将不胜感激!

编辑:这是查询路线是否有要避免的点的查询

// $linestring is the array of coordinates from the route in the string format of (lng lat,lng2 lat2,lng3 lat3,lng4 lat4....)
$query = $this->em->createQuery('
            SELECT   count(i) as counter
            FROM     HitsBundle:Hit i
            WHERE i.datetime BETWEEN :lastMonth AND :now 
                  AND 
                  MBRCovers(
                    ST_Buffer( 
                        ST_GeomFromText(\'LineString('.$linestring.')\') ,
                        0.00001
                    ),
                    i.coordinates
                  ) = 1
            GROUP BY i.coordinates
            HAVING  counter > 1
        ')
            ->setParameter('lastMonth', $lastMonth)
            ->setParameter('now', new \DateTime())
            ->setMaxResults(1);

2 个答案:

答案 0 :(得分:3)

我可能在这里粗略猜测,但是通过Mapbox API,它在生成路由时没有任何选项可以避免,因此您需要在客户端实现一些路由选择逻辑。

基本上你需要有一个算法来获取一组要避免的点,并检查你的Route几何GeoJSON或Polyline是否在给定点的某个阈值范围内。如果是 - 丢弃路线(或较低的路线优先权)。

当然,如果Mapbox提供的所有路线都被丢弃,它可能无法找到路线 - Mapbox不知道您的限制,因此使用路线权重可以解决此问题。 < / p>

这些帖子可能会给你一些提示:

答案 1 :(得分:0)

在处理了MapBox Direction API几个月后,我们得出的结论是,对于此特定用例而言,它是不可靠的。使用Direction API计算从Point A到Point B的路线时,如果MapBox设置为true,则提供选项includesAlternativeRoutes,它将提供替代路线。但是,这是不一致的,并且在大多数情况下,它仅返回首选路由。

根据MapBox:

  

如果此属性的值为true,则服务器尝试查找访问路标的其他合理路线。无论如何,只有在可以通过另一条路线访问航点而不会显着增加距离或旅行时间的情况下,才返回多条路线。

因此我们将切换到Google Maps,因为此功能对我们的业务逻辑至关重要。