mirror of
https://github.com/protomaps/PMTiles.git
synced 2026-02-04 10:51:07 +00:00
source files for faster directory fetches [#26]
This commit is contained in:
48
js/pmtiles.ts
Normal file
48
js/pmtiles.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
export const shift = (n:number, shift:number) => {
|
||||
return n * Math.pow(2, shift);
|
||||
}
|
||||
|
||||
export const unshift = (n:number, shift:number) => {
|
||||
return Math.floor(n / Math.pow(2, shift));
|
||||
}
|
||||
|
||||
export const getUint24 = (view:DataView, pos:number) => {
|
||||
return shift(view.getUint16(pos+1,true),8) + view.getUint8(pos)
|
||||
}
|
||||
|
||||
export const getUint48 = (view:DataView, pos:number) => {
|
||||
return shift(view.getUint32(pos+2,true),16) + view.getUint16(pos,true)
|
||||
}
|
||||
|
||||
const compare = (tz:number,tx:number,ty:number,view:DataView,i:number) => {
|
||||
if (tz != view.getUint8(i)) return tz - view.getUint8(i);
|
||||
var x = getUint24(view,i+1);
|
||||
if (tx != x) return tx - x;
|
||||
var y = getUint24(view,i+4);
|
||||
if (ty != y) return ty - y;
|
||||
return 0;
|
||||
}
|
||||
|
||||
export const getLeafdir = (view:DataView, z:number, x:number, y:number) => {
|
||||
return getTile(view,z | 0x80,x,y);
|
||||
}
|
||||
|
||||
export const getTile = (view:DataView, z:number, x:number, y:number) => {
|
||||
var m = 0;
|
||||
var n = view.byteLength / 17 - 1;
|
||||
while (m <= n) {
|
||||
var k = (n + m) >> 1;
|
||||
var cmp = compare(z,x,y,view,k*17);
|
||||
if (cmp > 0) {
|
||||
m = k + 1;
|
||||
} else if (cmp < 0) {
|
||||
n = k - 1;
|
||||
} else {
|
||||
return {
|
||||
offset:getUint48(view,k*17+7),
|
||||
length:view.getUint32(k*17+13,true)
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
Reference in New Issue
Block a user