@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 3.25 kB
JavaScript
import{create as e,contains as i}from"../../../geometry/support/aaBoundingRect.js";import t from"./TileCache.js";import s from"./TileCoverage.js";import l from"./TileKey.js";const a=new l(0,0,0,0),h=new Map,o=[],c=[];class r{constructor(e){this._previousScale=Number.POSITIVE_INFINITY,this.cachePolicy="keep",this.coveragePolicy="closest",this.resampling=!0,this.tileIndex=new Map,this.tiles=[],this.buffer=192,this.acquireTile=e.acquireTile,this.releaseTile=e.releaseTile,this.tileInfoView=e.tileInfoView,this.resampling=null==e.resampling||!!e.resampling,e.cachePolicy&&(this.cachePolicy=e.cachePolicy),e.coveragePolicy&&(this.coveragePolicy=e.coveragePolicy),null!=e.buffer&&(this.buffer=e.buffer),e.cacheSize&&(this._tileCache=new t(e.cacheSize,this.tileInfoView,(e=>{this.releaseTile(e)})))}destroy(){this.tileIndex.clear()}update(e){const{resampling:i,tileIndex:t}=this,l=this.tileInfoView.getTileCoverage(e.state,this.buffer,this.coveragePolicy);if(c.length=0,o.length=0,h.clear(),!l)return;const{minScale:r,maxScale:n}=this.tileInfoView.tileInfo,{spans:f,lodInfo:d}=l,{level:u}=d,{scale:p,center:g,resolution:y}=e.state,I=!e.stationary&&p>this._previousScale;if(this._previousScale=p,this.tiles.length=0,!i&&(p>r||p<n))return this.tiles.length=0,h.clear(),t.forEach((e=>{this.releaseTile(e)})),t.clear(),c.length=0,o.length=0,h.clear(),s.pool.release(l),!0;t.forEach((e=>e.visible=!0));let T=0,_=0;if(f.length>0)for(const{row:s,colFrom:o,colTo:c}of f)for(let e=o;e<=c;e++){T++;const i=a.set(u,s,d.normalizeCol(e),d.getWorldForColumn(e)).id;if(t.has(i)){const e=t.get(i);e.isReady?(h.set(i,e),_++):I||this._addParentTile(i,h)}else{let e;if(this._tileCache&&this._tileCache.has(i)){if(e=this._tileCache.pop(i),this.tileIndex.set(i,e),e.isReady){h.set(i,e),_++;continue}}else e=this.acquireTile(a),this.tileIndex.set(i,e);I||this._addParentTile(i,h)}}const m=_===T;t.forEach(((e,i)=>{if(a.set(i),h.has(i))return;const t=this.tileInfoView.intersects(l,a),s="purge"===this.cachePolicy?a.level!==u:a.level>u;!t||!I&&m?!s&&t||o.push(i):e.isReady?s&&"purge"===this.cachePolicy&&this._hasReadyAncestor(a,u)?o.push(i):c.push(i):s&&o.push(i)}));for(const s of c){const e=t.get(s);e&&e.isReady&&h.set(s,e)}for(const s of o){const e=t.get(s);this._tileCache?this._tileCache.add(e):this.releaseTile(e),t.delete(s)}return h.forEach((e=>this.tiles.push(e))),t.forEach((e=>{h.has(e.key.id)||(e.visible=!1)})),this._tileCache&&this._tileCache.prune(u,g,y),s.pool.release(l),h.clear(),m}clear(e=!0){const{tileIndex:i}=this;e&&i.forEach((e=>{this.releaseTile(e)})),i.clear()}updateCacheSize(e){this._tileCache&&(this._tileCache.maxSize=e)}_addParentTile(e,i){let t=e,s=null;for(;t=this.tileInfoView.getTileParentId(t),t;)if(this.tileIndex.has(t)){if(s=this.tileIndex.get(t),s&&s.isReady){i.has(s.key.id)||i.set(s.key.id,s);break}}else if(this._tileCache&&this._tileCache.has(t)&&(s=this._tileCache.pop(t),this.tileIndex.set(t,s),s&&s.isReady)){i.has(s.key.id)||i.set(s.key.id,s);break}}_hasReadyAncestor(t,s){const l=e();this.tileInfoView.getTileBounds(l,t,!0);for(const a of this.tileIndex.values())if(a.isReady&&a.key.level>=s&&a.key.level<t.level){const t=e();if(this.tileInfoView.getTileBounds(t,a.key,!0),i(t,l))return!0}return!1}}export{r as default};