in baremaps-core/src/main/java/org/apache/baremaps/tasks/ExportVectorTiles.java [99:170]
public void execute(WorkflowContext context) throws Exception {
var configReader = new ConfigReader();
var objectMapper = objectMapper();
var tilesetObject = objectMapper.readValue(configReader.read(this.tileset), Tileset.class);
var styleObject = objectMapper.readValue(configReader.read(this.style), Style.class);
// Write the static files
var directory = switch (format) {
case FILE -> repository;
case MBTILES -> repository.getParent();
case PMTILES -> repository.getParent();
};
Files.createDirectories(directory);
try (var html = this.getClass().getResourceAsStream("/static/server.html")) {
Files.write(
directory.resolve("index.html"),
html.readAllBytes(),
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING);
}
Files.write(
directory.resolve("tiles.json"),
objectMapper.writeValueAsBytes(tilesetObject),
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING);
Files.write(
directory.resolve("style.json"),
objectMapper.writeValueAsBytes(styleObject),
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING);
var datasource = context.getDataSource(tilesetObject.getDatabase());
try (var sourceTileStore = sourceTileStore(tilesetObject, datasource);
var targetTileStore = targetTileStore(tilesetObject)) {
var envelope = tilesetObject.getBounds().size() == 4
? new Envelope(
tilesetObject.getBounds().get(0), tilesetObject.getBounds().get(2),
tilesetObject.getBounds().get(1), tilesetObject.getBounds().get(3))
: new Envelope(-180, 180, -85.0511, 85.0511);
var count = TileCoord.count(envelope, tilesetObject.getMinzoom(), tilesetObject.getMaxzoom());
var start = System.currentTimeMillis();
var tileCoordIterator =
TileCoord.iterator(envelope, tilesetObject.getMinzoom(), tilesetObject.getMaxzoom());
var tileCoordStream =
StreamUtils.stream(tileCoordIterator).peek(new ProgressLogger<>(count, 5000));
var bufferedTileEntryStream = StreamUtils.bufferInCompletionOrder(tileCoordStream, tile -> {
try {
return new TileEntry<>(tile, sourceTileStore.read(tile));
} catch (TileStoreException e) {
throw new WorkflowException(e);
}
}, 1000);
var partitionedTileEntryStream = StreamUtils.partition(bufferedTileEntryStream, 1000);
partitionedTileEntryStream.forEach(batch -> {
try {
targetTileStore.write(batch);
} catch (TileStoreException e) {
throw new WorkflowException(e);
}
});
var stop = System.currentTimeMillis();
logger.info("Exported {} tiles in {}s", count, (stop - start) / 1000);
}
}