@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 3.61 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import e from"../../../geometry/Point.js";import n from"./EphemeralBlockCache.js";import{projectExtent as t,projectResolution as o,snapPyramid as l}from"../functions/rasterProjectionHelper.js";const r=new Map,c=new n;function i(e,n,t){const o=[];return null!=n&&o.push(`sliceId=${n}`),null!=t&&o.push(`bandIds=${t.join(",")}`),o.length?`${e}?${o.join("&")}`:e}function u(e,n){const t={extent:null,rasterInfo:n,cache:new Map},o=r.get(e);return o?(o.push(t),o.length-1):(r.set(e,[t]),0)}function a(e,n){const t=r.get(e);t&&(t[n]=null,t.some(e=>null!=e)||s(e))}function f(e,n){const t=r.get(e);if(t){const e=n.map(e=>t[e]).filter(e=>null!=e);for(const n of e)if(n){Array.from(n.cache.values()).forEach(e=>{e.isResolved||e.isRejected||!e.controller||e.controller.abort()}),n.cache.clear()}}}function s(e){r.delete(e)}function m(e,n,t){const o=r.get(e);if(!o)return null==n?c.decreaseRefCount(e,t):0;if(null==n||null==o[n])return c.decreaseRefCount(e,t);const l=o[n]?.cache,i=l?.get(t);if(l&&i){if(i.refCount--,0===i.refCount){l.delete(t);for(let e=0;e<o.length;e++)o[e]?.cache.delete(t);i.controller&&i.controller.abort()}return i.refCount}return 0}function h(e,n,t){const o=r.get(e);if(!o)return null==n?c.getBlock(e,t):null;if(null==n||null==o[n]){for(let e=0;e<o.length;e++){const n=o[e]?.cache.get(t);if(n)return n.refCount++,n.block}return c.getBlock(e,t)}const l=o[n]?.cache.get(t);if(l)return l.refCount++,l.block;for(let r=0;r<o.length;r++){if(r===n||!o[r])continue;const e=o[r]?.cache,l=e?.get(t);if(e&&l)return l.refCount++,e.set(t,l),l.block}return null}function x(e,n,t,o,l=null){const i=r.get(e);if(!i)return void(null==n&&c.putBlock(e,t,o,l));if(null==n||null==i[n])return void c.putBlock(e,t,o,l);const u={refCount:1,block:o,isResolved:!1,isRejected:!1,controller:l};o.then(()=>u.isResolved=!0).catch(()=>u.isRejected=!0),i[n]?.cache.set(t,u)}function d(e,n,t){const o=r.get(e);o?null!=n&&null!=o[n]?o[n]?.cache.delete(t):c.deleteBlock(e,t):null==n&&c.deleteBlock(e,t)}function g(e,n){const t=r.get(e);return t?t[n]??null:null}function p(n,r,c,i,u,a,f=null){const s=g(n,r);if(!s)return;const m=s.extent,{cache:h,rasterInfo:x}=s;if(m?.xmin===c.xmin&&m.xmax===c.xmax&&m.ymin===c.ymin&&m.ymax===c.ymax)return;i=i??0;const d=c.clone().normalize(),{spatialReference:p,transform:y}=x,R=new Set;for(let g=0;g<d.length;g++){const n=d[g];if(n.xmax-n.xmin<=i||n.ymax-n.ymin<=i)continue;let r=t(n,p,f);if(null==r)continue;if(null!=y&&(r=y.inverseTransform(r),null==r))continue;const c=new e({x:i,y:i,spatialReference:n.spatialReference});if(null==u&&!(u=o(c,p,n,f)))return;const{pyramidLevel:s,pyramidResolution:m,excessiveReading:h}=l(u,x,a||"closest");if(h)return;const{storageInfo:k}=x,{origin:M}=k,{x:C,y:b}=m,j=Math.max(0,Math.floor((r.xmin-M.x)/C)),v=Math.max(0,Math.floor((M.y-r.ymax)/b)),B=Math.ceil(r.width/C-.1),w=Math.ceil(r.height/b-.1),$=s>0?k.pyramidBlockWidth:k.blockWidth,I=s>0?k.pyramidBlockHeight:k.blockHeight,E=k.blockBoundary[s];if(!E)continue;const H=1,P=Math.max(E.minCol,Math.floor(j/$)-H),W=Math.max(E.minRow,Math.floor(v/I)-H),z=Math.min(E.maxCol,Math.floor((j+B-1)/$)+H),A=Math.min(E.maxRow,Math.floor((v+w-1)/I)+H);for(let e=W;e<=A;e++)for(let n=P;n<=z;n++)R.add(`${s}/${e}/${n}`)}h.forEach((e,n)=>{if(!R.has(n)){const e=h.get(n);(null==e||e.isResolved||e.isRejected)&&h.delete(n)}}),s.extent={xmin:c.xmin,ymin:c.ymin,xmax:c.xmax,ymax:c.ymax}}export{f as clearRegisteredIds,m as decreaseRefCount,d as deleteBlock,s as deleteRaster,h as getBlock,i as getRasterId,x as putBlock,u as register,a as unregister,p as update};