I want to calculate the shortest route from one to many places with coordinates (latitude, longitude).
The question is now how to apply the Graphhopper library for coordinates with given latitude/longitude.
For example with the coordinates of some given cities (start place is Berlin), Berlin, Hamburg, Bielefeld, Dortmund, Essen, Bonn, Frankfurt, Trier and Paderborn, one route is: Berlin -> Hamburg -> Bielefeld -> Paderborn -> Dortmund -> Essen -> Bonn -> Trier -> Frankfurt
Solution without Graphhopper
public class RouteHelper {
public static Map<String, Coordinates> globalCoordinatesMap = null;
public static List<Integer> globalShortestRoute = null;
public static double globalActualRouteDistance = 0.0;
public static void shortestRouteByPermutation(int[] a, int k) {
if (k == a.length) {
double aDistanceOfRoundTrip = calculateDistance(a);
if(aDistanceOfRoundTrip < globalActualRouteDistance || globalShortestRoute == null) {
globalActualRouteDistance = aDistanceOfRoundTrip;
updateGlobalShortestRoute(a);
}
}
else {
for (int i = k; i < a.length; i++) {
int temp = a[k];
a[k] = a[i];
a[i] = temp;
shortestRouteByPermutation(a, k + 1);
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
}
private static void updateGlobalShortestRoute(int[] a) {
globalShortestRoute = new ArrayList<Integer>();
for(int i=0; i<a.length; i++) {
globalShortestRoute.add(a[i]);
}
}
private static double calculateDistance(int[] a) {
double distance = 0.0;
for(int i=0; i<a.length; i++) {
if(i==0 || i==a.length-1) {
distance = distance + distanceBetweenTwoCoordinates(globalCoordinatesMap.get(String.valueOf(0)), globalCoordinatesMap.get(String.valueOf(a[i])));
} else {
distance = distance + distanceBetweenTwoCoordinates(globalCoordinatesMap.get(String.valueOf(a[i])), globalCoordinatesMap.get(String.valueOf(a[i+1])));
}
}
return distance;
}
public static double distanceBetweenTwoCoordinates(final Coordinates c1, final Coordinates c2) {
double rad = Math.PI/180;
double a1 = Double.valueOf(c1.getLat()) * rad;
double a2 = Double.valueOf(c1.getLon()) * rad;
double b1 = Double.valueOf(c2.getLat()) * rad;
double b2 = Double.valueOf(c2.getLon()) * rad;
double dlat = b1 - a1;
double dlon = b2 - a2;
double a = Math.sin(dlat/2) * Math.sin(dlat/2) +
Math.cos(a1) * Math.cos(b1) * Math.sin(dlon/2) * Math.sin(dlon/2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double earthRadius = 6378.145;
double d = c * earthRadius;
return d;
}
}
in "Main":
List<Coordinates> coordinatesList = Geocoding.getCoordinatesForAddresses(addressList);
for(Coordinates c : coordinatesList) {
if(RouteHelper.globalCoordinatesMap==null) {
RouteHelper.globalCoordinatesMap = new HashMap<String, Coordinates>();
}
RouteHelper.globalCoordinatesMap.put(String.valueOf(c.getId()), c);
}
int[] aZiele = new int[coordinatesList.size()-1];
for(int a = 1; a<coordinatesList.size(); a++) {
aZiele[a-1] = a;
}
RouteHelper.shortestRouteByPermutation(aZiele, 0);
List<String> shortestRouteAddressesList = new ArrayList<String>();
shortestRouteAddressesList.add(addressList.get(0).getAddress());
for(int i=0; i<RouteHelper.globalShortestRoute.size(); i++) {
shortestRouteAddressesList.add(addressList.get(RouteHelper.globalShortestRoute.get(i)).getAddress());
}
//RouteHelper.globalCoordinatesMap = null;
//RouteHelper.globalShortestRoute=null;
//RouteHelper.globalActualRouteDistance = 0.0;