final Atlas atlas = new MultiAtlas(this.subAtlases); try new MultiAtlas(ImmutableList.copyOf(this.subAtlases.iterator())) .saveAsText(new File(this.outputTextPath.toFile())); LoggerFactory.getLogger(getClass()).info("Text atlas saved to {}", this.outputTextPath);
@Override protected int finish(final CommandMap command) { final Atlas atlas = new MultiAtlas(this.atlases); try { final PackedAtlas saveMe = new PackedAtlasCloner().cloneFrom(atlas); final Path path = (Path) command.get(OUTPUT_PARAMETER); Files.createDirectories(path.getParent()); saveMe.save(new File(path.toString())); return 0; } catch (final IOException oops) { throw new CoreException("Error when saving packed atlas", oops); } }
@Override public int execute(final CommandMap command) { start(command); final File path = (File) command.get(INPUT_FOLDER_PARAMETER); Stream<Atlas> atlases = path.listFilesRecursively().stream() .filter(AtlasResourceLoader.IS_ATLAS) .map(atlas -> new AtlasResourceLoader().load(atlas)); if ((Boolean) command.get(PARALLEL_FLAG)) { atlases = atlases.parallel(); } if ((Boolean) command.get(COMBINE_PARAMETER)) { handle(new MultiAtlas(atlases.collect(Collectors.toList())), command); } else { atlases.forEach(atlas -> { handle(atlas, command); }); } return finish(command); }
@Override protected int finish(final CommandMap command) { final Atlas atlas = new MultiAtlas(this.atlases); final Rectangle rectangle = (Rectangle) command.get(SUB); try { final Atlas saveMe = new PackedAtlasCloner().cloneFrom(atlas) .subAtlas(rectangle, AtlasCutType.SOFT_CUT).orElseThrow( () -> new CoreException("There are no features in the sub rectangle.")); final Path path = (Path) command.get(OUTPUT); Files.createDirectories(path.getParent()); saveMe.save(new File(path.toString())); final Path path2 = (Path) command.get(GEOJSON); if (path2 != null) { Files.createDirectories(path2.getParent()); saveMe.saveAsGeoJson(new File(path2.toString())); } return 0; } catch (final IOException oops) { throw new CoreException("Error when saving packed atlas", oops); } }
/** * Load a {@link MultiAtlas} from an {@link Iterable} of {@link PackedAtlas} serialized * resources * * @param resources * The {@link Resource}s to read from (which each contain a serialized * {@link PackedAtlas}). * @param lotsOfOverlap * If this is true, then the builder will start with small arrays and re-size a lot, * but won't waste memory because of the overlap of the sub-{@link Atlas}es. However, * if this is false, the builder will blindly sum all the items of all the * {@link Atlas}es regardless of overlap, and will hence allocate potentially more * memory than necessary. In that case though, the arrays will never resize, and the * load time will be faster. * @return The deserialized {@link MultiAtlas} */ public static MultiAtlas loadFromPackedAtlas(final Iterable<? extends Resource> resources, final boolean lotsOfOverlap) { if (Iterables.size(resources) == 0) { throw new CoreException("Can't create an atlas from zero resources"); } return new MultiAtlas( Iterables.translate(resources, resource -> PackedAtlas.load(resource)), lotsOfOverlap); }
@Before public void init() { this.combined = new MultiAtlas(this.rule.getAtlas1(), this.rule.getAtlas2()); }
@Test public void testRuleIntegrity() { final Atlas atlas = this.rule.getAtlas(); final Atlas atlasz12x1350y1870 = this.store.get(new SlippyTile(1350, 1870, 12)); final Atlas atlasz12x1350y1869 = this.store.get(new SlippyTile(1350, 1869, 12)); final Atlas atlasz12x1349y1869 = this.store.get(new SlippyTile(1349, 1869, 12)); final Atlas atlasz12x1349y1870 = this.store.get(new SlippyTile(1349, 1870, 12)); final Atlas multiAtlas = new MultiAtlas(atlasz12x1350y1870, atlasz12x1350y1869, atlasz12x1349y1869, atlasz12x1349y1870); Assert.assertEquals("Found differences: " + new AtlasDelta(atlas, multiAtlas).toString(), atlas, multiAtlas); }
@Test public void oneWaySubAtlas1From1To4WithInnerLocations() { final Atlas subAtlas1 = this.setup.oneWaySubAtlas1From1To4WithInnerLocations(); final Atlas subAtlas2 = this.setup.oneWaySubAtlas2From1To4WithInnerLocations(); final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2); // Verify first edge verifyEdge(multiAtlas.edge(123456789120001L), MultiAtlasBorderFixerTestRule.POINT_1_LOCATION, MultiAtlasBorderFixerTestRule.POINT_2_LOCATION, MultiAtlasBorderFixerTestRule.POINT_3_LOCATION, MultiAtlasBorderFixerTestRule.POINT_4_LOCATION); // Verify second edge verifyEdge(multiAtlas.edge(123456789120002L), MultiAtlasBorderFixerTestRule.POINT_4_LOCATION, MultiAtlasBorderFixerTestRule.POINT_5_LOCATION); }
@Test public void testOverlappingAtAntimeridian() { final Atlas subAtlas1 = this.setup.subAtlasOnAntimeridianEast(); final Atlas subAtlas2 = this.setup.subAtlasOnAntimeridianWest(); final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2); final Router router = AStarRouter.dijkstra(multiAtlas, Distance.meters(40)); final Route route = router.route( Location.forString(MultiAtlasOverlappingNodesFixerTestRule.POINT_1_LOCATION), Location.forString(MultiAtlasOverlappingNodesFixerTestRule.POINT_4_LOCATION)); Assert.assertEquals(2, route.size()); }
@Test public void testOverlappingNodes() { final Atlas subAtlas1 = this.setup.overlappingSubAtlas1(); final Atlas subAtlas2 = this.setup.overlappingSubAtlas2(); final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2); final Router router = AStarRouter.dijkstra(multiAtlas, Distance.meters(40)); final Route route = router.route( Location.forString(MultiAtlasOverlappingNodesFixerTestRule.POINT_5_LOCATION), Location.forString(MultiAtlasOverlappingNodesFixerTestRule.POINT_8_LOCATION)); Assert.assertEquals(2, route.size()); }
@Test public void testOneWayWithDuplicateNode() { final Atlas subAtlas1 = this.setup.oneWayWithDuplicateNodeSubAtlas1(); final Atlas subAtlas2 = this.setup.oneWayWithDuplicateNodeSubAtlas2(); final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2); // Verify first edge verifyEdge(multiAtlas.edge(123456789120001L), MultiAtlasBorderFixerTestRule.POINT_1_LOCATION, MultiAtlasBorderFixerTestRule.POINT_2_LOCATION); // Verify second edge verifyEdge(multiAtlas.edge(123456789120002L), MultiAtlasBorderFixerTestRule.POINT_2_LOCATION, MultiAtlasBorderFixerTestRule.POINT_3_LOCATION, MultiAtlasBorderFixerTestRule.POINT_3_LOCATION, MultiAtlasBorderFixerTestRule.POINT_4_LOCATION); // Verify third edge verifyEdge(multiAtlas.edge(123456789120003L), MultiAtlasBorderFixerTestRule.POINT_4_LOCATION, MultiAtlasBorderFixerTestRule.POINT_5_LOCATION); }
final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2);
@Test public void testThreeSubAtlas() { final Atlas subAtlas1 = this.setup.aSubAtlas(); final Atlas subAtlas2 = this.setup.anotherSubAtlas(); final Atlas subAtlas3 = this.setup.aThirdSubAtlas(); final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2, subAtlas3); // Verify route final Route route = AStarRouter.dijkstra(multiAtlas, Distance.TEN_MILES).route( Location.forString(MultiAtlasBorderFixerTestRule.POINT_1_LOCATION), Location.forString(MultiAtlasBorderFixerTestRule.POINT_5_LOCATION)); Assert.assertEquals(4, route.size()); // Verify this inconsistent edge is gone Assert.assertNull(multiAtlas.edge(223456789120000L)); }
@Test public void testTwoWaySubAtlasWithThreeNodes() { final Atlas subAtlas1 = this.setup.twoWaySubAtlas1From1To3(); final Atlas subAtlas2 = this.setup.twoWaySubAtlas2From1To3(); final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2); // Verify first edge verifyEdge(multiAtlas.edge(123456789120001L), MultiAtlasBorderFixerTestRule.POINT_1_LOCATION, MultiAtlasBorderFixerTestRule.POINT_2_LOCATION); // Verify first reverse edge verifyEdge(multiAtlas.edge(-123456789120001L), MultiAtlasBorderFixerTestRule.POINT_2_LOCATION, MultiAtlasBorderFixerTestRule.POINT_1_LOCATION); // Verify second edge verifyEdge(multiAtlas.edge(123456789120002L), MultiAtlasBorderFixerTestRule.POINT_2_LOCATION, MultiAtlasBorderFixerTestRule.POINT_3_LOCATION); // Verify second edge verifyEdge(multiAtlas.edge(-123456789120002L), MultiAtlasBorderFixerTestRule.POINT_3_LOCATION, MultiAtlasBorderFixerTestRule.POINT_2_LOCATION); } }
@Test public void testOneWaySubAtlasWithRelations() { final Atlas subAtlas1 = this.setup.oneWaySubAtlas1From1To3WithRelations(); final Atlas subAtlas2 = this.setup.oneWaySubAtlas2From1To3WithRelations(); final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2); // Verify first edge verifyEdge(multiAtlas.edge(123456789120001L), MultiAtlasBorderFixerTestRule.POINT_1_LOCATION, MultiAtlasBorderFixerTestRule.POINT_2_LOCATION); // Verify second edge verifyEdge(multiAtlas.edge(123456789120002L), MultiAtlasBorderFixerTestRule.POINT_2_LOCATION, MultiAtlasBorderFixerTestRule.POINT_3_LOCATION); // Verify relations Assert.assertEquals(multiAtlas.edge(123456789120001L).relations().size(), 2); Assert.assertEquals(multiAtlas.edge(123456789120002L).relations().size(), 2); // Verify that relation has members Assert.assertEquals(multiAtlas.relation(987654321L).members().size(), 2); Assert.assertEquals(multiAtlas.relation(887654321L).members().size(), 2); }
@Test public void testThreeWaySubAtlas() { // In this test, fix couldn't be applied and edges from first atlas will be used final Atlas subAtlas1 = this.setup.threeWaySubAtlas1(); final Atlas subAtlas2 = this.setup.threeWaySubAtlas2(); final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2); // Verify these edges exist Assert.assertNotNull(multiAtlas.edge(123456789120001L)); Assert.assertNotNull(multiAtlas.edge(123456789120002L)); Assert.assertNotNull(multiAtlas.edge(123456789120004L)); Assert.assertNotNull(multiAtlas.edge(123456789120005L)); // Verify this edge does NOT exist Assert.assertNull(multiAtlas.edge(123456789120003L)); }
@Test public void testOneWaySubAtlasWithInconsistentRoads() { final Atlas subAtlas1 = this.setup.oneWaySubAtlas1From1To3WithInconsistentRoads(); final Atlas subAtlas2 = this.setup.oneWaySubAtlas2From1To3WithInconsistentRoads(); final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2); // Verify edges are NOT gone even though they were forming an inconsistent road Assert.assertNotNull(multiAtlas.edge(123456789120000L)); Assert.assertNotNull(multiAtlas.edge(123456789120001L)); Assert.assertNotNull(multiAtlas.edge(123456789120002L)); // Verify fixed edges verifyEdge(multiAtlas.edge(223456789120001L), MultiAtlasBorderFixerTestRule.POINT_5_LOCATION, MultiAtlasBorderFixerTestRule.POINT_6_LOCATION); verifyEdge(multiAtlas.edge(223456789120002L), MultiAtlasBorderFixerTestRule.POINT_6_LOCATION, MultiAtlasBorderFixerTestRule.POINT_7_LOCATION); }
@Test public void testOverlappingNodesCrossingEdges() { final Atlas subAtlas1 = this.setup.overlappingAndCrossingSubAtlas1(); final Atlas subAtlas2 = this.setup.overlappingAndCrossingSubAtlas2(); final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2); final Router router = AStarRouter.dijkstra(multiAtlas, Distance.meters(40)); final Route route1 = router.route( Location.forString(MultiAtlasOverlappingNodesFixerTestRule.POINT_5_LOCATION), Location.forString(MultiAtlasOverlappingNodesFixerTestRule.POINT_8_LOCATION)); Assert.assertEquals(2, route1.size()); final Route route2 = router.route( Location.forString(MultiAtlasOverlappingNodesFixerTestRule.POINT_5_LOCATION), Location.forString(MultiAtlasOverlappingNodesFixerTestRule.POINT_9_LOCATION)); Assert.assertEquals(2, route2.size()); }
@Test public void testThreeWayWithLoopSubAtlas() { final Atlas subAtlas1 = this.setup.threeWayWithLoopSubAtlas1(); final Atlas subAtlas2 = this.setup.threeWayWithLoopSubAtlas2(); final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2); // Verify first edge verifyEdge(multiAtlas.edge(123456789120001L), MultiAtlasBorderFixerTestRule.POINT_1_LOCATION, MultiAtlasBorderFixerTestRule.POINT_2_LOCATION); // Verify second edge verifyEdge(multiAtlas.edge(123456789120002L), MultiAtlasBorderFixerTestRule.POINT_2_LOCATION, MultiAtlasBorderFixerTestRule.POINT_3_LOCATION); // Verify third edge verifyEdge(multiAtlas.edge(123456789120003L), MultiAtlasBorderFixerTestRule.POINT_3_LOCATION, MultiAtlasBorderFixerTestRule.POINT_4_LOCATION); // Verify fourth edge verifyEdge(multiAtlas.edge(123456789120004L), MultiAtlasBorderFixerTestRule.POINT_4_LOCATION, MultiAtlasBorderFixerTestRule.POINT_3_LOCATION); // Verify fifth edge verifyEdge(multiAtlas.edge(123456789120005L), MultiAtlasBorderFixerTestRule.POINT_3_LOCATION, MultiAtlasBorderFixerTestRule.POINT_5_LOCATION); }
@Test public void testOneWaySubAtlasWithInconsistentRoadsAndARelation() { final Atlas subAtlas1 = this.setup.oneWaySubAtlas1WithInconsistentRoadsAndARelation(); final Atlas subAtlas2 = this.setup.oneWaySubAtlas2WithInconsistentRoadsAndARelation(); final MultiAtlas multiAtlas = new MultiAtlas(subAtlas1, subAtlas2); // Verify edges are NOT gone even though they were forming an inconsistent road Assert.assertNotNull(multiAtlas.edge(123456789120000L)); Assert.assertNotNull(multiAtlas.edge(123456789120001L)); Assert.assertNotNull(multiAtlas.edge(123456789120002L)); // Verify that relation has members Assert.assertEquals(multiAtlas.relation(987654321L).members().size(), 2); Assert.assertEquals(multiAtlas.relation(887654321L).members().size(), 1); // Verify fixed edges verifyEdge(multiAtlas.edge(223456789120001L), MultiAtlasBorderFixerTestRule.POINT_5_LOCATION, MultiAtlasBorderFixerTestRule.POINT_6_LOCATION); verifyEdge(multiAtlas.edge(223456789120002L), MultiAtlasBorderFixerTestRule.POINT_6_LOCATION, MultiAtlasBorderFixerTestRule.POINT_7_LOCATION); }