Skip to content

Advanced ETA

Available in CoPilot 10.9 and higher

Advanced ETA is a licensed add-on feature that allows you to compute ETA with greater accuracy to help keep drivers on schedule and to provide better delivery estimates for customers. Advanced ETA lets you include more information about each stop when generating a route, including:

  • Custom display information on the driver’s device. You can provide the driver with a custom note about the stop and a unique company ID and icon to identify the stop. You can also display custom information under the chevron that shows the driver where he or she is on the map.

  • Specialized routing settings. You can set side-of-street routing to ensure the route generated by CoPilot takes the driver to the stop on the same side of the street as the direction of travel.

  • Time-window settings. You can set a time window for the earliest and latest time a stop should be reached as well as a planned duration (dwell time) for the stop to enhance ETA for the following stop.

Create a Stop with StopBuilder

Advanced ETA settings are available through additional, optional methods when a stop is created via a StopBuilder object. The added methods include:

Method Name Return Type Description
setID(String) StopBuilder Sets a custom ID for the stop.
setNote(String) StopBuilder Sets a custom note against the stop that will be shown on the stop details screen within the CoPilot UI.
setEarliestArrivalTime (ArrivalTimeWindowInfo) StopBuilder Sets the earliest acceptable arrival time when the stop can be reached. If no date is given, the current date will be used. (There will be a callback notification if the ETA is outside of that time window.) This method is optional but, if used, setLatestArrivalTime and setPlannedDuration need to be used also.
setLatestArrivalTime (ArrivalTimeWindowInfo) StopBuilder Sets the latest arrival time for the time window during which the stop should be reached. If no date is given, the current date will be used.
setPlannedDuration(int) StopBuilder Sets the planned duration for the stop. This should reflect all the non-driving (dwell) time at the stop.
setSideOfStreetAdherence(StopSideAdherenceLevel) StopBuilder Sets side-of-street adherence for the stop.
setCustomFields (HashMap<String,String> customFields) StopBuilder Sets custom fields for the stop.
setIcon StopBuilder Sets the stop icon image. Name of the image should be passed. An image with the matching name must be saved in the CoPilot directory under the “skin” folder.

Sample Code

StopBuilder latLonStop = StopBuilder.fromLatLon(new Coordinate(40.368420, -74.655036));
ArrivalTimeWindowInfo startWindow = new ArrivalTimeWindowInfo(22, 5, 2018, 780);
ArrivalTimeWindowInfo endWindow = new ArrivalTimeWindowInfo(22, 5, 2018, 840);
latLonStop.setID("This is ID");
latLonStop.setNote("This is note");
HashMap<String,String> customFields = new HashMap<String,String>();
customFields.put("CUSTOMCHEVRONDISPLAY", "This is custom chevron message");
try {
  Stop sampleStopA = latLonStop.setName("Trimble MAPS").geocode(GeocodeSearchType.BEST_MATCH).get(0);
} catch (GeocodingException e)
NSError *error = nil;
Coordinate *coordinate =
[[Coordinate alloc] initWithLatLon:40.368420 withLon:74.655036];
StopBuilder *stopBuilder = [StopBuilder fromLatLon:coordinate];
ArrivalTimeWindowInfo* startWindow = [[ArrivalTimeWindowInfo alloc] initWith:22 withMonth:5 withYear:2018 withMinutesFromMidnight:780];
ArrivalTimeWindowInfo* endWindow = [[ArrivalTimeWindowInfo alloc] initWith:22 withMonth:5 withYear:2018 withMinutesFromMidnight:840];
stopBuilder.arrivalWindowStart = startWindow;
stopBuilder.arrivalWindowEnd = endWindow;
stopBuilder.plannedDuration = 12;
stopBuilder.ssal = CP_SSAL_MODERATE;
stopBuilder.stopid = @This is ID;
stopBuilder.note = @This is note;
NSMutableDictionary* customFields = [[NSMutableDictionary alloc] init];
[customFields setObject:@CUSTOMCHEVRONDISPLAY forKey:@"This is custom chevron message"];
stopBuilder.customFields = customFields;
stopBuilder.icon = @myStopIcon;
NSArray *stop = [stopBuilder geocode:BEST_MATCH withError:&error];

Get Stop Information

The current ETA for the stop can be retrieved via additional methods in a Stop object. You can also get information entered about the stop, as well as additional information, such as the side of the street the stop is on. These methods include:

Method Name Return Type Description
getID() String Gets the Stop ID for the the stop object.
getNote() String Gets the note associated with the stop object.
getEarliestArrivalTime() ArrivalTimeWindowInfo Gets the optional early time for the time window where a stop should be reached.
getLatestArrivalTime() ArrivalTimeWindowInfo Gets the latest time for the time window where a stop should be reached.
getPlanned DurationMinutes() int Gets the expected Dwell/Wait time that is added to a stop.
getSideOfStreet() StopSide Gets the side of the street that the stop is on.
getSideOfStreetAdherence() StopSideAdherenceLevel Gets the side of street adherence level that the routing uses to calculate its route to this stop.
getETA() String Gets the current ETA for this stop.
getCustomFields() Hashmap Gets a Hashmap of the optional custom fields for this stop.
getIcon() String Get the stop icon image name for the stop object.
getTimeZoneOffset() int Get time zone offset for the stop object.

Stay Informed About Arrival Times

With the additional stop information, Advanced ETA can calculate whether a driver is early, on time, late or at risk of being late for a stop. It can then create a callback when the driver's stop status changes for a particular stop—for example, from “on time” to “at risk” of being late. The callback is also called when a new trip containing advanced ETA information is sent to CoPilot. CoPilot returns the status of each stop, and you should wait for this callback before retrieving the ETA from a stop.

The onStopArrivalStatusChange callback returns a list of stops who status have been changed.

If you would like to optimize your stop order to better meet all time windows, we recommend using our Advanced Route Optimization add-on feature.

Last update: November 13, 2020