@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 6.26 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import{__decorate as e}from"tslib";import{JSONMap as t}from"../../core/jsonMap.js";import{JSONSupport as s}from"../../core/JSONSupport.js";import{getMetersPerUnitForSR as o}from"../../core/units.js";import{property as r,subclass as i}from"../../core/accessorSupport/decorators.js";import{Integer as l}from"../../core/accessorSupport/ensureType.js";import n from"../../geometry/Point.js";import p from"../../geometry/SpatialReference.js";import{isValid as a,getInfo as c,isGeographic as u,equals as f}from"../../geometry/support/spatialReferenceUtils.js";import{project as h}from"../../geometry/support/webMercatorUtils.js";import m from"./LOD.js";import{TileKey as d}from"./TileKey.js";import{reader as g}from"../../core/accessorSupport/decorators/reader.js";import{writer as y}from"../../core/accessorSupport/decorators/writer.js";var v;const w=new t({PNG:"png",PNG8:"png8",PNG24:"png24",PNG32:"png32",JPEG:"jpg",JPG:"jpg",DIB:"dib",TIFF:"tiff",EMF:"emf",PS:"ps",PDF:"pdf",GIF:"gif",SVG:"svg",SVGZ:"svgz",Mixed:"mixed",MIXED:"mixed",LERC:"lerc",LERC2D:"lerc2d",RAW:"raw",pbf:"pbf"});let z=class extends s{static{v=this}static create(e={}){const{resolutionFactor:t=1,scales:s,size:r=256,spatialReference:i=p.WebMercator,numLODs:l=24}=e;if(!a(i)){const e=[];if(s)for(let t=0;t<s.length;t++){const o=s[t];e.push(new m({level:t,scale:o,resolution:o}))}else{let t=5e-4;for(let s=l-1;s>=0;s--)e.unshift(new m({level:s,scale:t,resolution:t})),t*=2}return new v({dpi:96,lods:e,origin:new n(0,0,i),size:[r,r],spatialReference:i})}const f=c(i),h=e.origin?new n({x:e.origin.x,y:e.origin.y,spatialReference:i}):new n(f?{x:f.origin[0],y:f.origin[1],spatialReference:i}:{x:0,y:0,spatialReference:i}),d=96,g=1/(o(i)*39.37*d),y=[];if(s)for(let o=0;o<s.length;o++){const e=s[o],t=e*g;y.push(new m({level:o,scale:e,resolution:t}))}else{let e=u(i)?512/r*591657527.5917094:256/r*591657527.591555;const s=Math.ceil(l/t);y.push(new m({level:0,scale:e,resolution:e*g}));for(let o=1;o<s;o++){const s=e/2**t,r=s*g;y.push(new m({level:o,scale:s,resolution:r})),e=s}}return new v({dpi:d,lods:y,origin:h,size:[r,r],spatialReference:i})}constructor(e){super(e),this.dpi=96,this.format=null,this.origin=null,this.size=null,this.spatialReference=null}get isWrappable(){const{spatialReference:e,origin:t}=this;if(e&&t){const s=c(e);return e.isWrappable&&!!s&&Math.abs(s.origin[0]-t.x)<=s.dx}return!1}readOrigin(e,t){return n.fromJSON({spatialReference:t.spatialReference,...e})}set lods(e){let t=0,s=0;const o=[],r=this._levelToLOD={};e&&(t=-1/0,s=1/0,e.forEach(e=>{o.push(e.scale),t=e.scale>t?e.scale:t,s=e.scale<s?e.scale:s,r[e.level]=e})),this._set("scales",o),this._set("lods",e),this._initializeUpsampleLevels()}readSize(e,t){return[t.cols,t.rows]}writeSize(e,t){t.cols=e[0],t.rows=e[1]}zoomToScale(e){const t=this.scales;if(e<=0)return t[0];if(e>=t.length-1)return t[t.length-1];const s=Math.floor(e),o=s+1;return t[s]/(t[s]/t[o])**(e-s)}scaleToZoom(e){const t=this.scales,s=t.length-1;let o=0;for(;o<s;o++){const s=t[o],r=t[o+1];if(s<=e)return o;if(r===e)return o+1;if(s>e&&r<e)return o+Math.log(s/e)/Math.log(s/r)}return o}tileAt(e,t,s,o){const r=this.lodAt(e);if(!r)return null;let i,l;if("number"==typeof t)i=t,l=s;else if(f(t.spatialReference,this.spatialReference))i=t.x,l=t.y,o=s;else{const e=h(t,this.spatialReference);if(null==e)return null;i=e.x,l=e.y,o=s}const n=r.resolution*this.size[0],p=r.resolution*this.size[1];return o??=new d(0,0,0),o.level=e,o.row=Math.floor((this.origin.y-l)/p+.001),o.col=Math.floor((i-this.origin.x)/n+.001),this.updateTileInfo(o),o}updateTileInfo(e,t=0){if(!("extent"in e))return!1;let s=this.lodAt(e.level);if(!s&&1===t){const t=this.lods[this.lods.length-1];t.level<e.level&&(s=t)}if(!s)return!1;const o=e.level-s.level,r=s.resolution*this.size[0]/2**o,i=s.resolution*this.size[1]/2**o;return e.extent[0]=this.origin.x+e.col*r,e.extent[1]=this.origin.y-(e.row+1)*i,e.extent[2]=e.extent[0]+r,e.extent[3]=e.extent[1]+i,!0}upsampleTile(e){const t=this._upsampleLevels[e.level];return!(!t||-1===t.parentLevel)&&(e.level=t.parentLevel,e.row=Math.floor(e.row/t.factor+.001),e.col=Math.floor(e.col/t.factor+.001),this.updateTileInfo(e),!0)}getTileBounds(e,t){const s=this.lodAt(t.level);if(null==s)return null;const{resolution:o}=s,r=o*this.size[0],i=o*this.size[1];return e[0]=this.origin.x+t.col*r,e[1]=this.origin.y-(t.row+1)*i,e[2]=e[0]+r,e[3]=e[1]+i,e}lodAt(e){return this._levelToLOD?.[e]??null}clone(){return v.fromJSON(this.write({}))}getCompatibleForVTL(e){if(this.size[0]!==this.size[1]||256===this.size[0]&&512===e)return null;const t=(512===this.size[0]&&256===e?-1:0)+(this.spatialReference.isGeographic?1:0);if(this.size[0]===e&&0===t)return this;const s=[],o=this.lods.length-t;for(let r=0;r<o;r++){const e=r+t,{scale:o,resolution:i}=e>=0?this.lods[e]:{scale:2*this.lods[0].scale,resolution:2*this.lods[0].resolution};s.push(new m({level:r,scale:o,resolution:i}))}return new v({size:[e,e],dpi:this.dpi,format:this.format,compressionQuality:this.compressionQuality,origin:this.origin,spatialReference:this.spatialReference,lods:s})}_initializeUpsampleLevels(){const e=this.lods;this._upsampleLevels=[];let t=null;for(let s=0;s<e.length;s++){const o=e[s];this._upsampleLevels[o.level]={parentLevel:t?t.level:-1,factor:t?t.resolution/o.resolution:0},t=o}}};e([r({type:Number,json:{write:!0}})],z.prototype,"compressionQuality",void 0),e([r({type:Number,json:{write:!0}})],z.prototype,"dpi",void 0),e([r({type:String,json:{read:w.read,write:w.write,origins:{"web-scene":{read:!1,write:!1}}}})],z.prototype,"format",void 0),e([r({readOnly:!0})],z.prototype,"isWrappable",null),e([r({type:n,json:{write:!0}})],z.prototype,"origin",void 0),e([g("origin")],z.prototype,"readOrigin",null),e([r({type:[m],value:null,json:{write:!0}})],z.prototype,"lods",null),e([r({readOnly:!0})],z.prototype,"scales",void 0),e([r({cast:e=>Array.isArray(e)?e:"number"==typeof e?[e,e]:[256,256]})],z.prototype,"size",void 0),e([g("size",["rows","cols"])],z.prototype,"readSize",null),e([y("size",{cols:{type:l},rows:{type:l}})],z.prototype,"writeSize",null),e([r({type:p,json:{write:!0}})],z.prototype,"spatialReference",void 0),z=v=e([i("esri.layers.support.TileInfo")],z);export{z as default};