UNPKG

s2-tools

Version:

A collection of geospatial tools primarily designed for WGS84, Web Mercator, and S2.

73 lines 2.91 kB
import { HEADER_SIZE_BYTES } from '../../readers/pmtiles'; import { writeVarint } from './varint'; /** * Create raw header bytes from a Header object. * @param header - the header object * @returns the raw header bytes */ export function headerToBytes(header) { const dv = new DataView(new ArrayBuffer(HEADER_SIZE_BYTES)); dv.setUint16(0, 0x4d50, true); dv.setUint8(7, header.specVersion); setUint64(dv, 8, header.rootDirectoryOffset); setUint64(dv, 16, header.rootDirectoryLength); setUint64(dv, 24, header.jsonMetadataOffset); setUint64(dv, 32, header.jsonMetadataLength); setUint64(dv, 40, header.leafDirectoryOffset); setUint64(dv, 48, header.leafDirectoryLength ?? 0); setUint64(dv, 56, header.tileDataOffset); setUint64(dv, 64, header.tileDataLength ?? 0); setUint64(dv, 72, header.numAddressedTiles); setUint64(dv, 80, header.numTileEntries); setUint64(dv, 88, header.numTileContents); dv.setUint8(96, header.clustered ? 1 : 0); dv.setUint8(97, header.internalCompression); dv.setUint8(98, header.tileCompression); dv.setUint8(99, header.tileType); dv.setUint8(100, header.minZoom); dv.setUint8(101, header.maxZoom); return new Uint8Array(dv.buffer, dv.byteOffset, dv.byteLength); } /** * Serialize a directory of entires into a buffer * @param entries - the directory entries * @returns - the serialized directory */ export function serializeDir(entries) { const data = { buf: new Uint8Array(0), pos: 0 }; writeVarint(entries.length, data); let lastID = 0; for (let i = 0; i < entries.length; i++) { const diff = entries[i].tileID - lastID; writeVarint(diff, data); lastID = entries[i].tileID; } for (let i = 0; i < entries.length; i++) writeVarint(entries[i].runLength, data); for (let i = 0; i < entries.length; i++) writeVarint(entries[i].length, data); for (let i = 0; i < entries.length; i++) { if (i > 0 && entries[i].offset === entries[i - 1].offset + entries[i - 1].length) { writeVarint(0, data); } else { writeVarint(entries[i].offset + 1, data); } } return new Uint8Array(data.buf.buffer, data.buf.byteOffset, data.pos); } /** * Take a large 64-bit number and encode it into a DataView * @param dv - a DataView * @param offset - the offset in the DataView * @param value - the encoded 64-bit number */ export function setUint64(dv, offset, value) { // dv.setUint32(offset + 4, value % 2 ** 32, true); // dv.setUint32(offset, Math.floor(value / 2 ** 32), true); const wh = Math.floor(value / 2 ** 32); const wl = value >>> 0; // Keep the lower 32 bits as an unsigned 32-bit integer dv.setUint32(offset, wl, true); // Set the lower 32 bits dv.setUint32(offset + 4, wh, true); // Set the upper 32 bits } //# sourceMappingURL=pmtiles.js.map