@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
6 lines (5 loc) • 9.5 kB
JavaScript
/*
All material copyright ESRI, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/4.33/esri/copyright.txt for details.
*/
import{isSome as e}from"../../core/arrayUtils.js";import t from"../../core/Error.js";import{urlToObject as n}from"../../core/urlUtils.js";import{isAxesOrderReversedForWkid as r}from"../ogc/crsUtils.js";import{DateTime as i,FixedOffsetZone as s}from"luxon";const o={84:4326,83:4269,27:4267};function a(n){if(!n)return null;const r={idCounter:-1};if("string"==typeof n){n=(new DOMParser).parseFromString(n,"text/xml")}const i=n.documentElement;if("ServiceExceptionReport"===i.nodeName){const e=Array.prototype.slice.call(i.childNodes).map((e=>e.textContent)).join("\r\n");throw new t("wmslayer:wms-capabilities-xml-is-not-valid","The server returned errors when the WMS capabilities were requested.",e)}const s=d("Capability",i),o=d("Service",i),a=s&&d("Request",s);if(!s||!o||!a)return null;const l=d("Layer",s);if(!l)return null;const m="WMS_Capabilities"===i.nodeName||"WMT_MS_Capabilities"===i.nodeName?i.getAttribute("version"):"1.3.0",f=x("Title",o,"")||x("Name",o,""),p=x("AccessConstraints",o,""),h=/^none$/i.test(p)?"":p,y=x("Abstract",o,""),S=parseInt(x("MaxWidth",o,"5000"),10),E=parseInt(x("MaxHeight",o,"5000"),10),L=g(a,"GetMap"),C=N(a,"GetMap"),M=b(l,m,r);if(!M)return null;let T,R=0;const I=Array.prototype.slice.call(s.childNodes),v=M.sublayers??[],w=e=>{null!=e&&v.push(e)};I.forEach((e=>{"Layer"===e.nodeName&&(0===R?T=e:1===R?(M.name&&(M.name="",w(b(T,m,r))),w(b(e,m,r))):w(b(e,m,r)),R++)}));const U=M.sublayers??[],V=M.fullExtents??[];0===U.length&&U.push(M),M.extent??=U[0].extent;const _=M.spatialReferences.length>0?M.spatialReferences:u(M),O=N(a,"GetFeatureInfo"),B=O?g(a,"GetFeatureInfo"):null,k=c(U),q=M.minScale||0,X=M.maxScale||0,D=M.dimensions??[],$=k.reduce(((e,t)=>e.concat(t.dimensions??[])),[]),j=D.concat($).filter(F);let G=null;if(j.length){const t=j.map((e=>{const{extent:t}=e;return A(t)?t.map((e=>e.getTime())):t?.map((e=>[e.min.getTime(),e.max.getTime()]))})).flat(2).filter(e),{start:n,end:r}=t.reduce(((e,t)=>({start:Math.min(e.start,t),end:Math.max(e.end,t)})),{start:1/0,end:-1/0});G={startTimeField:null,endTimeField:null,trackIdField:void 0,timeExtent:[n,r]}}return{copyright:h,description:y,dimensions:D,extent:M.extent,fullExtents:V,featureInfoFormats:B,featureInfoUrl:O,mapUrl:C,maxWidth:S,maxHeight:E,maxScale:X,minScale:q,layers:k,spatialReferences:_,supportedImageFormatTypes:L,timeInfo:G,title:f,version:m}}function l(e){const t=e.filter((e=>e.popupEnabled&&e.name&&e.queryable));return t.length?t.map((({name:e})=>e)).join():null}function u(e){if(e.spatialReferences.length>0)return e.spatialReferences;if(e.sublayers)for(const t of e.sublayers){const e=u(t);if(e.length>0)return e}return[]}function c(e){let t=[];for(const n of e)t.push(n),n.sublayers?.length&&(t=t.concat(c(n.sublayers)),delete n.sublayers);return t}function m(e,t,n){return t.getAttribute(e)??n}function f(e,t,n,r){const i=d(e,n);return i?m(t,i,r):r}function d(e,t){for(let n=0;n<t.childNodes.length;n++){const r=t.childNodes[n];if(S(r)&&r.nodeName===e)return r}return null}function p(e,t){if(null==t)return[];const n=[];for(let r=0;r<t.childNodes.length;r++){const i=t.childNodes[r];S(i)&&i.nodeName===e&&n.push(i)}return n}function x(e,t,n){return d(e,t)?.textContent??n}function h(e,t,n){const r=parseFloat(e.getAttribute("minx")??"0"),i=parseFloat(e.getAttribute("miny")??"0"),s=parseFloat(e.getAttribute("maxx")??"0"),o=parseFloat(e.getAttribute("maxy")??"0");return{xmin:n?isNaN(i)?-Number.MAX_VALUE:i:isNaN(r)?-Number.MAX_VALUE:r,ymin:n?isNaN(r)?-Number.MAX_VALUE:r:isNaN(i)?-Number.MAX_VALUE:i,xmax:n?isNaN(o)?Number.MAX_VALUE:o:isNaN(s)?Number.MAX_VALUE:s,ymax:n?isNaN(s)?Number.MAX_VALUE:s:isNaN(o)?Number.MAX_VALUE:o,spatialReference:{wkid:t}}}function N(e,t){const n=d(t,e);if(n){const e=d("DCPType",n);if(e){const t=d("HTTP",e);if(t){const e=d("Get",t);if(e){let t=f("OnlineResource","xlink:href",e,null);if(t){const e=t.indexOf("&");return-1!==e&&e===t.length-1&&(t=t.slice(0,-1)),M(t,["service","request"])}}}}}return null}function g(t,n){const r=p("Operation",t);if(!r.length){return p("Format",d(n,t)).map((({textContent:e})=>e)).filter(e)}const i=[];for(const e of r)if(e.getAttribute("name")===n){const t=p("Format",e);for(const{textContent:e}of t)null!=e&&i.push(e)}return i}function y(e,t,n){const r=d(t,e);if(!r)return n;const{textContent:i}=r;if(null==i||""===i)return n;const s=Number(i);return isNaN(s)?n:s}function b(e,t,n){if(!e)return null;const i=e.getAttribute("queryable")?.toLowerCase(),s="1"===i||"true"===i,a={id:n.idCounter++,fullExtents:[],parentLayerId:null,queryable:s,spatialReferences:[],sublayers:null},l=d("LatLonBoundingBox",e),u=d("EX_GeographicBoundingBox",e),c=l?h(l,4326):u?{xmin:parseFloat(x("westBoundLongitude",u,"0")),ymin:parseFloat(x("southBoundLatitude",u,"0")),xmax:parseFloat(x("eastBoundLongitude",u,"0")),ymax:parseFloat(x("northBoundLatitude",u,"0")),spatialReference:{wkid:4326}}:{xmin:-180,ymin:-90,xmax:180,ymax:90,spatialReference:{wkid:4326}};a.minScale=y(e,"MaxScaleDenominator",0),a.maxScale=y(e,"MinScaleDenominator",0);const f=["1.0.0","1.1.0","1.1.1"].includes(t)?"SRS":"CRS";return Array.prototype.slice.call(e.childNodes).forEach((e=>{if("Name"===e.nodeName)a.name=e.textContent||"";else if("Title"===e.nodeName)a.title=e.textContent||"";else if("Abstract"===e.nodeName)a.description=e.textContent||"";else if("BoundingBox"===e.nodeName){const n=e.getAttribute(f),i=n?.indexOf(":");if(i&&i>-1){let s=parseInt(n.slice(i+1),10);0===s||isNaN(s)||(s=o[s]??s);const l="1.3.0"===t?h(e,s,r(s)):h(e,s);l&&a.fullExtents&&a.fullExtents.push(l)}}else if(e.nodeName===f){(e.textContent?.split(" ")??[]).forEach((e=>{let t=NaN;if(e.includes(":")){const[n,r]=e.toUpperCase().split(":");"CRS"!==n&&"EPSG"!==n||(t=parseInt(r,10))}else t=parseInt(e,10);if(0!==t&&!isNaN(t)){const e=o[t]??t;a.spatialReferences.includes(e)||a.spatialReferences.push(e)}}))}else if("Style"!==e.nodeName||a.legendUrl){if("Layer"===e.nodeName){const r=b(e,t,n);r&&(r.parentLayerId=a.id,a.sublayers||(a.sublayers=[]),a.sublayers.push(r))}}else{const t=d("LegendURL",e);if(t){const e=d("OnlineResource",t);e&&(a.legendUrl=e.getAttribute("xlink:href"))}}})),a.extent=c,a.dimensions=p("Dimension",e).filter((e=>e.getAttribute("name")&&e.getAttribute("units")&&e.textContent)).map((e=>{const t=e.getAttribute("name"),n=e.getAttribute("units"),r=e.textContent,i=e.getAttribute("unitSymbol")??void 0,s=e.getAttribute("default")??void 0,o="0"!==m("default",e,"0"),a="0"!==m("nearestValue",e,"0"),l="0"!==m("current",e,"0");if(F({name:t,units:n})){return{name:"time",units:"ISO8601",extent:I(r),default:I(s),multipleValues:o,nearestValue:a,current:l}}if(L({name:t,units:n})){return{name:"elevation",units:n,extent:T(r),unitSymbol:i,default:T(s),multipleValues:o,nearestValue:a}}return{name:t,units:n,extent:R(r),unitSymbol:i,default:R(s),multipleValues:o,nearestValue:a}})),a}function A(e){return Array.isArray(e)&&e.length>0&&e[0]instanceof Date}function S(e){return e.nodeType===Node.ELEMENT_NODE}function E(e){return void 0!==e.min&&void 0!==e.max}function L(e){return/^elevation$/i.test(e.name)&&/^(epsg|crs):\d+$/i.test(e.units)}function C(e){return!F(e)&&!L(e)}function F(e){return/^time$/i.test(e.name)&&/^iso8601$/i.test(e.units)}function M(e,t){const r=[],i=n(e);for(const n in i.query)i.query.hasOwnProperty(n)&&(t.includes(n.toLowerCase())||r.push(n+"="+i.query[n]));return i.path+(r.length?"?"+r.join("&"):"")}function T(t){if(!t)return;const n=t.includes("/"),r=t.split(",");return n?r.map((e=>{const t=e.split("/");if(t.length<2)return null;return{min:parseFloat(t[0]),max:parseFloat(t[1]),resolution:t.length>=3&&"0"!==t[2]?parseFloat(t[2]):void 0}})).filter(e):r.map((e=>parseFloat(e)))}function R(t){if(!t)return;const n=t.includes("/"),r=t.split(",");return n?r.map((e=>{const t=e.split("/");if(t.length<2)return null;return{min:t[0],max:t[1],resolution:t.length>=3&&"0"!==t[2]?t[2]:void 0}})).filter(e):r}function I(t){if(!t)return;const n=t.includes("/"),r=t.split(",");return n?r.map((e=>{const t=e.split("/");if(t.length<2)return null;return{min:v(t[0]),max:v(t[1]),resolution:t.length>=3&&"0"!==t[2]?w(t[2]):void 0}})).filter(e):r.map((e=>v(e)))}function v(e){return i.fromISO(e,{zone:s.utcInstance}).toJSDate()}function w(e){const t=/(?:p(\d+y|\d+(?:\.|,)\d+y)?(\d+m|\d+(?:\.|,)\d+m)?(\d+d|\d+(?:\.|,)\d+d)?)?(?:t(\d+h|\d+(?:\.|,)\d+h)?(\d+m|\d+(?:\.|,)\d+m)?(\d+s|\d+(?:\.|,)\d+s)?)?/i,n=e.match(t);if(!n)return null;return{years:U(n[1]),months:U(n[2]),days:U(n[3]),hours:U(n[4]),minutes:U(n[5]),seconds:U(n[6])}}function U(e){if(!e)return 0;const t=/(?:\d+(?:\.|,)\d+|\d+)/,n=e.match(t);if(!n)return 0;const r=n[0].replace(",",".");return Number(r)}function V(e){return e.toISOString().replace(/\.[0-9]{3}/,"")}const _="0000-01-01T00:00:00Z",O="9999-12-31T23:59:59Z";function B(e){if(!e||e.isAllTime||e.isEmpty)return;const{start:t,end:n}=e;if(t&&n&&t.getTime()===n.getTime())return`${V(t)}`;return`${t?V(t):_}/${n?V(n):O}`}const k=new Set([102100,3857,102113,900913]),q=new Set([3395,54004]);function X(e,t){let n=e.wkid;return null==t?n:(null!=n&&t.includes(n)||!e.latestWkid||(n=e.latestWkid),null!=n&&k.has(n)?t.find((e=>k.has(e)))||t.find((e=>q.has(e)))||102100:n)}export{w as fromISODuration,l as getPopupLayers,E as isDimensionInterval,L as isElevationDimension,C as isGenericDimension,F as isTimeDimension,X as normalizeWKID,a as parseCapabilities,B as toTimeQueryParameter};