diff --git a/openrouteservice-api-tests/src/test/java/heigit/ors/v2/services/routing/ResultTest.java b/openrouteservice-api-tests/src/test/java/heigit/ors/v2/services/routing/ResultTest.java
index 896405c7b7..d3e9eb2fa3 100644
--- a/openrouteservice-api-tests/src/test/java/heigit/ors/v2/services/routing/ResultTest.java
+++ b/openrouteservice-api-tests/src/test/java/heigit/ors/v2/services/routing/ResultTest.java
@@ -82,6 +82,7 @@ public ResultTest() {
extraInfo.put("surface");
extraInfo.put("suitability");
extraInfo.put("steepness");
+ extraInfo.put("countryinfo");
addParameter("extra_info", extraInfo);
addParameter("preference", "fastest");
@@ -838,7 +839,7 @@ public void testExtras() {
given()
.header("Accept", "application/json")
.header("Content-Type", "application/json")
- .pathParam("profile", getParameter("bikeProfile"))
+ .pathParam("profile", getParameter("carProfile"))
.body(body.toString())
.when()
.post(getEndPointPath() + "/{profile}")
@@ -849,6 +850,7 @@ public void testExtras() {
.body("routes[0].extras.containsKey('surface')", is(true))
.body("routes[0].extras.containsKey('suitability')", is(true))
.body("routes[0].extras.containsKey('steepness')", is(true))
+ .body("routes[0].extras.containsKey('countryinfo')", is(true))
.statusCode(200);
}
@@ -2407,6 +2409,87 @@ public void testPreferQuiet() {
.statusCode(200);
}
+ @Test
+ public void testCountryTraversalExtra() {
+ JSONObject body = new JSONObject();
+ JSONArray coordinatesBoundaryCrossing = new JSONArray();
+ JSONArray coord1 = new JSONArray();
+ coord1.put(8.685046434402466);
+ coord1.put(49.40267269586634);
+ coordinatesBoundaryCrossing.put(coord1);
+ JSONArray coord2 = new JSONArray();
+ coord2.put(8.687556982040405);
+ coord2.put(49.40271458586781);
+ coordinatesBoundaryCrossing.put(coord2);
+ body.put("coordinates", coordinatesBoundaryCrossing);
+ JSONArray extraInfo = new JSONArray();
+ extraInfo.put("countryinfo");
+ body.put("extra_info", extraInfo);
+
+ // Border crossing
+ given()
+ .header("Accept", "application/json")
+ .header("Content-Type", "application/json")
+ .pathParam("profile", getParameter("carProfile"))
+ .body(body.toString())
+ .when()
+ .post(getEndPointPath() + "/{profile}/json")
+ .then().log().ifValidationFails()
+ .assertThat()
+ .body("any { it.key == 'routes' }", is(true))
+ .body("routes[0].containsKey('extras')", is(true))
+ .body("routes[0].extras.containsKey('countryinfo')", is(true))
+ .body("routes[0].extras.countryinfo.containsKey('values')", is(true))
+ .body("routes[0].extras.countryinfo.containsKey('summary')", is(true))
+ .body("routes[0].extras.countryinfo.values[0][0]", is(0))
+ .body("routes[0].extras.countryinfo.values[0][1]", is(2))
+ .body("routes[0].extras.countryinfo.values[0][2]", is(2))
+ .body("routes[0].extras.countryinfo.summary[0].value", is(2.0f))
+ .body("routes[0].extras.countryinfo.summary[0].distance", is(150.4f))
+ .body("routes[0].extras.countryinfo.summary[0].amount", is(82.88f))
+ .body("routes[0].extras.countryinfo.values[1][0]", is(2))
+ .body("routes[0].extras.countryinfo.values[1][1]", is(3))
+ .body("routes[0].extras.countryinfo.values[1][2]", is(3))
+ .body("routes[0].extras.countryinfo.summary[1].value", is(3.0f))
+ .body("routes[0].extras.countryinfo.summary[1].distance", is(31.1f))
+ .body("routes[0].extras.countryinfo.summary[1].amount", is(17.12f))
+ .statusCode(200);
+
+ JSONArray coordinatesNoBoundaryCrossing = new JSONArray();
+ coord1 = new JSONArray();
+ coord1.put(8.692256212234497);
+ coord1.put(49.405004518240005);
+ coordinatesNoBoundaryCrossing.put(coord1);
+ coord2 = new JSONArray();
+ coord2.put(8.689970970153809);
+ coord2.put(49.40532565875338);
+ coordinatesNoBoundaryCrossing.put(coord2);
+ body.put("coordinates", coordinatesNoBoundaryCrossing);
+
+ // No border crossing
+ given()
+ .header("Accept", "application/json")
+ .header("Content-Type", "application/json")
+ .pathParam("profile", getParameter("carProfile"))
+ .body(body.toString())
+ .when()
+ .post(getEndPointPath() + "/{profile}/json")
+ .then().log().ifValidationFails()
+ .assertThat()
+ .body("any { it.key == 'routes' }", is(true))
+ .body("routes[0].containsKey('extras')", is(true))
+ .body("routes[0].extras.containsKey('countryinfo')", is(true))
+ .body("routes[0].extras.countryinfo.containsKey('values')", is(true))
+ .body("routes[0].extras.countryinfo.containsKey('summary')", is(true))
+ .body("routes[0].extras.countryinfo.values[0][0]", is(0))
+ .body("routes[0].extras.countryinfo.values[0][1]", is(2))
+ .body("routes[0].extras.countryinfo.values[0][2]", is(4))
+ .body("routes[0].extras.countryinfo.summary[0].value", is(4.0f))
+ .body("routes[0].extras.countryinfo.summary[0].distance", is(169.2f))
+ .body("routes[0].extras.countryinfo.summary[0].amount", is(100.0f))
+ .statusCode(200);
+ }
+
private JSONArray constructCoords(String coordString) {
JSONArray coordinates = new JSONArray();
String[] coordPairs = coordString.split("\\|");
diff --git a/openrouteservice/src/main/java/heigit/ors/api/requests/common/APIEnums.java b/openrouteservice/src/main/java/heigit/ors/api/requests/common/APIEnums.java
index 8d314675f6..9058d6ab83 100644
--- a/openrouteservice/src/main/java/heigit/ors/api/requests/common/APIEnums.java
+++ b/openrouteservice/src/main/java/heigit/ors/api/requests/common/APIEnums.java
@@ -63,7 +63,8 @@ public enum ExtraInfo {
TOLLWAYS("tollways"),
TRAIL_DIFFICULTY("traildifficulty"),
OSM_ID("osmid"),
- ROAD_ACCESS_RESTRICTIONS("roadaccessrestrictions");
+ ROAD_ACCESS_RESTRICTIONS("roadaccessrestrictions"),
+ COUNTRY_INFO("countryinfo");
private final String value;
diff --git a/openrouteservice/src/main/java/heigit/ors/routing/RouteExtraInfoFlag.java b/openrouteservice/src/main/java/heigit/ors/routing/RouteExtraInfoFlag.java
index 52d3b99168..ca24e16855 100644
--- a/openrouteservice/src/main/java/heigit/ors/routing/RouteExtraInfoFlag.java
+++ b/openrouteservice/src/main/java/heigit/ors/routing/RouteExtraInfoFlag.java
@@ -28,6 +28,7 @@ public class RouteExtraInfoFlag {
public static final int TrailDifficulty = 512;
public static final int OsmId = 1024;
public static final int RoadAccessRestrictions = 2048;
+ public static final int CountryInfo = 4096;
public static boolean isSet(int extraInfo, int value) {
return (extraInfo & value) == value;
@@ -78,6 +79,9 @@ public static int getFromString(String value) {
case "roadaccessrestrictions":
res |= RoadAccessRestrictions;
break;
+ case "countryinfo":
+ res |= CountryInfo;
+ break;
}
}
diff --git a/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/ORSOSMReader.java b/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/ORSOSMReader.java
index 21e2940628..1fab1b88b2 100644
--- a/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/ORSOSMReader.java
+++ b/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/ORSOSMReader.java
@@ -20,7 +20,7 @@
import com.graphhopper.storage.GraphHopperStorage;
import com.graphhopper.util.EdgeIteratorState;
import com.graphhopper.util.Helper;
-import com.vividsolutions.jts.geom.*;
+import com.vividsolutions.jts.geom.Coordinate;
import heigit.ors.routing.RoutingProfile;
import heigit.ors.routing.graphhopper.extensions.reader.osmfeatureprocessors.OSMFeatureFilter;
import heigit.ors.routing.graphhopper.extensions.reader.osmfeatureprocessors.WheelchairWayFilter;
@@ -31,9 +31,13 @@
import org.apache.log4j.Logger;
import java.io.InvalidObjectException;
-import java.util.*;
-
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
public class ORSOSMReader extends OSMReader {
diff --git a/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/reader/borders/CountryBordersReader.java b/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/reader/borders/CountryBordersReader.java
index b550a63ce4..9c5d5cf9b3 100644
--- a/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/reader/borders/CountryBordersReader.java
+++ b/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/reader/borders/CountryBordersReader.java
@@ -13,6 +13,8 @@
*/
package heigit.ors.routing.graphhopper.extensions.reader.borders;
+import com.graphhopper.util.PointList;
+import com.graphhopper.util.shapes.GHPoint3D;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Point;
@@ -381,6 +383,18 @@ public static int getCountryIdByISOCode(String code) {
return currentInstance != null ? currentInstance.isoCodes.getOrDefault(code.toUpperCase(), 0) : 0;
}
+ public static CountryBordersPolygon[] getCountriesByPointList(PointList pointList) {
+ CountryBordersPolygon[] countries = new CountryBordersPolygon[0];
+ for (GHPoint3D point :
+ pointList) {
+ Coordinate coordinate = new Coordinate(point.lon, point.lat);
+ CountryBordersPolygon[] countries2 = currentInstance.getCandidateCountry(coordinate);
+ CountryBordersPolygon[] countries23 = currentInstance.getCandidateCountry(coordinate);
+
+ }
+ return countries;
+ }
+
/**
* Read information from the id csv. This includes a unique identifier, the local name of the country and the
* English name of the country. Optionally reads ISO codes from column 4 and 5 (expecting them to contain the
diff --git a/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/storages/BordersGraphStorage.java b/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/storages/BordersGraphStorage.java
index da65ef4fec..4fee2f88c9 100644
--- a/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/storages/BordersGraphStorage.java
+++ b/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/storages/BordersGraphStorage.java
@@ -1,15 +1,15 @@
/* This file is part of Openrouteservice.
*
- * Openrouteservice is free software; you can redistribute it and/or modify it under the terms of the
- * GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1
+ * Openrouteservice is free software; you can redistribute it and/or modify it under the terms of the
+ * GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
- * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
- * You should have received a copy of the GNU Lesser General Public License along with this library;
- * if not, see
- *
+ *
* The method takes an identifier to the edge and then gets the requested value for the edge from the storage
*
- * @param edgeId Internal ID of the edge to get values for
- * @param prop The property of the edge to get (TYPE - border type (0,1,2), START - the ID of the country
- * the edge starts in, END - the ID of the country the edge ends in.
- * @return The value of the requested property
+ * @param edgeId Internal ID of the edge to get values for
+ * @param prop The property of the edge to get (TYPE - border type (0,1,2), START - the ID of the country
+ * the edge starts in, END - the ID of the country the edge ends in.
+ * @return The value of the requested property
*/
public short getEdgeValue(int edgeId, Property prop) {
+ // TODO maybe implement a second function that accesses only the country data
long edgePointer = (long) edgeId * edgeEntryBytes;
- short border = 0, start = 0, end = 0;
+ short border;
+ short start;
+ short end;
+ short genuineCountry;
+ short edge = orsEdges.getShort(edgePointer);
border = orsEdges.getShort(edgePointer + EF_BORDER);
start = orsEdges.getShort(edgePointer + EF_START);
end = orsEdges.getShort(edgePointer + EF_END);
switch (prop) {
case TYPE:
-
return border;
case START:
return start;
diff --git a/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/storages/builders/BordersGraphStorageBuilder.java b/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/storages/builders/BordersGraphStorageBuilder.java
index 8b0df345ff..a418b06f44 100644
--- a/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/storages/builders/BordersGraphStorageBuilder.java
+++ b/openrouteservice/src/main/java/heigit/ors/routing/graphhopper/extensions/storages/builders/BordersGraphStorageBuilder.java
@@ -1,15 +1,15 @@
/* This file is part of Openrouteservice.
*
- * Openrouteservice is free software; you can redistribute it and/or modify it under the terms of the
- * GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1
+ * Openrouteservice is free software; you can redistribute it and/or modify it under the terms of the
+ * GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
- * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
- * You should have received a copy of the GNU Lesser General Public License along with this library;
- * if not, see