package com.graphhopper.routing.util; import java.util.*; import com.graphhopper.routing.AbstractRoutingAlgorithmTester; import com.graphhopper.routing.util.spatialrules.countries.GermanySpatialRule; import com.graphhopper.util.PMap; import com.graphhopper.routing.util.spatialrules.*; import com.graphhopper.util.*; import com.graphhopper.util.shapes.BBox; import com.graphhopper.util.shapes.GHPoint; import org.junit.Test; import com.graphhopper.reader.ReaderWay; import com.graphhopper.storage.Graph; import com.graphhopper.storage.GraphBuilder; import static org.junit.Assert.*; /** * @author Peter Karich */ public class DataFlagEncoderTest { private final PMap properties; private final DataFlagEncoder encoder; private final EncodingManager encodingManager; private final int motorVehicleInt; private final double DELTA = 0.1; public DataFlagEncoderTest() { properties = new PMap(); properties.put("store_height", true); properties.put("store_weight", true); properties.put("store_width", true); encoder = new DataFlagEncoder(properties); encodingManager = new EncodingManager(Arrays.asList(encoder), 8); motorVehicleInt = encoder.getAccessType("motor_vehicle"); } @Test(expected = IllegalArgumentException.class) public void testInsufficientEncoderBitLength() { EncodingManager em = new EncodingManager(Arrays.asList(new DataFlagEncoder(properties))); } @Test public void testSufficientEncoderBitLength() { try { EncodingManager em = new EncodingManager(Arrays.asList(new DataFlagEncoder(properties)), 8); EncodingManager em1 = new EncodingManager(Arrays.asList(new DataFlagEncoder())); } catch (Throwable t) { fail(); } } @Test public void testHighway() { ReaderWay osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); osmWay.setTag("surface", "sand"); osmWay.setTag("tunnel", "yes"); long flags = encoder.handleWayTags(osmWay, 1, 0); EdgeIteratorState edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertEquals("primary", encoder.getHighwayAsString(edge)); assertEquals("sand", encoder.getSurfaceAsString(edge)); assertEquals("tunnel", encoder.getTransportModeAsString(edge)); assertTrue(encoder.isForward(edge, motorVehicleInt)); assertTrue(encoder.isBackward(edge, motorVehicleInt)); osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); osmWay.setTag("oneway", "yes"); flags = encoder.handleWayTags(osmWay, 1, 0); edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertTrue(encoder.isForward(edge, motorVehicleInt)); assertFalse(encoder.isBackward(edge, motorVehicleInt)); osmWay = new ReaderWay(0); osmWay.setTag("highway", "unknownX"); flags = encoder.handleWayTags(osmWay, 1, 0); edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertEquals("_default", encoder.getHighwayAsString(edge)); } @Test public void testTunnel() { ReaderWay osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); osmWay.setTag("tunnel", "yes"); long flags = encoder.handleWayTags(osmWay, 1, 0); EdgeIteratorState edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertEquals("primary", encoder.getHighwayAsString(edge)); assertEquals("tunnel", encoder.getTransportModeAsString(edge)); assertTrue(encoder.isTransportModeTunnel(edge)); assertFalse(encoder.isTransportModeBridge(edge)); osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); osmWay.setTag("tunnel", "yes"); osmWay.setTag("bridge", "yes"); flags = encoder.handleWayTags(osmWay, 1, 0); edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertEquals("bridge", encoder.getTransportModeAsString(edge)); assertFalse(encoder.isTransportModeTunnel(edge)); assertTrue(encoder.isTransportModeBridge(edge)); } @Test public void testBridge() { ReaderWay osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); osmWay.setTag("bridge", "yes"); long flags = encoder.handleWayTags(osmWay, 1, 0); EdgeIteratorState edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertEquals("primary", encoder.getHighwayAsString(edge)); assertEquals("bridge", encoder.getTransportModeAsString(edge)); assertFalse(encoder.isTransportModeTunnel(edge)); assertTrue(encoder.isTransportModeBridge(edge)); osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); osmWay.setTag("bridge", "yes"); osmWay.setTag("tunnel", "yes"); flags = encoder.handleWayTags(osmWay, 1, 0); edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertEquals("bridge", encoder.getTransportModeAsString(edge)); assertFalse(encoder.isTransportModeTunnel(edge)); assertTrue(encoder.isTransportModeBridge(edge)); } @Test public void testFord() { ReaderWay osmWay = new ReaderWay(0); osmWay.setTag("highway", "unclassified"); osmWay.setTag("ford", "yes"); long flags = encoder.handleWayTags(osmWay, 1, 0); EdgeIteratorState edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertEquals("ford", encoder.getTransportModeAsString(edge)); assertTrue(encoder.isTransportModeFord(edge.getFlags())); assertTrue(encoder.getAnnotation(edge.getFlags(), TranslationMapTest.SINGLETON.get("en")).getMessage().contains("ford")); } @Test public void testHighwaySpeed() { Map<String, Double> map = new LinkedHashMap<>(); map.put("motorway", 100d); map.put("motorway_link", 100d); map.put("motorroad", 90d); map.put("trunk", 90d); map.put("trunk_link", 90d); double[] arr = encoder.getHighwaySpeedMap(map); assertEquals("[0.0, 100.0, 100.0, 90.0, 90.0, 90.0]", Helper.createDoubleList(arr).subList(0, 6).toString()); } @Test public void testDestinationTag() { ReaderWay way = new ReaderWay(1); way.setTag("highway", "secondary"); assertEquals(AccessValue.ACCESSIBLE, encoder.getAccessValue(encoder.handleWayTags(way, encoder.acceptWay(way), 0))); way.setTag("vehicle", "destination"); assertEquals(AccessValue.EVENTUALLY_ACCESSIBLE, encoder.getAccessValue(encoder.handleWayTags(way, encoder.acceptWay(way), 0))); way.setTag("vehicle", "no"); assertEquals(AccessValue.NOT_ACCESSIBLE, encoder.getAccessValue(encoder.handleWayTags(way, encoder.acceptWay(way), 0))); } @Test public void testMaxspeed() { ReaderWay osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); osmWay.setTag("maxspeed", "10"); long flags = encoder.handleWayTags(osmWay, 1, 0); EdgeIteratorState edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertEquals(10, encoder.getMaxspeed(edge, motorVehicleInt, false), .1); assertEquals(10, encoder.getMaxspeed(edge, motorVehicleInt, true), .1); osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); osmWay.setTag("maxspeed:forward", "10"); flags = encoder.handleWayTags(osmWay, 1, 0); edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertEquals(10, encoder.getMaxspeed(edge, motorVehicleInt, false), .1); assertEquals(-1, encoder.getMaxspeed(edge, motorVehicleInt, true), .1); osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); osmWay.setTag("maxspeed:forward", "50"); osmWay.setTag("maxspeed:backward", "50"); osmWay.setTag("maxspeed", "60"); flags = encoder.handleWayTags(osmWay, 1, 0); edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertEquals(50, encoder.getMaxspeed(edge, motorVehicleInt, false), .1); assertEquals(50, encoder.getMaxspeed(edge, motorVehicleInt, true), .1); } @Test public void testLargeMaxspeed() { ReaderWay osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); osmWay.setTag("maxspeed", "145"); long flags = encoder.handleWayTags(osmWay, 1, 0); EdgeIteratorState edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertEquals(140, encoder.getMaxspeed(edge, motorVehicleInt, false), .1); assertEquals(140, encoder.getMaxspeed(edge, motorVehicleInt, true), .1); osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); osmWay.setTag("maxspeed", "1000"); flags = encoder.handleWayTags(osmWay, 1, 0); edge = GHUtility.createMockedEdgeIteratorState(0, flags); assertEquals(140, encoder.getMaxspeed(edge, motorVehicleInt, false), .1); assertEquals(140, encoder.getMaxspeed(edge, motorVehicleInt, true), .1); } @Test public void reverseEdge() { Graph graph = new GraphBuilder(encodingManager).create(); EdgeIteratorState edge = graph.edge(0, 1); ReaderWay osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); osmWay.setTag("maxspeed:forward", "10"); long flags = encoder.handleWayTags(osmWay, 1, 0); edge.setFlags(flags); assertEquals(10, encoder.getMaxspeed(edge, motorVehicleInt, false), .1); assertEquals(-1, encoder.getMaxspeed(edge, motorVehicleInt, true), .1); edge = edge.detach(true); assertEquals(-1, encoder.getMaxspeed(edge, motorVehicleInt, false), .1); assertEquals(10, encoder.getMaxspeed(edge, motorVehicleInt, true), .1); } @Test public void setAccess() { Graph graph = new GraphBuilder(encodingManager).create(); EdgeIteratorState edge = graph.edge(0, 1); edge.setFlags(encoder.setAccess(edge.getFlags(), true, true)); assertTrue(encoder.isForward(edge, motorVehicleInt)); assertTrue(encoder.isBackward(edge, motorVehicleInt)); edge.setFlags(encoder.setAccess(edge.getFlags(), true, false)); assertTrue(encoder.isForward(edge, motorVehicleInt)); assertFalse(encoder.isBackward(edge, motorVehicleInt)); edge = edge.detach(true); assertFalse(encoder.isForward(edge, motorVehicleInt)); assertTrue(encoder.isBackward(edge, motorVehicleInt)); edge = edge.detach(true); assertTrue(encoder.isForward(edge, motorVehicleInt)); assertFalse(encoder.isBackward(edge, motorVehicleInt)); edge.setFlags(encoder.setAccess(edge.getFlags(), false, false)); assertFalse(encoder.isForward(edge, motorVehicleInt)); assertFalse(encoder.isBackward(edge, motorVehicleInt)); } @Test public void acceptWay() { ReaderWay osmWay = new ReaderWay(0); osmWay.setTag("highway", "primary"); assertTrue(encoder.acceptWay(osmWay) != 0); // important to filter out illegal highways to reduce the number of edges before adding them to the graph osmWay.setTag("highway", "building"); assertTrue(encoder.acceptWay(osmWay) == 0); } @Test public void stringToMeter() { assertEquals(1.5, DataFlagEncoder.stringToMeter("1.5"), DELTA); assertEquals(1.5, DataFlagEncoder.stringToMeter("1.5m"), DELTA); assertEquals(1.5, DataFlagEncoder.stringToMeter("1.5 m"), DELTA); assertEquals(1.5, DataFlagEncoder.stringToMeter("1.5 m"), DELTA); assertEquals(1.5, DataFlagEncoder.stringToMeter("1.5 meter"), DELTA); assertEquals(1.5, DataFlagEncoder.stringToMeter("4 ft 11 in"), DELTA); assertEquals(1.5, DataFlagEncoder.stringToMeter("4'11''"), DELTA); assertEquals(3, DataFlagEncoder.stringToMeter("3 m."), DELTA); assertEquals(3, DataFlagEncoder.stringToMeter("3meters"), DELTA); assertEquals(0.8 * 3, DataFlagEncoder.stringToMeter("~3"), DELTA); assertEquals(3 * 0.8, DataFlagEncoder.stringToMeter("3 m approx"), DELTA); // 2.743 + 0.178 assertEquals(2.921, DataFlagEncoder.stringToMeter("9 ft 7in"), DELTA); assertEquals(2.921, DataFlagEncoder.stringToMeter("9'7\""), DELTA); assertEquals(2.921, DataFlagEncoder.stringToMeter("9'7''"), DELTA); assertEquals(2.921, DataFlagEncoder.stringToMeter("9' 7\""), DELTA); assertEquals(2.743, DataFlagEncoder.stringToMeter("9'"), DELTA); assertEquals(2.743, DataFlagEncoder.stringToMeter("9 feet"), DELTA); } @Test(expected = NumberFormatException.class) public void stringToMeterException() { // Unexpected values DataFlagEncoder.stringToMeter("height limit 1.5m"); } @Test public void stringToTons() { assertEquals(1.5, DataFlagEncoder.stringToTons("1.5"), DELTA); assertEquals(1.5, DataFlagEncoder.stringToTons("1.5 t"), DELTA); assertEquals(1.5, DataFlagEncoder.stringToTons("1.5 t"), DELTA); assertEquals(1.5, DataFlagEncoder.stringToTons("1.5 tons"), DELTA); assertEquals(1.5, DataFlagEncoder.stringToTons("1.5 ton"), DELTA); assertEquals(1.5, DataFlagEncoder.stringToTons("3306.9 lbs"), DELTA); assertEquals(3, DataFlagEncoder.stringToTons("3 T"), DELTA); assertEquals(3, DataFlagEncoder.stringToTons("3ton"), DELTA); // maximum gross weight assertEquals(6, DataFlagEncoder.stringToTons("6t mgw"), DELTA); } @Test(expected = NumberFormatException.class) public void stringToTonsException() { // Unexpected values DataFlagEncoder.stringToTons("weight limit 1.5t"); } @Test public void testSpatialId() { final GermanySpatialRule germany = new GermanySpatialRule(); germany.setBorders(Collections.singletonList(new Polygon(new double[]{0, 0, 1, 1}, new double[]{0, 1, 1, 0}))); SpatialRuleLookup index = new SpatialRuleLookup() { @Override public SpatialRule lookupRule(double lat, double lon) { for (Polygon polygon : germany.getBorders()) { if (polygon.contains(lat, lon)) { return germany; } } return SpatialRule.EMPTY; } @Override public SpatialRule lookupRule(GHPoint point) { return lookupRule(point.lat, point.lon); } @Override public int getSpatialId(SpatialRule rule) { if (germany.equals(rule)) { return 1; } else { return 0; } } @Override public int size() { return 2; } @Override public BBox getBounds() { return new BBox(-180, 180, -90, 90); } }; DataFlagEncoder encoder = new DataFlagEncoder(new PMap()); encoder.setSpatialRuleLookup(index); EncodingManager em = new EncodingManager(encoder); ReaderWay way = new ReaderWay(27l); way.setTag("highway", "track"); way.setTag("estimated_center", new GHPoint(0.005, 0.005)); ReaderWay way2 = new ReaderWay(28l); way2.setTag("highway", "track"); way2.setTag("estimated_center", new GHPoint(-0.005, -0.005)); ReaderWay livingStreet = new ReaderWay(29l); livingStreet.setTag("highway", "living_street"); livingStreet.setTag("estimated_center", new GHPoint(0.005, 0.005)); ReaderWay livingStreet2 = new ReaderWay(30l); livingStreet2.setTag("highway", "living_street"); livingStreet2.setTag("estimated_center", new GHPoint(-0.005, -0.005)); Graph graph = new GraphBuilder(em).create(); EdgeIteratorState e1 = graph.edge(0, 1, 1, true); EdgeIteratorState e2 = graph.edge(0, 2, 1, true); EdgeIteratorState e3 = graph.edge(0, 3, 1, true); EdgeIteratorState e4 = graph.edge(0, 4, 1, true); AbstractRoutingAlgorithmTester.updateDistancesFor(graph, 0, 0.00, 0.00); AbstractRoutingAlgorithmTester.updateDistancesFor(graph, 1, 0.01, 0.01); AbstractRoutingAlgorithmTester.updateDistancesFor(graph, 2, -0.01, -0.01); AbstractRoutingAlgorithmTester.updateDistancesFor(graph, 3, 0.01, 0.01); AbstractRoutingAlgorithmTester.updateDistancesFor(graph, 4, -0.01, -0.01); e1.setFlags(encoder.handleWayTags(way, 1, 0)); e2.setFlags(encoder.handleWayTags(way2, 1, 0)); e3.setFlags(encoder.handleWayTags(livingStreet, 1, 0)); e4.setFlags(encoder.handleWayTags(livingStreet2, 1, 0)); assertEquals(index.getSpatialId(new GermanySpatialRule()), encoder.getSpatialId(e1.getFlags())); assertEquals(index.getSpatialId(SpatialRule.EMPTY), encoder.getSpatialId(e2.getFlags())); assertEquals(AccessValue.EVENTUALLY_ACCESSIBLE, encoder.getAccessValue(e1.getFlags())); assertEquals(AccessValue.ACCESSIBLE, encoder.getAccessValue(e2.getFlags())); assertEquals(5, encoder.getMaxspeed(e3, -1, false), .1); assertEquals(-1, encoder.getMaxspeed(e4, -1, false), .1); } }