Calculating Toll for a Route

This article explains how to calculate the toll price of a routeClosed A route corresponds to a path of a vehicle through the underlying transport network. The main attributes of a route are the distance and the time that the vehicle travels along the path..

Benefits

  • Obtain a precise price for the toll to be paid for a given route and for each leg of the route.
  • If detailed toll data is available each single price to be paid with detailed meta information can be returned.
  • If forecast data is available planned prices for the future can be calculated.

Prerequisites

  • A PTV map containing toll data.
  • The example below requires a map with toll data for the Newport Bridge in Rhode Island, USA.
  • A valid license for the key toll.

Configuration

The sections result field is set automatically. The general toll result field to retrieve at least the summary is always set to true.

Programming Guide

Here is an example for the calculation of toll. The function determineTollDetails sends a request to dataInformation and extracts the following information:

  • The toll detail level: If the map contains at least some detailed toll data, then some toll cost result fields are set to true.
  • The list of available electronic toll collection subscriptions: It is slightly modified and then passed to the route request.

var referenceTime = "2019-05-13T10:00:10+01:00"; var hasDetailedToll = false; var etcSubscriptions = "NONE"; // Determine the toll detail level and get the available values for the electronic toll collection subscriptions function determineTollDetails() { var urlPath = xServerUrl + '/services/rest/XRuntime/experimental/dataInformation'; $.ajax(urlPath).always(function(response){ if (response) { if (response.mapFeatures.tollFeatures) { if (response.mapFeatures.tollFeatures.detailLevel == "DETAILED" || response.mapFeatures.tollFeatures.detailLevel == "MIXED") { hasDetailedToll = true; } if (response.mapFeatures.tollFeatures.electronicTollCollectionSubscriptions) { etcSubscriptions = response.mapFeatures.tollFeatures.electronicTollCollectionSubscriptions; noneIdx = etcSubscriptions.indexOf('NONE'); if (noneIdx >= 0) { etcSubscriptions.splice(noneIdx, 1); } etcSubscriptions = etcSubscriptions.toString(); } } } }); }; determineTollDetails(); var A = { "$type": "OffRoadWaypoint", "location": { "offRoadCoordinate": { "x": -71.4425823, "y": 41.5492741 } } }; var B = { "$type": "OnRoadWaypoint", "location": { "coordinate": { "x": -71.3055992, "y": 41.5010570 } } }; xroute.calculateRoute({ "storedProfile": "truck11_99t.xml", "requestProfile": { "vehicleProfile": { "electronicTollCollectionSubscriptions": etcSubscriptions, } }, "waypoints": [A, B], "routeOptions": { "timeConsideration": { "$type": "ExactTimeConsiderationAtStart", "referenceTime": referenceTime }, "tollOptions": { "useDetailedToll": hasDetailedToll } }, "resultFields": { "toll": { "enabled": true, "sections": hasDetailedToll } } }, routingCompleted); function routingCompleted(route, exception) { var result = route.distance + 'm in ' + route.travelTime + 's,'; if (route.toll.summary && route.toll.summary.costs && route.toll.summary.costs.length > 0) { result += ' total toll price '; for (costIdx = 0; costIdx < route.toll.summary.costs.length; costIdx++) { result += route.toll.summary.costs[costIdx].amount + ' ' + route.toll.summary.costs[costIdx].currency; if (costIdx + 1 < route.toll.summary.costs.length) result += ', '; } if (route.toll.sections) { result += ' summed up over ' + route.toll.sections.length + ' section(s)'; var numberOfPrices = 0; for (sectionIdx = 0; sectionIdx < route.toll.sections.length; sectionIdx++) { if (route.toll.sections[sectionIdx].alternativeCosts) numberOfPrices += route.toll.sections[sectionIdx].alternativeCosts.length; } result += ' with ' + (1 + numberOfPrices) + ' different price(s)'; } } else result += ' WITHOUT toll. If you are running the unmodified example check the prerequisites and configuration above.'; print(result); }

Related Topics

The following topics might be relevant for this use case.