Skip to main content

Implementing Turn-by-Turn Navigation with the GraphHopper Routing Engine

 Introduction to Turn-by-Turn Navigation

Turn-by-turn navigation is a feature that guides users through a journey step-by-step using voice or visual prompts. It is typically found in GPS navigation apps and can be used for driving, walking, and biking.

When it comes to the actual implementation, turn-by-turn navigation utilizes several technologies such as GPS, maps, and routing algorithms to guide users along the best route to their destination.

In this article, we will explore the implementation of turn-by-turn navigation using the GraphHopper library and OpenStreetMap data.

Understanding the GraphHopper Routing Engine

GraphHopper Routing Engine is an open-source routing library that allows developers to calculate efficient routes for various transportation modes, such as cars, bikes, and walking. It utilizes OpenStreetMap data to generate a routing graph, which is then used to calculate the fastest or shortest routes between two points.

GraphHopper is written in Java and can be integrated with other programming languages through its RESTful web API. It can be run on-premises or in the cloud and can be customized to suit the needs of a specific application.

GraphHopper can be used in two ways: as a library and as a web service.

GraphHopper as a library

When using GraphHopper as a library, the routing calculations are performed on the user's device. This means that the library must be integrated into the navigation application and that the routing graph must be preprocessed and stored locally on the device

This approach allows for offline routing, as the routing calculations can be performed without an internet connection

However, it also means that the device must have enough storage space to store the routing graph, which can be quite large.

GraphHopper as a web service

The routing calculations are performed on a remote server. This means that the navigation application sends a request to the server with the start and end points, and the server sends back the calculated route.

This approach does not require the routing graph to be stored locally, as it is stored on the server. However, it does require an internet connection for the routing calculations to be performed.

Sample implementation using GraphHopper as a library

Graphhopper uses Open Street Map (OSM) data to calculate routing. These data can be downloaded either for the entire world or for a specific region.

The OSM data which is used in this example is downloaded from geofabrik.de

  1. Initialize the GraphHopper routing engine with the OSM data file:
    
    		GraphHopper hopper = new GraphHopper();
    		hopper.setOSMFile("D://Downloads/southern-zone-latest.osm.pbf");
    		hopper.setGraphHopperLocation("D://Downloads/graphhopper/");
    		hopper.setProfiles(new Profile("car"));
    		hopper.importOrLoad();
    
  2. Create 'GHRequest' object to specify the parameters for a routing request, such as the starting and ending points, vehicle type, and routing options.
    
    		GHRequest request = new GHRequest();
    		GHPoint from = new GHPoint(11.4549, 77.4365);
    		GHPoint to = new GHPoint(11.5294, 77.4530);
    		request.addPoint(travelPointsMock.get(0));
    		request.addPoint(travelPointsMock.get(travelPointsMock.size() - 1));
    		request.setProfile("car");
  3. Calculate the route
    
    		GHResponse response = hopper.route(request);
    
  4. Get the Turn By Turn instrcutions from the best route
    ResponsePath path = response.getBest();Translation tr = hopper.getTranslationMap().getWithFallBack(Locale.UK);
    InstructionList instructions = path.getInstructions();
    for (Instruction instruction : instructions) { 
    System.out.println(instruction.getTurnDescription(tr) + ", in Distance "); 
    }
    

Further Enhancements 

This is just a sample implementation of exploring the GraphHopper routing engine, which demonstrates how to obtain turn-by-turn navigation instructions. It can be further extended to check whether the current turn has been reached, and if so, display the next turn instruction.

We can iterate through the list of instructions, and check the distance of each instruction to the current location. If the distance is less than a certain threshold, we can consider that we have reached the turn.

The complete program is available in the Github link.

Comments

Popular posts from this blog

Test Driven Development

What is Test Driven Development (TDD)? TDD is a process of writing the test code before writing the functional code. In the TDD the tests are developed even before implementing the feature. At the first level the test will fail because we are not yet implemented the functional code. To make the test pass, we need to implement the functional code. TDD workflow The TDD follows the flow of "Red, Green, Refactor"     Identify the smallest behavior of the application and add the test     The test may fail     Write the functional code to make the test pass     Run the test case and make sure the tests pass     Refactor the code, if required     Repeat the process for the complete application behaviors Flow diagram for Test Driven Development (TDD)   Advantage of TDD     Early bug identification     Good understanding of code     Be...

Android application test automation

Test automation for mobile applications  In the mobile application development, testing plays the major role to ensure the quality.  The test automation process helps to speed up the testing process while doing the more regressions. In this article, we are going to see about the Appium test framework and how it is used to automate the Android application testing. What is Appium? Appium is an open-source framework that allows QAs to conduct automated app testing on different platforms like Android, iOS, and Windows. Appium frameworks allows to create a test scripts in different programming languages like Java,C,C#. Architecture Appium is a node.js webserver it contains the implementation of Selenium webdriver and REST API. Source:  nishantverma.gitbooks.io Appium client libraries Appium provides the client libraries in different programming languages. These client libraries are used in the test scripts to fire the test.  Appium client library communicates with the App...