in baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ExportVectorTiles.java [42:134]
public record ExportVectorTiles(
Path tileset,
Path repository,
int batchArraySize,
int batchArrayIndex,
boolean mbtiles) implements Task {
private static final Logger logger = LoggerFactory.getLogger(ExportVectorTiles.class);
@Override
public void execute(WorkflowContext context) throws Exception {
var configReader = new ConfigReader();
var objectMapper = objectMapper();
var tileset = objectMapper.readValue(configReader.read(this.tileset), Tileset.class);
var datasource = context.getDataSource(tileset.getDatabase());
var sourceTileStore = sourceTileStore(tileset, datasource);
var targetTileStore = targetTileStore(tileset);
var envelope = tileset.getBounds().size() == 4
? new Envelope(
tileset.getBounds().get(0), tileset.getBounds().get(2),
tileset.getBounds().get(1), tileset.getBounds().get(3))
: new Envelope(-180, 180, -85.0511, 85.0511);
var count = TileCoord.count(envelope, tileset.getMinzoom(), tileset.getMaxzoom());
var stream =
StreamUtils.stream(TileCoord.iterator(envelope, tileset.getMinzoom(), tileset.getMaxzoom()))
.peek(new ProgressLogger<>(count, 5000));
StreamUtils.batch(stream, 10).forEach(new TileChannel(sourceTileStore, targetTileStore));
}
private TileStore sourceTileStore(Tileset tileset, DataSource datasource) {
return new PostgresTileStore(datasource, tileset);
}
private TileStore targetTileStore(Tileset source) throws TileStoreException, IOException {
if (mbtiles) {
Files.deleteIfExists(repository);
var dataSource = SqliteUtils.createDataSource(repository);
var tilesStore = new MBTilesStore(dataSource);
tilesStore.initializeDatabase();
tilesStore.writeMetadata(metadata(source));
return tilesStore;
} else {
return new FileTileStore(repository);
}
}
private Map<String, String> metadata(Tileset tileset) throws JsonProcessingException {
var metadata = new HashMap<String, String>();
metadata.put("name", tileset.getName());
metadata.put("version", tileset.getVersion());
metadata.put("description", tileset.getDescription());
metadata.put("attribution", tileset.getAttribution());
metadata.put("type", "baselayer");
metadata.put("format", "pbf");
metadata.put(
"center",
tileset.getCenter().stream().map(Number::toString).collect(Collectors.joining(", ")));
metadata.put(
"bounds",
tileset.getBounds().stream().map(Object::toString).collect(Collectors.joining(", ")));
metadata.put("minzoom", Double.toString(tileset.getMinzoom()));
metadata.put("maxzoom", Double.toString(tileset.getMaxzoom()));
var layers =
tileset.getVectorLayers().stream()
.map(
layer -> {
Map<String, Object> map = new HashMap<>();
map.put("id", layer.getId());
map.put("description", layer.getDescription());
map.put(
"minzoom",
layer.getQueries().stream().mapToInt(TilesetQuery::getMinzoom).min()
.getAsInt());
map.put(
"maxzoom",
layer.getQueries().stream().mapToInt(TilesetQuery::getMaxzoom).max()
.getAsInt());
return map;
})
.toList();
metadata.put("json", new ObjectMapper().writeValueAsString(layers));
return metadata;
}
}