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