diff --git a/js/pmtiles.test.ts b/js/pmtiles.test.ts index daf6bad..f7153fc 100644 --- a/js/pmtiles.test.ts +++ b/js/pmtiles.test.ts @@ -5,6 +5,7 @@ import { getUint48, queryLeafdir, queryTile, + parseEntry, Entry, createDirectory, } from "./pmtiles"; @@ -112,4 +113,11 @@ test("convert spec v1 directory to spec v2 directory", (assertion) => { assertion.ok(entry!.offset === 2); entry = queryTile(view, 6, 2, 1); assertion.ok(entry!.offset === 1); + + entry = parseEntry(view, 0); + assertion.ok(entry!.offset === 1); + entry = parseEntry(view, 1); + assertion.ok(entry!.offset === 2); + entry = parseEntry(view, 2); + assertion.ok(entry!.offset === 3); }); diff --git a/js/pmtiles.ts b/js/pmtiles.ts index cb199a2..2176a11 100644 --- a/js/pmtiles.ts +++ b/js/pmtiles.ts @@ -105,6 +105,19 @@ const entrySort = (a: Entry, b: Entry): number => { return a.y - b.y; }; +export const parseEntry = (dataview: DataView, i: number): Entry => { + var z_raw = dataview.getUint8(i * 17); + var z = z_raw & 127; + return { + z: z, + x: getUint24(dataview, i * 17 + 1), + y: getUint24(dataview, i * 17 + 4), + offset: getUint48(dataview, i * 17 + 7), + length: dataview.getUint32(i * 17 + 13, true), + is_dir: z_raw >> 7 === 1, + }; +}; + export const createDirectory = (entries: Entry[]): ArrayBuffer => { entries.sort(entrySort); @@ -145,7 +158,7 @@ interface Zxy { y: number; } -// handle different leaf levels +// TODO: handle different leaf levels export const deriveLeaf = (tile: Zxy): Zxy => { let z7_tile_diff = tile.z - 7; let z7_x = Math.trunc(tile.x / (1 << z7_tile_diff)); @@ -153,11 +166,6 @@ export const deriveLeaf = (tile: Zxy): Zxy => { return { z: 7, x: z7_x, y: z7_y }; }; -// needed to convert a spec v1 to a spec v2 -const sortEntries = (dataview: DataView): ArrayBuffer => { - return new ArrayBuffer(0); -}; - interface Header { version: number; json_size: number;