Skip to content

Routing

In this guide you will learn how to compute a route from a departure point to a destination point and display the route length in kilometers, and duration in hours:minutes as text on screen.

Setup

First, get an API key token, see the Getting Started guide.
Download the Maps & Navigation SDK for Android archive file

Download the Routing project archive file or clone the project with Git

See the Configure Android Example guide.

Run the example

In Android Studio, from the File menu, select Sync Project with Gradle Files

Routing with text output example Android screenshot

An android device should be connected via USB cable.
Press SHIFT+F10 to compile, install and run the example on the android device.

How it works

Android example screenshot

You can open the MainActivity.kt file to see how the route is computed and the statistics of the computed route are displayed.

 1private val routingService = RoutingService(
 2     onStarted = {
 3         progressBar.visibility = View.VISIBLE
 4     },
 5     onCompleted = onCompleted@{ routes, errorCode, _ ->
 6         progressBar.visibility = View.GONE
 7         when (errorCode) {
 8             GemError.NoError -> {
 9                 if (routes.size == 0) return@onCompleted
10                 // Get the main route from the ones that were found.
11                 displayRouteInfo(formatRouteName(routes[0]))
12             }
13             GemError.Cancel -> {
14                 // The routing action was canceled.
15             }
16             else -> {
17                 // There was a problem at computing the routing operation.
18                 Toast.makeText(
19                     this@MainActivity,
20                     "Routing service error: ${GemError.getMessage(errorCode)}",
21                     Toast.LENGTH_SHORT
22                 ).show()
23             }
24         }
25     }
26)

A RoutingService() is instantiated, to compute a route, with an onStarted and an onCompleted listener, to receive notifications from the routing service when a route computation starts and when it is completed.

1private fun calculateRoute() = SdkCall.execute {
2     val wayPoints = arrayListOf(
3         Landmark("Frankfurt am Main", 50.11428, 8.68133),
4         Landmark("Karlsruhe", 49.0069, 8.4037),
5         Landmark("Munich", 48.1351, 11.5820)
6     )
7     routingService.calculateRoute(wayPoints)
8}
The starting, or departure point of the route is the first waypoint in a list of 2 or more Landmarks (3 in this case), each containing a name, latitude (in degrees) and longitude (in degrees). The destination point is the last waypoint in the list.
The calculateRoute() function passes the list of waypoints to the routing service to calculate the route: routingService.calculateRoute(wayPoints).
 1override fun onCreate(savedInstanceState: Bundle?) {
 2     super.onCreate(savedInstanceState)
 3     setContentView(R.layout.activity_main)
 4     progressBar = findViewById(R.id.progressBar)
 5
 6     SdkSettings.onMapDataReady = onMapDataReady@{ isReady ->
 7         if (!isReady) return@onMapDataReady
 8         // Defines an action that should be done after the world map is updated.
 9         calculateRoute()
10     }
11     SdkSettings.onApiTokenRejected = {
12         Toast.makeText(this, "TOKEN REJECTED", Toast.LENGTH_LONG).show()
13     }
14     if (!GemSdk.initSdkWithDefaults(this)) {
15         // The SDK initialization was not completed.
16         finish()
17     }
18     if (!Util.isInternetConnected(this)) {
19         Toast.makeText(this, "You must be connected to internet!",
20             Toast.LENGTH_LONG).show()
21     }
22}
The MainActivity overrides the onCreate() function which checks that internet access is available, and then, when the map is instantiated and ready (although the map is not rendered in this example), starts the route calculation: calculateRoute().
1private fun displayRouteInfo(routeName: String) {
2     findViewById<TextView>(R.id.text).text = routeName
3}
The routingService listener above receives the onCompleted notification when the route computation is complete, and if there is at least one resulting route, then it takes the first route in the list (at index 0) and calls displayRouteInfo(formatRouteName(routes[0])) to print the route length in kilometers and duration in hours:minutes as text on screen.
The route statistics text printed by displayRouteInfo() is formatted by formatRouteName():
 1private fun formatRouteName(route: Route): String = SdkCall.execute {
 2     val timeDistance = route.timeDistance ?: return@execute ""
 3     val distInMeters = timeDistance.totalDistance
 4     val timeInSeconds = timeDistance.totalTime
 5     val distTextPair = GemUtil.getDistText(
 6         distInMeters,
 7         SdkSettings.unitSystem,
 8         bHighResolution = true
 9     )
10     val timeTextPair = GemUtil.getTimeText(timeInSeconds)
11     var wayPointsText = ""
12     route.waypoints?.let { wayPoints ->
13         for (point in wayPoints) {
14             wayPointsText += (point.name + "\n")
15         }
16     }
17     return@execute String.format(
18         "$wayPointsText \n\n ${distTextPair.first} ${distTextPair.second} \n " +
19             "${timeTextPair.first} ${timeTextPair.second}"
20     )
21} ?: ""

Android Examples

Maps SDK for Android Examples can be downloaded or cloned with Git