UNPKG

@arcgis/core

Version:

ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API

6 lines (5 loc) • 9.33 kB
/* All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://js.arcgis.com/4.32/esri/copyright.txt for details. */ import{isSome as e}from"../../core/arrayUtils.js";import t from"../../core/Error.js";import{getReferenceEllipsoidFromWKID as i}from"../../geometry/ellipsoidUtils.js";import n from"../../geometry/Extent.js";import r from"../../geometry/Point.js";import l from"../../geometry/support/WKIDUnitConversion.js";import{isAxesOrderReversedForWkid as o}from"../ogc/crsUtils.js";import{visitXML as s}from"../ogc/xmlUtils.js";import a from"./LOD.js";import c from"./TileInfo.js";const u=90.71428571428571;function p(e){const i=e.replaceAll(/ows:/gi,"");if(!x("Contents",(new DOMParser).parseFromString(i,"text/xml").documentElement))throw new t("wmtslayer:wmts-capabilities-xml-is-not-valid","the wmts get capabilities response is not compliant",{text:e})}function f(e,i){e=e.replaceAll(/ows:/gi,"");const n=(new DOMParser).parseFromString(e,"text/xml").documentElement,r=new Map,l=new Map,o=x("Contents",n);if(!o)throw new t("wmtslayer:wmts-capabilities-xml-is-not-valid");const s=x("OperationsMetadata",n),a=s?.querySelector("[name='GetTile']"),c=a?.getElementsByTagName("Get"),u=c&&Array.prototype.slice.call(c),p=i.url?.indexOf("https"),f=void 0!==p&&p>-1;let d,m,h=i.serviceMode,T=i?.url;if(u?.length&&u.some((e=>{const t=x("Constraint",e);return!t||C("AllowedValues","Value",h,t)?(T=e.attributes[0].nodeValue,!0):(!t||C("AllowedValues","Value","RESTful",t)||C("AllowedValues","Value","REST",t)?m=e.attributes[0].nodeValue:t&&!C("AllowedValues","Value","KVP",t)||(d=e.attributes[0].nodeValue),!1)})),!T)if(m)T=m,h="RESTful";else if(d)T=d,h="KVP";else{const e=x("ServiceMetadataURL",n);T=e?.getAttribute("xlink:href")}const y=T.indexOf("1.0.0/");-1===y&&"RESTful"===h?T+="/":y>-1&&(T=T.slice(0,y)),"KVP"===h&&(T+=y>-1?"":"?"),f&&(T=T.replace(/^http:/i,"https:"));const R=w("ServiceIdentification>ServiceTypeVersion",n),S=w("ServiceIdentification>AccessConstraints",n),A=S&&/^none$/i.test(S)?null:S,V=g("Layer",o),E=g("TileMatrixSet",o),L=V.map((e=>{const t=w("Identifier",e);return r.set(t,e),M(t,e,E,f,R)}));return{copyright:A,dimensionMap:l,layerMap:r,layers:L,serviceMode:h,tileUrl:T}}function d(e){return e.layers.forEach((e=>{e.tileMatrixSets?.forEach((e=>{const t=e.tileInfo;t&&96!==t.dpi&&(t.lods?.forEach((i=>{i.scale=96*i.scale/t.dpi,i.resolution=j(t.spatialReference?.wkid,i.scale*u/96,e.id)})),t.dpi=96)}))})),e}function m(e){return e.nodeType===Node.ELEMENT_NODE}function x(e,t){for(let i=0;i<t.childNodes.length;i++){const n=t.childNodes[i];if(m(n)&&n.nodeName===e)return n}return null}function g(e,t){const i=[];for(let n=0;n<t.childNodes.length;n++){const r=t.childNodes[n];m(r)&&r.nodeName===e&&i.push(r)}return i}function h(t,i){const n=[];for(let e=0;e<i.childNodes.length;e++){const r=i.childNodes[e];m(r)&&r.nodeName===t&&n.push(r)}return n.map((e=>e.textContent)).filter(e)}function w(e,t){return e.split(">").forEach((e=>{t&&(t=x(e,t))})),t&&t.textContent}function C(e,t,i,n){let r;return Array.prototype.slice.call(n.childNodes).some((n=>{if(n.nodeName.includes(e)){const e=x(t,n),l=e?.textContent;if(l===i||i.split(":")&&i.split(":")[1]===l)return r=n,!0}return!1})),r}function M(e,t,i,n,r){const l=w("Abstract",t),o=h("Format",t);return{id:e,fullExtent:A(t),fullExtents:V(t),description:l,formats:o,styles:E(t,n),title:w("Title",t),tileMatrixSets:L(r,t,i)}}function T(e,t){const i=[],n=e.layerMap?.get(t);if(!n)return null;const r=g("ResourceURL",n),l=g("Dimension",n);let o,s,a,c;return l.length&&(o=w("Identifier",l[0]),s=h("Default",l[0])),l.length>1&&(a=w("Identifier",l[1]),c=h("Default",l[1])),e.dimensionMap.set(t,{dimensions:s,dimensions2:c}),r.forEach((e=>{let t=e.getAttribute("template");if("tile"===e.getAttribute("resourceType")){if(o&&s.length)if(t.includes("{"+o+"}"))t=t.replace("{"+o+"}","{dimensionValue}");else{const e=t.toLowerCase().indexOf("{"+o.toLowerCase()+"}");e>-1&&(t=t.slice(0,e)+"{dimensionValue}"+t.slice(e+o.length+2))}if(a&&c.length)if(t.includes("{"+a+"}"))t=t.replace("{"+a+"}","{dimensionValue2}");else{const e=t.toLowerCase().indexOf("{"+a.toLowerCase()+"}");e>-1&&(t=t.slice(0,e)+"{dimensionValue2}"+t.slice(e+a.length+2))}i.push({template:t,format:e.getAttribute("format"),resourceType:"tile"})}})),i}function y(e,t,i,n,r,l,o,s){const a=R(e,t,n);if(!(a?.length>0))return"";const{dimensionMap:c}=e,u=c.get(t).dimensions?.[0],p=c.get(t).dimensions2?.[0];return a[o%a.length].template.replaceAll(/\{Style\}/gi,r??"").replaceAll(/\{TileMatrixSet\}/gi,i??"").replaceAll(/\{TileMatrix\}/gi,l).replaceAll(/\{TileRow\}/gi,""+o).replaceAll(/\{TileCol\}/gi,""+s).replaceAll(/\{dimensionValue\}/gi,u).replaceAll(/\{dimensionValue2\}/gi,p)}function R(e,t,i){const n=T(e,t),r=n?.filter((e=>e.format===i));return(r?.length?r:n)??[]}function S(e,t,i,n){const{dimensionMap:r}=e,l=T(e,t);let o="";if(l&&l.length>0){const e=r.get(t).dimensions?.[0],s=r.get(t).dimensions2?.[0];o=l[0].template,o.endsWith(".xxx")&&(o=o.slice(0,-4)),o=o.replaceAll(/\{Style\}/gi,n),o=o.replaceAll(/\{TileMatrixSet\}/gi,i),o=o.replaceAll(/\{TileMatrix\}/gi,"{level}"),o=o.replaceAll(/\{TileRow\}/gi,"{row}"),o=o.replaceAll(/\{TileCol\}/gi,"{col}"),o=o.replaceAll(/\{dimensionValue\}/gi,e),o=o.replaceAll(/\{dimensionValue2\}/gi,s)}return o}function A(e){const t=x("WGS84BoundingBox",e),i=t?w("LowerCorner",t).split(" "):["-180","-90"],n=t?w("UpperCorner",t).split(" "):["180","90"];return{xmin:parseFloat(i[0]),ymin:parseFloat(i[1]),xmax:parseFloat(n[0]),ymax:parseFloat(n[1]),spatialReference:{wkid:4326}}}function V(e){const t=[];return s(e,{BoundingBox:e=>{if(!e.getAttribute("crs"))return;const i=e.getAttribute("crs").toLowerCase(),n=I(i),r=i.includes("epsg")&&o(n.wkid);let l,a,c,u;s(e,{LowerCorner:e=>{[l,a]=e.textContent.split(" ").map((e=>Number.parseFloat(e))),r&&([l,a]=[a,l])},UpperCorner:e=>{[c,u]=e.textContent.split(" ").map((e=>Number.parseFloat(e))),r&&([c,u]=[u,c])}}),t.push({xmin:l,ymin:a,xmax:c,ymax:u,spatialReference:n})}}),t}function E(e,t){return g("Style",e).map((e=>{const i=x("LegendURL",e),n=x("Keywords",e),r=n?h("Keyword",n):[];let l=i?.getAttribute("xlink:href");t&&(l=l?.replace(/^http:/i,"https:"));return{abstract:w("Abstract",e),id:w("Identifier",e),isDefault:"true"===e.getAttribute("isDefault"),keywords:r,legendUrl:l,title:w("Title",e)}}))}function L(e,t,i){return g("TileMatrixSetLink",t).map((t=>b(e,t,i)))}function b(e,t,i){const n=x("TileMatrixSet",t).textContent,r=h("TileMatrix",t),l=i.find((e=>{const t=x("Identifier",e),i=t?.textContent;return!!(i===n||n.split(":")&&n.split(":")[1]===i)})),o=x("TileMatrixSetLimits",t),s=o&&g("TileMatrixLimits",o),a=new Map;if(s?.length)for(const c of s){const e=x("TileMatrix",c).textContent,t=+x("MinTileRow",c).textContent,i=+x("MaxTileRow",c).textContent,n=+x("MinTileCol",c).textContent,r=+x("MaxTileCol",c).textContent;a.set(e,{minCol:n,maxCol:r,minRow:t,maxRow:i})}const u=w("SupportedCRS",l).toLowerCase(),p=N(l,u),f=p.spatialReference,d=x("TileMatrix",l),m=[parseInt(w("TileWidth",d),10),parseInt(w("TileHeight",d),10)],M=[];if(r.length)r.forEach(((e,t)=>{const i=C("TileMatrix","Identifier",e,l);M.push(k(i,u,t,n,a))}));else{g("TileMatrix",l).forEach(((e,t)=>{M.push(k(e,u,t,n,a))}))}const T=F(e,l,p,m,M[0]).toJSON(),y=new c({dpi:96,spatialReference:f,size:m,origin:p,lods:M}).toJSON();return{id:n,fullExtent:T,tileInfo:y}}function I(e){e=e.toLowerCase();let t=parseInt(e.split(":").pop(),10);900913!==t&&3857!==t||(t=102100);const i=O(e);return null!=i&&(t=i),{wkid:t}}function N(e,t){return v(x("TileMatrix",e),t)}function v(e,t){const i=I(t),[n,l]=w("TopLeftCorner",e).split(" ").map((e=>parseFloat(e))),s=t.includes("epsg")&&o(i.wkid);return new r(s?{x:l,y:n,spatialReference:i}:{x:n,y:l,spatialReference:i})}function F(e,t,i,r,l){const o=x("BoundingBox",t);let s,a,c,u,p,f;if(o&&(s=w("LowerCorner",o).split(" "),a=w("UpperCorner",o).split(" ")),s&&s.length>1&&a&&a.length>1)c=parseFloat(s[0]),p=parseFloat(s[1]),u=parseFloat(a[0]),f=parseFloat(a[1]);else{const e=x("TileMatrix",t),n=parseInt(w("MatrixWidth",e),10),o=parseInt(w("MatrixHeight",e),10);c=i.x,f=i.y,u=c+n*r[0]*l.resolution,p=f-o*r[1]*l.resolution}return U(e,i.spatialReference,i)?new n(p,c,f,u,i.spatialReference):new n(c,p,u,f,i.spatialReference)}function U(e,t,i){return"1.0.0"===e&&o(t.wkid)&&!(i.spatialReference.isGeographic&&i.x<-90&&i.y>=-90)}var D;function O(e){return e.includes("crs84")||e.includes("crs:84")?D.CRS84:e.includes("crs83")||e.includes("crs:83")?D.CRS83:e.includes("crs27")||e.includes("crs:27")?D.CRS27:null}function k(e,t,i,n,r){const l=I(t),o=w("Identifier",e);let s=parseFloat(w("ScaleDenominator",e));const c=j(l.wkid,s,n);s*=96/u;const p=+w("MatrixWidth",e),f=+w("MatrixHeight",e),{maxCol:d=p-1,maxRow:m=f-1,minCol:x=0,minRow:g=0}=r.get(o)??{},{x:h,y:C}=v(e,t);return new a({cols:[x,d],level:i,levelValue:o,origin:[h,C],scale:s,resolution:c,rows:[g,m]})}function j(e,t,n){let r;return r=l.hasOwnProperty(""+e)?l.values[l[e]]:"default028mm"===n?6370997*Math.PI/180:i(e).metersPerDegree,7*t/25e3/r}!function(e){e[e.CRS84=4326]="CRS84",e[e.CRS83=4269]="CRS83",e[e.CRS27=4267]="CRS27"}(D||(D={}));export{y as getTileUrlFromResourceUrls,S as getTileUrlTemplateFromResourceUrls,R as getTileUrlTemplates,f as parseCapabilities,d as parseResourceInfo,p as validateCapabilities};