RouteTask

Explore in the sandboxView live

This sample demonstrates the simplest use of the RouteTask finding a route between two points. Click the map to add stops to the route. When you've added two stops a route will be calculated. Adding subsequent stops extends the route.

When working with the Route Task, you set up RouteParameters, such as the stops, then call the RouteTask.solve() method when you're ready to find the route.

How it works

The routing service requires a token for authentication. This sample uses an apiKey to authenticate. You can either replace it with your own apiKey, or remove it and log in once prompted. Alternatively, you can use another authentication method to access the routing service.

The apiKey is defined in the RouteParameters to access the routing service.

                                                                                                                               
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
    <title>RouteTask | Sample | ArcGIS API for JavaScript 4.19</title>
    <style>
      html,
      body,
      #viewDiv {
        padding: 0;
        margin: 0;
        height: 100%;
        width: 100%;
      }

      #paneDiv {
        position: absolute;
        top: 10px;
        left: 62px;
        padding: 0 12px 0 12px;
        background-color: rgba(0, 0, 0, 0.5);
        color: white;
      }
    </style>

    <link rel="stylesheet" href="https://js.arcgis.com/4.19/esri/themes/light/main.css" />
    <script src="https://js.arcgis.com/4.19/"></script>

    <script>
      require([
        "esri/Map",
        "esri/views/MapView",
        "esri/Graphic",
        "esri/layers/GraphicsLayer",
        "esri/tasks/RouteTask",
        "esri/tasks/support/RouteParameters",
        "esri/tasks/support/FeatureSet"
      ], function(Map, MapView, Graphic, GraphicsLayer, RouteTask, RouteParameters, FeatureSet) {

        // Point the URL to a valid routing service
        var routeTask = new RouteTask({
          url: "https://route-api.arcgis.com/arcgis/rest/services/World/Route/NAServer/Route_World"
        });

        // The stops and route result will be stored in this layer
        var routeLayer = new GraphicsLayer();

        // Setup the route parameters
        var routeParams = new RouteParameters({
          // An authorization string used to access the routing service
          apiKey: "AAPKd6517aa887304b5891f6b959ea426015CLWBA2qIMPI4-vgwnS0B8RGRBVMArpJu0IN2BUL-G6GZ_aa8NF-r_JvSnsWp_A2M",
          stops: new FeatureSet(),
          outSpatialReference: {
            // autocasts as new SpatialReference()
            wkid: 3857
          }
        });

        // Define the symbology used to display the stops
        var stopSymbol = {
          type: "simple-marker", // autocasts as new SimpleMarkerSymbol()
          style: "cross",
          size: 15,
          outline: {
            // autocasts as new SimpleLineSymbol()
            width: 4
          }
        };

        // Define the symbology used to display the route
        var routeSymbol = {
          type: "simple-line", // autocasts as SimpleLineSymbol()
          color: [0, 0, 255, 0.5],
          width: 5
        };

        var map = new Map({
          basemap: "streets-navigation-vector",
          layers: [routeLayer] // Add the route layer to the map
        });

        var view = new MapView({
          container: "viewDiv", // Reference to the scene div created in step 5
          map: map, // Reference to the map object created before the scene
          center: [-117.195, 34.057],
          zoom: 13
        });

        // Adds a graphic when the user clicks the map. If 2 or more points exist, route is solved.
        view.on("click", addStop);

        function addStop(event) {
          // Add a point at the location of the map click
          var stop = new Graphic({
            geometry: event.mapPoint,
            symbol: stopSymbol
          });
          routeLayer.add(stop);

          // Execute the route task if 2 or more stops are input
          routeParams.stops.features.push(stop);
          if (routeParams.stops.features.length >= 2) {
            routeTask.solve(routeParams).then(showRoute);
          }
        }
        // Adds the solved route to the map as a graphic
        function showRoute(data) {
          var routeResult = data.routeResults[0].route;
          routeResult.symbol = routeSymbol;
          routeLayer.add(routeResult);
        }
      });
    </script>
  </head>
  <body>
    <div id="viewDiv"></div>
    <div id="paneDiv" class="esri-widget">
      <div>
        <p>
          Click on the map to add stops to the route. The route from the last stop to the newly added stop is
          calculated. If a stop is not reachable, then the last valid point is set as the starting point.
        </p>
      </div>
    </div>
  </body>
</html>

When the map is clicked, an event listener calls the function addStop(), which adds a SimpleMarkerSymbol at the location of the click as a stop. The function also add the point as stop in Route Parameter and check if 2 or more exists, route is solved by calling RouteTask.solve function and then pass the RouteParameter to the solve function.

          
function addStop(event) {
  var stop = new Graphic(event.mapPoint, stopSymbol);
  graphicsLayer.add(stop);
  routeParams.stops.features.push(stop);

  if (routeParams.stops.features.length >= 2) {
    routeTask.solve(routeParams).then(showRoute);
    lastStop = routeParams.stops.features.splice(0, 1)[0];
  }
}

Then solve method is called to perform the task synchronously. The solve method returns a promise which can be used with the .then() method to define a callback, in this case showRoute.

 
routeTask.solve(routeParams).then(showRoute);

The showRoute callback function obtains the routeResult stored within the result object, and the apply the SimpleLineSymbol for the route result symbology, then add the RouteResult to the map by adding it to graphic layer

     
function showRoute(data) {
  var routeResult = data.routeResults[0].route;
  routeResult.symbol = routeSymbol;
  graphicsLayer.add(routeResult);
}