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

Gobichettipalayam - Kutti Kodambakkam

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...