mirror of
https://github.com/protomaps/PMTiles.git
synced 2026-02-04 10:51:07 +00:00
48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
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;
|
|
} |