@Override public Optional<Route> reverse() { return this.edge.hasReverseEdge() ? Optional.of(new SingleRoute(this.edge.reversed() .orElseThrow(() -> new CoreException("Edge should have a reverse.")))) : Optional.empty(); }
@Override public Optional<Route> reverse() { Route reversed = null; final Iterator<Edge> iterator = this.iterator(); while (iterator.hasNext()) { final Edge edge = iterator.next(); if (edge.hasReverseEdge()) { final Edge reverse = edge.reversed().orElseThrow( () -> new CoreException("Edge should have a reverse edge.")); if (reversed == null) { reversed = Route.forEdge(reverse); } else { reversed = reversed.prepend(reverse); } } else { return Optional.empty(); } } return Optional.ofNullable(reversed); }
/** * Flags the given edge and its reverse edge * * @param edge * The edge to flag */ private void flagEdge(final Edge edge) { this.markAsFlagged(edge.getIdentifier()); if (edge.hasReverseEdge()) { this.markAsFlagged(edge.reversed().get().getIdentifier()); } }
/** * Checks if the supplied edge or its reverse edge has already been flagged * * @param edge * edge to check * @return {@code true} if the reverse edge has already been flagged */ private boolean hasBeenFlagged(final Edge edge) { if (edge.hasReverseEdge()) { return this.isFlagged(edge.getIdentifier()) || this.isFlagged(edge.reversed().get().getIdentifier()); } else { return this.isFlagged(edge.getIdentifier()); } }
&& this.edgeDirectionComparator.isOppositeDirection(inEdge, outEdge, false) && !outEdge.hasReverseEdge() && !inEdge.hasReverseEdge() && edgeNameFuzzyMatch(outEdge, inEdge, false))
protected void validateReverseEdgePolyLineUpdated() { for (final Edge edge : this.atlas .edges(edge -> edge.hasReverseEdge() && edge.isMasterEdge())) { final Edge reversed = edge.reversed().orElseThrow(() -> new CoreException( "Edge {} should have a reverse, but does not.", edge.getIdentifier())); final PolyLine forward = edge.asPolyLine(); final PolyLine backward = reversed.asPolyLine(); if (!forward.equals(backward.reversed())) { throw new CoreException( "Edge {} and its reverse {} have mismatching PolyLines: Forward = {}, Backward = {}", edge.getIdentifier(), reversed.getIdentifier(), forward, backward); } } } }
if (edge.hasReverseEdge())
if (edge.getIdentifier() != 0 && edge.hasReverseEdge())
if (edge.getIdentifier() != 0 && edge.hasReverseEdge())
@Test public void testOneWaySimpleLine() { // Based on https://www.openstreetmap.org/way/109486264 final Atlas slicedRawAtlas = this.setup.getOneWaySimpleLineAtlas(); final Atlas finalAtlas = new WaySectionProcessor(slicedRawAtlas, AtlasLoadingOption.createOptionWithAllEnabled(COUNTRY_BOUNDARY_MAP)).run(); Assert.assertEquals("One edge", 1, finalAtlas.numberOfEdges()); Assert.assertEquals("Two nodes", 2, finalAtlas.numberOfNodes()); finalAtlas.edges().forEach( edge -> Assert.assertFalse("No edge has a reverse edge", edge.hasReverseEdge())); }
@Test public void testOneWayRing() { // Based on https://www.openstreetmap.org/way/460257372 final Atlas slicedRawAtlas = this.setup.getOneWayRingAtlas(); final Atlas finalAtlas = new WaySectionProcessor(slicedRawAtlas, AtlasLoadingOption.createOptionWithAllEnabled(COUNTRY_BOUNDARY_MAP)).run(); Assert.assertEquals("Two edges, the ring got sectioned in the middle", 2, finalAtlas.numberOfEdges()); Assert.assertEquals("Two nodes", 2, finalAtlas.numberOfNodes()); finalAtlas.edges().forEach( edge -> Assert.assertFalse("No edge has a reverse edge", edge.hasReverseEdge())); }
if (currentShape.size() > 2 && !edge.hasReverseEdge())
.add(CompleteEdge.shallowFrom(inEdge).withRelationIdentifiers( mergeRelationMembers(inEdge.relations(), relationIdentifier)))); if (inEdge.hasReverseEdge()) .withRelationIdentifiers(mergeRelationMembers(outEdge.relations(), relationIdentifier)))); if (outEdge.hasReverseEdge())
@Test public void testLoadEdgeByIdentifier() { // Already loaded: 12-1350-1870 and 12-1349-1870 Assert.assertEquals(6, this.dynamicAtlas.numberOfEdges()); Assert.assertNull(this.dynamicAtlas.edge(5000000)); Assert.assertEquals(6, this.dynamicAtlas.numberOfEdges()); Assert.assertNotNull(this.dynamicAtlas.edge(1000000)); Assert.assertTrue(this.dynamicAtlas.edge(1000000).hasReverseEdge()); Assert.assertEquals(6, this.dynamicAtlas.numberOfEdges()); // Prompts load of 12-1350-1869 Assert.assertNotNull(this.dynamicAtlas.edge(2000000)); Assert.assertEquals(8, this.dynamicAtlas.numberOfEdges()); Assert.assertNotNull(this.dynamicAtlas.edge(3000000)); Assert.assertEquals(8, this.dynamicAtlas.numberOfEdges()); // Prompts load of 12-1349-1869 Assert.assertNotNull(this.dynamicAtlas.edge(4000000)); Assert.assertEquals(9, this.dynamicAtlas.numberOfEdges()); Assert.assertNotNull(this.dynamicAtlas.edge(5000000)); Assert.assertEquals(9, this.dynamicAtlas.numberOfEdges()); } }
Assert.assertEquals(4, dynamicAtlas.numberOfEdges()); Assert.assertNotNull(dynamicAtlas.edge(1000000)); Assert.assertTrue(dynamicAtlas.edge(1000000).hasReverseEdge()); Assert.assertEquals(4, dynamicAtlas.numberOfEdges());
@Test public void testLoadEdgeByIdentifier() { // Already loaded: 12-1350-1870 Assert.assertEquals(4, this.dynamicAtlas.numberOfEdges()); Assert.assertNull(this.dynamicAtlas.edge(6000000)); Assert.assertEquals(4, this.dynamicAtlas.numberOfEdges()); Assert.assertNotNull(this.dynamicAtlas.edge(1000000)); Assert.assertTrue(this.dynamicAtlas.edge(1000000).hasReverseEdge()); Assert.assertEquals(4, this.dynamicAtlas.numberOfEdges()); // Prompts load of 12-1350-1869 Assert.assertNotNull(this.dynamicAtlas.edge(2000000)); Assert.assertEquals(6, this.dynamicAtlas.numberOfEdges()); Assert.assertNotNull(this.dynamicAtlas.edge(3000000)); Assert.assertEquals(6, this.dynamicAtlas.numberOfEdges()); // Prompts load of 12-1349-1869 Assert.assertNotNull(this.dynamicAtlas.edge(4000000)); Assert.assertEquals(8, this.dynamicAtlas.numberOfEdges()); Assert.assertNotNull(this.dynamicAtlas.edge(5000000)); Assert.assertEquals(8, this.dynamicAtlas.numberOfEdges()); // Prompts load of 12-1349-1870 // Fixed by {@link MultiAtlasBorderFixer} due to inconsistent relations Assert.assertNull(this.dynamicAtlas.edge(6000000)); Assert.assertNotNull(this.dynamicAtlas.edge(6000001)); Assert.assertEquals(9, this.dynamicAtlas.numberOfEdges()); Assert.assertNotNull(this.dynamicAtlas.edge(7000000)); Assert.assertEquals(9, this.dynamicAtlas.numberOfEdges()); Assert.assertNotNull(this.dynamicAtlas.edge(8000000)); Assert.assertEquals(9, this.dynamicAtlas.numberOfEdges()); }
Assert.assertEquals(4, dynamicAtlas.numberOfEdges()); Assert.assertNotNull(dynamicAtlas.edge(1000000)); Assert.assertTrue(dynamicAtlas.edge(1000000).hasReverseEdge()); Assert.assertEquals(4, dynamicAtlas.numberOfEdges());