Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Avoid coordinates when generating a route using Mapbox Direction API

I have been using Mapbox for my app to generate route and turn-by-turn navigation and it's working well. However I would like to avoid to go through some coordinates of the route but I can't figure it out.

The code to get the route :

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

Here is a scenario :

1- User location is latitude = 37.332331410000002, longitude = -122.0312186

2- The user is going to Santa Clara Unified School located on latitude = 37.354100000000003,longitude = -121.9552

3- The Api generates the following route :

 [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- Suppose the generated route goes through East Homestead Rd, I would like to be able to avoid this road and generate a new route even if it's a longer one.In the screen below avoid the route in red because going through East Homestead Rd and take the next fastest route not going through East Homestead Rd enter image description here

Any help would be appreciated !

EDIT : Here is the query for finding if a route has points to avoid in it

// $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);

EDIT: Related issue on Github

like image 888
113408 Avatar asked Jun 02 '18 18:06

113408


People also ask

How do I show directions in Mapbox?

Ready to get started? Create a free account to start building with Mapbox. Use the mapbox-gl-directions plugin to show results from the Mapbox Directions API. Click the map to add an origin and destination, and use the toggle to switch among the available routing profiles.

Is Mapbox better than Google Maps?

Both Google Maps and Mapbox support the idea of customization, but customization is the main strength of Mapbox. Google map is a bit strict or we can say less flexible when it comes to customization. Google Maps enforce you to use its default base layer, on the other hand, there is no such restriction on Mapbox.


1 Answers

I may be rough-guessing here, but looking through Mapbox API it does not have any options to avoid while generating routes, therefore you need to implement some route-selection logic on client-side.

Basically you need to have an algorithm which gets a set of points to avoid and checks if your Route geometry GeoJSON or Polyline are within some threshold range from given points. If it is - discard the route (or lower route priority).

Of course it may fail to find a route if all routes provided by Mapbox are discarded - Mapbox does not know about your restrictions, therefore using weight for routes could be one option of solving this.

These posts might give you some hints:

  • Is it possible to determine if a GeoJSON point is inside a GeoJSON polygon using JavasScript
  • How to check if a Latitude/Longitude point is on the GRoute in Google Maps API
like image 92
gp42 Avatar answered Sep 28 '22 10:09

gp42