Skip to content

Commit

Permalink
feature-#349 list traversal countries
Browse files Browse the repository at this point in the history
  • Loading branch information
Julian Psotta committed May 20, 2019
1 parent 37235c6 commit fb319c0
Show file tree
Hide file tree
Showing 9 changed files with 205 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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}")
Expand All @@ -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);
}

Expand Down Expand Up @@ -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("\\|");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -78,6 +79,9 @@ public static int getFromString(String value) {
case "roadaccessrestrictions":
res |= RoadAccessRestrictions;
break;
case "countryinfo":
res |= CountryInfo;
break;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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 <https://www.gnu.org/licenses/>.
* You should have received a copy of the GNU Lesser General Public License along with this library;
* if not, see <https://www.gnu.org/licenses/>.
*/
package heigit.ors.routing.graphhopper.extensions.storages;

Expand All @@ -19,11 +19,15 @@
import com.graphhopper.storage.GraphExtension;
import com.graphhopper.storage.RAMDirectory;

import org.apache.log4j.Logger;

/**
* Graph storage class for the Border Restriction routing
*/
public class BordersGraphStorage implements GraphExtension {
public enum Property { TYPE, START, END };
private static final Logger LOGGER = Logger.getLogger(BordersGraphStorage.class.getName());

public enum Property { TYPE, START, END}
/* pointer for no entry */
protected final int NO_ENTRY = -1;
private final int EF_BORDER = 0; // byte location of border type
Expand All @@ -40,7 +44,6 @@ public enum Property { TYPE, START, END };
private int edgesCount; // number of edges with custom values

public BordersGraphStorage() {
//EF_BORDER = 0;

int edgeEntryIndex = 0;
edgeEntryBytes = edgeEntryIndex + 6; // item uses 3 short values which are 2 bytes length each
Expand All @@ -52,11 +55,10 @@ public BordersGraphStorage() {
*
* This method takes the internal ID of the edge and adds the information obtained from the Borders CSV file to it
* so that the values can be taken into account when generating a route.
*
* @param edgeId Internal ID of the graph edge
* @param borderType Level of border crossing (0 - No border, 1 - controlled border, 2 - open border=
* @param start ID of the country that the edge starts in
* @param end ID of the country that the edge ends in
* @param edgeId Internal ID of the graph edge
* @param borderType Level of border crossing (0 - No border, 1 - controlled border, 2 - open border=
* @param start ID of the country that the edge starts in
* @param end ID of the country that the edge ends in
*/
public void setEdgeValue(int edgeId, short borderType, short start, short end) {
edgesCount++;
Expand All @@ -74,24 +76,28 @@ public void setEdgeValue(int edgeId, short borderType, short start, short end) {

/**
* Get the specified custom value of the edge that was assigned to it in the setValueEdge method<br/><br/>
*
* <p>
* 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;
Expand Down
Loading

0 comments on commit fb319c0

Please sign in to comment.