@doegis/core
Version:
DOE GIS API
3 lines (1 loc) • 1.46 kB
JavaScript
import{k as e}from"../../../chunks/vec2.js";class t{constructor(e,t,i){this.maxSize=e,this._tileInfoView=t,this._removedFunc=i,this._tilePerId=new Map,this._tileKeysPerLevel=[]}has(e){return this._tilePerId.has(e)}get(e){return this._tilePerId.get(e)}pop(e){const t=this._tilePerId.get(e);if(!t)return;const s=t.key.level,r=this._tileKeysPerLevel[s];i(this._tilePerId,e);for(let i=0;i<r.length;i++)if(r[i].id===e){r.splice(i,1);break}return t.visible=!0,t}add(e){e.visible=!1;const t=e.key,i=t.id;if(this._tilePerId.has(i))return;this._tilePerId.set(i,e);const s=t.level;this._tileKeysPerLevel[s]||(this._tileKeysPerLevel[s]=[]),this._tileKeysPerLevel[s].push(t)}prune(e,t,i){let s=this._tilePerId.size;if(s<=this.maxSize)return;let r=this._tileKeysPerLevel.length-1;for(;s>this.maxSize&&r>=0;)r!==e&&(s=this._pruneAroundCenterTile(s,t,i,r)),r--;s>this.maxSize&&(s=this._pruneAroundCenterTile(s,t,i,e))}_pruneAroundCenterTile(t,i,s,r){const l=this._tileKeysPerLevel[r];if(!l||0===l.length)return t;const{size:n,origin:h}=this._tileInfoView.tileInfo,o=s*n[0],_=s*n[1],d=[0,0],u=[0,0];for(l.sort(((t,s)=>(d[0]=h.x+o*(t.col+.5),d[1]=h.y-_*(t.row+.5),u[0]=h.x+o*(s.col+.5),u[1]=h.y-_*(s.row+.5),e(d,i)-e(u,i))));l.length>0;){const e=l.pop();if(this._removeTile(e.id),--t===this.maxSize)break}return t}_removeTile(e){const t=this._tilePerId.get(e);this._removedFunc&&t&&this._removedFunc(t),i(this._tilePerId,e)}}function i(e,t){e.delete(t)}export{t as default};