public void write()

in baremaps-pmtiles/src/main/java/org/apache/baremaps/pmtiles/PMTilesWriter.java [255:317]


  public void write() throws IOException {
    if (isClosed) {
      throw new IOException("PMTilesWriter has been closed");
    }

    // Sort the entries by tile id
    if (!clustered) {
      entries.sort(Comparator.comparingLong(Entry::getTileId));
    }

    var directories = directorySerializer.optimizeDirectories(entries, 16247, compression);

    byte[] metadataBytes;
    try (var metadataOutput = new ByteArrayOutputStream()) {
      try (var compressedMetadataOutput = compression.compress(metadataOutput)) {
        new ObjectMapper().writeValue(compressedMetadataOutput, metadata);
      }
      metadataBytes = metadataOutput.toByteArray();
    }

    var rootOffset = 127;
    var rootLength = directories.getRoot().length;
    var metadataOffset = rootOffset + rootLength;
    var metadataLength = metadataBytes.length;
    var leavesOffset = metadataOffset + metadataLength;
    var leavesLength = directories.getLeaves().length;
    var tilesOffset = leavesOffset + leavesLength;
    var tilesLength = Files.size(tilePath);
    var numTiles = entries.size();

    // Use builder pattern for creating Header
    var header = Header.builder()
        .numAddressedTiles(numTiles)
        .numTileEntries(numTiles)
        .numTileContents(tileHashToOffset.size())
        .clustered(true)
        .internalCompression(compression)
        .tileCompression(compression)
        .tileType(TileType.MVT)
        .rootDirectoryOffset(rootOffset)
        .rootDirectoryLength(rootLength)
        .jsonMetadataOffset(metadataOffset)
        .jsonMetadataLength(metadataLength)
        .leafDirectoryOffset(leavesOffset)
        .leafDirectoryLength(leavesLength)
        .tileDataOffset(tilesOffset)
        .tileDataLength(tilesLength)
        .minZoom(minZoom)
        .maxZoom(maxZoom)
        .bounds(minLon, minLat, maxLon, maxLat)
        .center(centerZoom, centerLon, centerLat)
        .build();

    try (var output = new FileOutputStream(path.toFile())) {
      headerSerializer.serialize(header, output);
      output.write(directories.getRoot());
      output.write(metadataBytes);
      output.write(directories.getLeaves());
      Files.copy(tilePath, output);
    } finally {
      close();
    }
  }