public record ExportVectorTiles()

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;
  }

}