@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 5.39 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import e from"../../request.js";import{clone as t}from"../../core/lang.js";import{throwIfAborted as o}from"../../core/promiseUtils.js";import{normalize as l,removeFile as r,getAppBaseUrl as s,removeTrailingSlash as n,addQueryParameters as i,isProtocolRelative as u,isAbsolute as c,join as a}from"../../core/urlUtils.js";import{wgs84 as y,webMercator as f}from"../../geometry/support/spatialReferenceUtils.js";import{geographicToWebMercator as p}from"../../geometry/support/webMercatorUtils.js";import m from"../../views/2d/engine/vectorTiles/style/VectorTileSource.js";async function d(e,t){const o={source:null,sourceBase:null,sourceUrl:null,validatedSource:null,style:null,styleBase:null,styleUrl:null,sourceNameToSource:{},primarySourceName:"",spriteFormat:"png"},[l,r]="string"==typeof e?[e,null]:[null,e.jsonUrl];await S(o,"esri",e,r,t);return{layerDefinition:o.validatedSource,url:l,serviceUrl:o.sourceUrl,style:o.style,styleUrl:o.styleUrl,spriteUrl:o.style&&o.style.sprite&&h(o.styleBase,o.style.sprite),spriteFormat:o.spriteFormat,glyphsUrl:o.style&&o.style.glyphs&&h(o.styleBase,o.style.glyphs),sourceNameToSource:o.sourceNameToSource,primarySourceName:o.primarySourceName}}function h(...e){let t;for(const o of e)if(null!=o)if(u(o)){if(t){const e=t.split("://")[0];t=e+":"+o.trim()}}else t=c(o)?o:a(t,o);return t?n(t):void 0}async function S(t,r,s,n,i){let u,c,a;if(o(i),"string"==typeof s){const t=l(s);a=await e(t,{...i,responseType:"json",query:{f:"json",...i?.query}}),a.ssl&&(u&&(u=u.replace(/^http:/i,"https:")),c&&(c=c.replace(/^http:/i,"https:"))),u=t,c=t}else null!=s&&(a={data:s},u=s.jsonUrl||null,c=n);const y=a?.data;if(g(y))return t.styleUrl=u||null,j(t,y,c,i);if(w(y))return t.sourceUrl?U(t,y,c,!1,r,i):(t.sourceUrl=u||null,x(y)&&null==t.style&&(r="tilejson"),U(t,y,c,!0,r,i));throw new Error("You must specify the URL or the JSON for a service or for a style.")}function x(e){return"object"==typeof e&&!!e&&"tilejson"in e&&null!=e.tilejson}function g(e){return!!e&&"sources"in e&&!!e.sources}function w(e){return!g(e)}async function j(e,t,o,l){const n=o?r(o):s();e.styleBase=n,e.style=t,"webp"===t["sprite-format"]?.toLowerCase()&&(e.spriteFormat="webp");const i=[];if(t.sources&&t.sources.esri){const o=t.sources.esri;o.url?await S(e,"esri",h(n,o.url),void 0,l):i.push(S(e,"esri",o,n,l))}for(const r of Object.keys(t.sources))"esri"!==r&&"tilejson"!==r&&"vector"===t.sources[r].type&&(t.sources[r].url?i.push(S(e,r,h(n,t.sources[r].url),void 0,l)):t.sources[r].tiles&&i.push(S(e,r,t.sources[r],n,l)));await Promise.all(i)}async function U(e,t,o,l,r,u){const c=o?n(o)+"/":s(),a=v(t,e),y=new m(r,i(c,u?.query??{}),a);if(!l&&e.primarySourceName in e.sourceNameToSource){const t=e.sourceNameToSource[e.primarySourceName];if(!t.isCompatibleWith(y))return;null!=y.fullExtent&&(null!=t.fullExtent?t.fullExtent.union(y.fullExtent):t.fullExtent=y.fullExtent.clone()),t.tileInfo&&y.tileInfo&&t.tileInfo.lods.length<y.tileInfo.lods.length&&(t.tileInfo=y.tileInfo)}if(l&&(e.sourceBase=c,e.source=t,e.validatedSource=a,e.primarySourceName=r),e.sourceNameToSource[r]=y,!x(e)&&"defaultStyles"in t&&!e.style){if(null==t.defaultStyles)throw new Error;return"string"==typeof t.defaultStyles?S(e,"",h(c,t.defaultStyles,"root.json"),void 0,u):S(e,"",t.defaultStyles,h(c,"root.json"),u)}if(x(t)&&null==e.style&&a.defaultStyles)return S(e,"",a.defaultStyles,h(c,"root.json"),u)}function v(e,o){const l=512;if(N(e)){const t=e?.tileInfo;return null!=t&&(null==t.rows&&(t.rows=l),null==t.cols&&(t.cols=l)),e}const r={xmin:-20037507.067161843,ymin:-20037507.067161843,xmax:20037507.067161843,ymax:20037507.067161843,spatialReference:{wkid:102100,latestWkid:3857}};let s,n=null;if(x(e)){const{bounds:l,vector_layers:r}=e;if(l){const e=p({x:l[0],y:l[1],spatialReference:t(y)}),o=p({x:l[2],y:l[3],spatialReference:t(y)});n={xmin:e.x,ymin:e.y,xmax:o.x,ymax:o.y,spatialReference:t(f)}}if(r&&r.length>0)s={version:8,sprite:"",glyphs:"",sources:{tilejson:{type:"vector",url:e.tilejson}},layers:T(r)};else if(null==o.style)throw new Error("The TileJSON source does not contain any vector_layers. This VectorTileLayer cannot be loaded.")}null===n&&(n=r);let i=78271.51696400007,u=295828763.7957775;const c=[],a=e.hasOwnProperty("maxzoom")&&null!=e.maxzoom?Math.abs(+e.maxzoom):22,m=0,d=0;for(let t=0;t<=a;t++)c.push({level:t,scale:u,resolution:i}),i/=2,u/=2;return{capabilities:"TilesOnly",initialExtent:n,fullExtent:r,minScale:m,maxScale:d,tiles:e.tiles,tileInfo:{rows:l,cols:l,dpi:96,format:"pbf",origin:{x:-20037508.342787,y:20037508.342787},lods:c,spatialReference:t(f)},defaultStyles:s}}function N(e){return e.hasOwnProperty("tileInfo")}function T(e){const t=[];for(const o of e)o.geometry_type?t.push(b(o.geometry_type.toLowerCase(),o,!1)):(t.push(b("polygon",o,!0)),t.push(b("line",o,!0)),t.push(b("circle",o,!0)));return t}function b(e,t,o){const{id:l,minzoom:r,maxzoom:s}=t,n={type:"polygon"===e||"polygons"===e?"fill":"line"===e||"lines"===e?"line":"circle",id:l,source:"tilejson","source-layer":l,minzoom:r,maxzoom:s};switch(e){case"fill":o&&(n.id+="_polygon",n.filter='(["==", "$type", "Polygon"])'),n.paint={"fill-color":"#808080"};break;case"line":o&&(n.id+="_line",n.filter='(["==", "$type", "LineString"])');break;case"circle":o&&(n.id+="_point",n.filter='(["==", "$type", "Point"])')}return n}export{d as loadMetadata};