UNPKG

flatgeobuf

Version:

A performant binary encoding for geographic data

2 lines 1.84 kB
import e from"./config.js";export const NODE_ITEM_BYTE_LEN=40;export const NODE_ITEM_LEN=40;export const DEFAULT_NODE_SIZE=16;export function calcTreeSize(e,t){t=Math.min(Math.max(+t,2),65535);let l=e,n=l;do n+=l=Math.ceil(l/t);while(1!==l)return 40*n}export function generateLevelBounds(e,t){if(t<2)throw Error("Node size must be at least 2");if(0===e)throw Error("Number of items must be greater than 0");let l=e,n=l,o=[l];do n+=l=Math.ceil(l/t),o.push(l);while(1!==l)let r=[];for(let e of(l=n,o))r.push(l-e),l-=e;let i=[];for(let e=0;e<o.length;e++)i.push([r[e],r[e]+o[e]]);return i}export async function*streamSearch(t,l,n,o){class r{_level;nodes;constructor(e,t){this._level=t,this.nodes=e}level(){return this._level}startNodeIdx(){return this.nodes[0]}endNodeIdx(){return this.nodes[1]}extendEndNodeIdx(e){this.nodes[1]=e}toString(){return`[NodeRange level: ${this._level}, nodes: ${this.nodes[0]}-${this.nodes[1]}]`}}let{minX:i,minY:s,maxX:d,maxY:u}=n,h=generateLevelBounds(t,l),a=h[0][0],N=[new r([0,1],h.length-1)];for(;0!==N.length;){let n=N.shift(),c=n.startNodeIdx(),g=c>=a,f=(()=>{let[,e]=h[n.level()],t=Math.min(n.endNodeIdx()+l,e);return g&&t<e?t+1:t})(),x=f-c,v=new DataView(await o(40*c,40*x));for(let l=c;l<f;l++){let o=l-c,h=40*o;if(d<v.getFloat64(h+0,!0)||u<v.getFloat64(h+8,!0)||i>v.getFloat64(h+16,!0)||s>v.getFloat64(h+24,!0))continue;let f=v.getBigUint64(h+32,!0);if(g){let e=(()=>{if(l<t-1){let e=(o+1)*40;return v.getBigUint64(e+32,!0)-f}return null})(),n=l-a;yield[Number(f),n,Number(e)];continue}let x=e.global.extraRequestThreshold()/40,m=N[N.length-1];if(void 0!==m&&m.level()===n.level()-1&&f<m.endNodeIdx()+x){m.extendEndNodeIdx(Number(f));continue}let E=(()=>{let e=n.level()-1;return new r([Number(f),Number(f)+1],e)})();void 0!==m&&(m.level(),E.level()),N.push(E)}}} //# sourceMappingURL=packedrtree.js.map