mirror of
https://github.com/protomaps/PMTiles.git
synced 2026-02-04 10:51:07 +00:00
force re-sorting of directory if spec v1 detected [#27]
This commit is contained in:
@@ -120,6 +120,14 @@ export const parseEntry = (dataview: DataView, i: number): Entry => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const sortDir = (dataview: DataView): ArrayBuffer => {
|
||||||
|
let entries: Entry[] = [];
|
||||||
|
for (var i = 0; i < dataview.byteLength / 17; i++) {
|
||||||
|
entries.push(parseEntry(dataview, i));
|
||||||
|
}
|
||||||
|
return createDirectory(entries);
|
||||||
|
};
|
||||||
|
|
||||||
export const createDirectory = (entries: Entry[]): ArrayBuffer => {
|
export const createDirectory = (entries: Entry[]): ArrayBuffer => {
|
||||||
entries.sort(entrySort);
|
entries.sort(entrySort);
|
||||||
|
|
||||||
@@ -240,14 +248,21 @@ export class PMTiles {
|
|||||||
|
|
||||||
let a = await resp.arrayBuffer();
|
let a = await resp.arrayBuffer();
|
||||||
let header = parseHeader(new DataView(a, 0, 10));
|
let header = parseHeader(new DataView(a, 0, 10));
|
||||||
|
|
||||||
|
var root_dir = new DataView(
|
||||||
|
a,
|
||||||
|
10 + header.json_size,
|
||||||
|
17 * header.root_entries
|
||||||
|
);
|
||||||
|
if (header.version === 1) {
|
||||||
|
console.log("Sorting pmtiles v1 directory");
|
||||||
|
root_dir = new DataView(sortDir(root_dir));
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
buffer: a,
|
buffer: a,
|
||||||
header: header,
|
header: header,
|
||||||
dir: new DataView(
|
dir: root_dir,
|
||||||
a,
|
|
||||||
10 + header.json_size,
|
|
||||||
17 * header.root_entries
|
|
||||||
),
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -271,7 +286,10 @@ export class PMTiles {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
fetchLeafdir = async (entry: Entry): Promise<ArrayBuffer> => {
|
fetchLeafdir = async (
|
||||||
|
version: number,
|
||||||
|
entry: Entry
|
||||||
|
): Promise<ArrayBuffer> => {
|
||||||
let resp = await fetch(this.url, {
|
let resp = await fetch(this.url, {
|
||||||
headers: {
|
headers: {
|
||||||
Range:
|
Range:
|
||||||
@@ -281,14 +299,25 @@ export class PMTiles {
|
|||||||
(entry.offset + entry.length - 1),
|
(entry.offset + entry.length - 1),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
return await resp.arrayBuffer();
|
var buf = await resp.arrayBuffer();
|
||||||
|
|
||||||
|
if (version === 1) {
|
||||||
|
console.log("Sorting pmtiles v1 directory");
|
||||||
|
buf = sortDir(new DataView(buf));
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf;
|
||||||
};
|
};
|
||||||
|
|
||||||
getLeafdir = async (entry: Entry): Promise<ArrayBuffer> => {
|
getLeafdir = async (
|
||||||
|
version: number,
|
||||||
|
entry: Entry
|
||||||
|
): Promise<ArrayBuffer> => {
|
||||||
let leaf = this.leaves.get(entry.offset);
|
let leaf = this.leaves.get(entry.offset);
|
||||||
if (leaf) return await leaf.buffer;
|
if (leaf) return await leaf.buffer;
|
||||||
|
|
||||||
let buf = this.fetchLeafdir(entry);
|
var buf = this.fetchLeafdir(version, entry);
|
||||||
|
|
||||||
this.leaves.set(entry.offset, {
|
this.leaves.set(entry.offset, {
|
||||||
lastUsed: performance.now(),
|
lastUsed: performance.now(),
|
||||||
buffer: buf,
|
buffer: buf,
|
||||||
@@ -321,7 +350,10 @@ export class PMTiles {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (leafdir_entry) {
|
if (leafdir_entry) {
|
||||||
let leafdir = await this.getLeafdir(leafdir_entry);
|
let leafdir = await this.getLeafdir(
|
||||||
|
root.header.version,
|
||||||
|
leafdir_entry
|
||||||
|
);
|
||||||
return queryTile(new DataView(leafdir), z, x, y);
|
return queryTile(new DataView(leafdir), z, x, y);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
Reference in New Issue
Block a user