UNPKG

@doegis/core

Version:

DOE GIS API

3 lines (1 loc) 2.06 kB
import{isSome as e}from"../../../core/maybe.js";import i from"./TileCoverage.js";import t from"./TileKey.js";const s=1e-6;class l{constructor(e){this._tiles=new Map,this.buffer=0,this.acquireTile=e.acquireTile,this.releaseTile=e.releaseTile,this.tileInfoView=e.tileInfoView,this.buffer=e.buffer}destroy(){}clear(){this._tiles.forEach((e=>this._releaseTile(e)))}tileKeys(){const e=[];return this._tiles.forEach(((i,t)=>e.push(t))),e}update(e){const s=this.tileInfoView.getTileCoverage(e.state,this.buffer,"closest"),{spans:l,lodInfo:r}=s,{level:a}=r,o=[],d=[],h=new Set,n=new Set;for(const{row:i,colFrom:c,colTo:f}of l)for(let e=c;e<=f;e++){const s=t.getId(a,i,r.normalizeCol(e),r.getWorldForColumn(e)),l=this._getOrAcquireTile(o,s);h.add(s),l.isReady?l.visible=!0:n.add(l.key)}n.forEach((e=>this._addPlaceholders(h,e))),this._tiles.forEach((e=>{h.has(e.key.id)||(d.push(e.key.id),this._releaseTile(e))})),i.pool.release(s);return{hasMissingTiles:n.size>0,added:o,removed:d}}_getOrAcquireTile(e,i){if(!this._tiles.has(i)){const s=this.acquireTile(new t(i));e.push(i),this._tiles.set(i,s),s.visible=!1}return this._tiles.get(i)}_getTile(e){return this._tiles.get(e)}_releaseTile(e){this._tiles.delete(e.key.id),this.releaseTile(e)}_addPlaceholders(e,i){const t=this._addPlaceholderChildren(e,i);if(!(Math.abs(1-t)<s)){if(!this._addPlaceholderParent(e,i)){this._getTile(i.id).visible=!0}}}_addPlaceholderChildren(e,i){let t=0;return this._tiles.forEach((s=>{t+=this._addPlaceholderChild(e,s,i)})),t}_addPlaceholderChild(e,i,t){if(i.key.level<=t.level||!i.hasData||!t.contains(i.key))return 0;i.visible=!0,e.add(i.key.id);return 1/(1<<2*(i.key.level-t.level))}_addPlaceholderParent(i,t){let s=t.getParentKey(),l=0,r=null;for(;e(s);){if(i.has(s.id))return!0;const e=this._getTile(s.id);if(e?.isReady){for(const e of i){const i=this._getTile(e);i&&s.contains(i.key)&&(i.visible=!1)}return e.visible=!0,i.add(e.key.id),!0}e?.hasData&&e.patchCount>l&&(l=e.patchCount,r=e),s=s.getParentKey()}return!!r&&(r.visible=!0,i.add(r.key.id),!0)}}export{l as TileManager};