mirror of
https://github.com/protomaps/PMTiles.git
synced 2026-02-04 10:51:07 +00:00
code style cleanup
This commit is contained in:
107
js/pmtiles.ts
107
js/pmtiles.ts
@@ -1,4 +1,4 @@
|
|||||||
declare var L: any;
|
declare const L: any;
|
||||||
|
|
||||||
export const shift = (n: number, shift: number) => {
|
export const shift = (n: number, shift: number) => {
|
||||||
return n * Math.pow(2, shift);
|
return n * Math.pow(2, shift);
|
||||||
@@ -57,9 +57,9 @@ const compare = (
|
|||||||
i: number
|
i: number
|
||||||
) => {
|
) => {
|
||||||
if (tz != view.getUint8(i)) return tz - view.getUint8(i);
|
if (tz != view.getUint8(i)) return tz - view.getUint8(i);
|
||||||
var x = getUint24(view, i + 1);
|
const x = getUint24(view, i + 1);
|
||||||
if (tx != x) return tx - x;
|
if (tx != x) return tx - x;
|
||||||
var y = getUint24(view, i + 4);
|
const y = getUint24(view, i + 4);
|
||||||
if (ty != y) return ty - y;
|
if (ty != y) return ty - y;
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
@@ -70,7 +70,7 @@ export const queryLeafdir = (
|
|||||||
x: number,
|
x: number,
|
||||||
y: number
|
y: number
|
||||||
): Entry | null => {
|
): Entry | null => {
|
||||||
let offset_len = queryView(view, z | 0x80, x, y);
|
const offset_len = queryView(view, z | 0x80, x, y);
|
||||||
if (offset_len) {
|
if (offset_len) {
|
||||||
return {
|
return {
|
||||||
z: z,
|
z: z,
|
||||||
@@ -85,7 +85,7 @@ export const queryLeafdir = (
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const queryTile = (view: DataView, z: number, x: number, y: number) => {
|
export const queryTile = (view: DataView, z: number, x: number, y: number) => {
|
||||||
let offset_len = queryView(view, z, x, y);
|
const offset_len = queryView(view, z, x, y);
|
||||||
if (offset_len) {
|
if (offset_len) {
|
||||||
return {
|
return {
|
||||||
z: z,
|
z: z,
|
||||||
@@ -105,11 +105,11 @@ const queryView = (
|
|||||||
x: number,
|
x: number,
|
||||||
y: number
|
y: number
|
||||||
): [number, number] | null => {
|
): [number, number] | null => {
|
||||||
var m = 0;
|
let m = 0;
|
||||||
var n = view.byteLength / 17 - 1;
|
let n = view.byteLength / 17 - 1;
|
||||||
while (m <= n) {
|
while (m <= n) {
|
||||||
var k = (n + m) >> 1;
|
const k = (n + m) >> 1;
|
||||||
var cmp = compare(z, x, y, view, k * 17);
|
const cmp = compare(z, x, y, view, k * 17);
|
||||||
if (cmp > 0) {
|
if (cmp > 0) {
|
||||||
m = k + 1;
|
m = k + 1;
|
||||||
} else if (cmp < 0) {
|
} else if (cmp < 0) {
|
||||||
@@ -123,8 +123,8 @@ const queryView = (
|
|||||||
|
|
||||||
export const queryLeafLevel = (view: DataView): number | null => {
|
export const queryLeafLevel = (view: DataView): number | null => {
|
||||||
if (view.byteLength < 17) return null;
|
if (view.byteLength < 17) return null;
|
||||||
let numEntries = view.byteLength / 17;
|
const numEntries = view.byteLength / 17;
|
||||||
let entry = parseEntry(view, numEntries - 1);
|
const entry = parseEntry(view, numEntries - 1);
|
||||||
if (entry.is_dir) return entry.z;
|
if (entry.is_dir) return entry.z;
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
@@ -146,8 +146,8 @@ const entrySort = (a: Entry, b: Entry): number => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const parseEntry = (dataview: DataView, i: number): Entry => {
|
export const parseEntry = (dataview: DataView, i: number): Entry => {
|
||||||
var z_raw = dataview.getUint8(i * 17);
|
const z_raw = dataview.getUint8(i * 17);
|
||||||
var z = z_raw & 127;
|
const z = z_raw & 127;
|
||||||
return {
|
return {
|
||||||
z: z,
|
z: z,
|
||||||
x: getUint24(dataview, i * 17 + 1),
|
x: getUint24(dataview, i * 17 + 1),
|
||||||
@@ -159,8 +159,8 @@ export const parseEntry = (dataview: DataView, i: number): Entry => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const sortDir = (dataview: DataView): ArrayBuffer => {
|
export const sortDir = (dataview: DataView): ArrayBuffer => {
|
||||||
let entries: Entry[] = [];
|
const entries: Entry[] = [];
|
||||||
for (var i = 0; i < dataview.byteLength / 17; i++) {
|
for (let i = 0; i < dataview.byteLength / 17; i++) {
|
||||||
entries.push(parseEntry(dataview, i));
|
entries.push(parseEntry(dataview, i));
|
||||||
}
|
}
|
||||||
return createDirectory(entries);
|
return createDirectory(entries);
|
||||||
@@ -169,11 +169,11 @@ export const sortDir = (dataview: DataView): ArrayBuffer => {
|
|||||||
export const createDirectory = (entries: Entry[]): ArrayBuffer => {
|
export const createDirectory = (entries: Entry[]): ArrayBuffer => {
|
||||||
entries.sort(entrySort);
|
entries.sort(entrySort);
|
||||||
|
|
||||||
let buffer = new ArrayBuffer(17 * entries.length);
|
const buffer = new ArrayBuffer(17 * entries.length);
|
||||||
let arr = new Uint8Array(buffer);
|
const arr = new Uint8Array(buffer);
|
||||||
for (var i = 0; i < entries.length; i++) {
|
for (let i = 0; i < entries.length; i++) {
|
||||||
var entry = entries[i];
|
const entry = entries[i];
|
||||||
var z = entry.z;
|
let z = entry.z;
|
||||||
if (entry.is_dir) z = z | 0x80;
|
if (entry.is_dir) z = z | 0x80;
|
||||||
arr[i * 17] = z;
|
arr[i * 17] = z;
|
||||||
|
|
||||||
@@ -203,22 +203,22 @@ export const createDirectory = (entries: Entry[]): ArrayBuffer => {
|
|||||||
export const deriveLeaf = (root: Root, tile: Zxy): Zxy | null => {
|
export const deriveLeaf = (root: Root, tile: Zxy): Zxy | null => {
|
||||||
const leaf_level = queryLeafLevel(root.dir);
|
const leaf_level = queryLeafLevel(root.dir);
|
||||||
if (leaf_level) {
|
if (leaf_level) {
|
||||||
let level_diff = tile.z - leaf_level;
|
const level_diff = tile.z - leaf_level;
|
||||||
let leaf_x = Math.trunc(tile.x / (1 << level_diff));
|
const leaf_x = Math.trunc(tile.x / (1 << level_diff));
|
||||||
let leaf_y = Math.trunc(tile.y / (1 << level_diff));
|
const leaf_y = Math.trunc(tile.y / (1 << level_diff));
|
||||||
return { z: leaf_level, x: leaf_x, y: leaf_y };
|
return { z: leaf_level, x: leaf_x, y: leaf_y };
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const parseHeader = (dataview: DataView): Header => {
|
export const parseHeader = (dataview: DataView): Header => {
|
||||||
var magic = dataview.getUint16(0, true);
|
const magic = dataview.getUint16(0, true);
|
||||||
if (magic !== 19792) {
|
if (magic !== 19792) {
|
||||||
throw new Error('File header does not begin with "PM"');
|
throw new Error('File header does not begin with "PM"');
|
||||||
}
|
}
|
||||||
var version = dataview.getUint16(2, true);
|
const version = dataview.getUint16(2, true);
|
||||||
var json_size = dataview.getUint32(4, true);
|
const json_size = dataview.getUint32(4, true);
|
||||||
var root_entries = dataview.getUint16(8, true);
|
const root_entries = dataview.getUint16(8, true);
|
||||||
return {
|
return {
|
||||||
version: version,
|
version: version,
|
||||||
json_size: json_size,
|
json_size: json_size,
|
||||||
@@ -232,7 +232,7 @@ export class PMTiles {
|
|||||||
leaves: Map<number, CachedLeaf>;
|
leaves: Map<number, CachedLeaf>;
|
||||||
maxLeaves: number;
|
maxLeaves: number;
|
||||||
|
|
||||||
constructor(url: string, maxLeaves: number = 64) {
|
constructor(url: string, maxLeaves = 64) {
|
||||||
this.root = null;
|
this.root = null;
|
||||||
this.url = url;
|
this.url = url;
|
||||||
this.leaves = new Map<number, CachedLeaf>();
|
this.leaves = new Map<number, CachedLeaf>();
|
||||||
@@ -242,11 +242,11 @@ export class PMTiles {
|
|||||||
async fetchRoot(url: string): Promise<Root> {
|
async fetchRoot(url: string): Promise<Root> {
|
||||||
const controller = new AbortController();
|
const controller = new AbortController();
|
||||||
const signal = controller.signal;
|
const signal = controller.signal;
|
||||||
let resp = await fetch(url, {
|
const resp = await fetch(url, {
|
||||||
signal: signal,
|
signal: signal,
|
||||||
headers: { Range: "bytes=0-511999" },
|
headers: { Range: "bytes=0-511999" },
|
||||||
});
|
});
|
||||||
let contentLength = resp.headers.get("Content-Length");
|
const contentLength = resp.headers.get("Content-Length");
|
||||||
if (!contentLength || +contentLength !== 512000) {
|
if (!contentLength || +contentLength !== 512000) {
|
||||||
console.error(
|
console.error(
|
||||||
"Content-Length mismatch indicates byte serving not supported; aborting."
|
"Content-Length mismatch indicates byte serving not supported; aborting."
|
||||||
@@ -254,10 +254,10 @@ export class PMTiles {
|
|||||||
controller.abort();
|
controller.abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
let a = await resp.arrayBuffer();
|
const a = await resp.arrayBuffer();
|
||||||
let header = parseHeader(new DataView(a, 0, 10));
|
const header = parseHeader(new DataView(a, 0, 10));
|
||||||
|
|
||||||
var root_dir = new DataView(
|
let root_dir = new DataView(
|
||||||
a,
|
a,
|
||||||
10 + header.json_size,
|
10 + header.json_size,
|
||||||
17 * header.root_entries
|
17 * header.root_entries
|
||||||
@@ -281,9 +281,9 @@ export class PMTiles {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async metadata(): Promise<any> {
|
async metadata(): Promise<any> {
|
||||||
let root = await this.getRoot();
|
const root = await this.getRoot();
|
||||||
let dec = new TextDecoder("utf-8");
|
const dec = new TextDecoder("utf-8");
|
||||||
let result = JSON.parse(
|
const result = JSON.parse(
|
||||||
dec.decode(new DataView(root.buffer, 10, root.header.json_size))
|
dec.decode(new DataView(root.buffer, 10, root.header.json_size))
|
||||||
);
|
);
|
||||||
if (result.compression) {
|
if (result.compression) {
|
||||||
@@ -310,13 +310,13 @@ export class PMTiles {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fetchLeafdir(version: number, entry: Entry): Promise<ArrayBuffer> {
|
async fetchLeafdir(version: number, entry: Entry): Promise<ArrayBuffer> {
|
||||||
let resp = await fetch(this.url, {
|
const resp = await fetch(this.url, {
|
||||||
headers: {
|
headers: {
|
||||||
Range:
|
Range:
|
||||||
"bytes=" + entry.offset + "-" + (entry.offset + entry.length - 1),
|
"bytes=" + entry.offset + "-" + (entry.offset + entry.length - 1),
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
var buf = await resp.arrayBuffer();
|
let buf = await resp.arrayBuffer();
|
||||||
|
|
||||||
if (version === 1) {
|
if (version === 1) {
|
||||||
console.warn("Sorting pmtiles v1 directory.");
|
console.warn("Sorting pmtiles v1 directory.");
|
||||||
@@ -327,18 +327,18 @@ export class PMTiles {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async getLeafdir(version: number, entry: Entry): Promise<ArrayBuffer> {
|
async getLeafdir(version: number, entry: Entry): Promise<ArrayBuffer> {
|
||||||
let leaf = this.leaves.get(entry.offset);
|
const leaf = this.leaves.get(entry.offset);
|
||||||
if (leaf) return await leaf.buffer;
|
if (leaf) return await leaf.buffer;
|
||||||
|
|
||||||
var buf = this.fetchLeafdir(version, entry);
|
const 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,
|
||||||
});
|
});
|
||||||
if (this.leaves.size > this.maxLeaves) {
|
if (this.leaves.size > this.maxLeaves) {
|
||||||
var minUsed = Infinity;
|
let minUsed = Infinity;
|
||||||
var minKey = undefined;
|
let minKey = undefined;
|
||||||
this.leaves.forEach((val, key) => {
|
this.leaves.forEach((val, key) => {
|
||||||
if (val.lastUsed < minUsed) {
|
if (val.lastUsed < minUsed) {
|
||||||
minUsed = val.lastUsed;
|
minUsed = val.lastUsed;
|
||||||
@@ -351,20 +351,23 @@ export class PMTiles {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async getZxy(z: number, x: number, y: number): Promise<Entry | null> {
|
async getZxy(z: number, x: number, y: number): Promise<Entry | null> {
|
||||||
let root = await this.getRoot();
|
const root = await this.getRoot();
|
||||||
let entry = queryTile(root.dir, z, x, y);
|
const entry = queryTile(root.dir, z, x, y);
|
||||||
if (entry) return entry;
|
if (entry) return entry;
|
||||||
|
|
||||||
let leafcoords = deriveLeaf(root, { z: z, x: x, y: y });
|
const leafcoords = deriveLeaf(root, { z: z, x: x, y: y });
|
||||||
if (leafcoords) {
|
if (leafcoords) {
|
||||||
let leafdir_entry = queryLeafdir(
|
const leafdir_entry = queryLeafdir(
|
||||||
root.dir,
|
root.dir,
|
||||||
leafcoords.z,
|
leafcoords.z,
|
||||||
leafcoords.x,
|
leafcoords.x,
|
||||||
leafcoords.y
|
leafcoords.y
|
||||||
);
|
);
|
||||||
if (leafdir_entry) {
|
if (leafdir_entry) {
|
||||||
let leafdir = await this.getLeafdir(root.header.version, leafdir_entry);
|
const 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -373,9 +376,9 @@ export class PMTiles {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const leafletLayer = (source: PMTiles, options: any) => {
|
export const leafletLayer = (source: PMTiles, options: any) => {
|
||||||
var cls = L.GridLayer.extend({
|
const cls = L.GridLayer.extend({
|
||||||
createTile: function (coord: any, done: any) {
|
createTile: function (coord: any, done: any) {
|
||||||
var tile: any = document.createElement("img");
|
const tile: any = document.createElement("img");
|
||||||
source.getZxy(coord.z, coord.x, coord.y).then((result) => {
|
source.getZxy(coord.z, coord.x, coord.y).then((result) => {
|
||||||
if (result === null) return;
|
if (result === null) return;
|
||||||
|
|
||||||
@@ -398,8 +401,8 @@ export const leafletLayer = (source: PMTiles, options: any) => {
|
|||||||
return resp.arrayBuffer();
|
return resp.arrayBuffer();
|
||||||
})
|
})
|
||||||
.then((buf) => {
|
.then((buf) => {
|
||||||
var blob = new Blob([buf], { type: "image/png" });
|
const blob = new Blob([buf], { type: "image/png" });
|
||||||
var imageUrl = window.URL.createObjectURL(blob);
|
const imageUrl = window.URL.createObjectURL(blob);
|
||||||
tile.src = imageUrl;
|
tile.src = imageUrl;
|
||||||
tile.cancel = null;
|
tile.cancel = null;
|
||||||
done(null, tile);
|
done(null, tile);
|
||||||
@@ -412,7 +415,7 @@ export const leafletLayer = (source: PMTiles, options: any) => {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_removeTile: function (key: string) {
|
_removeTile: function (key: string) {
|
||||||
var tile = this._tiles[key];
|
const tile = this._tiles[key];
|
||||||
if (!tile) {
|
if (!tile) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user