UNPKG

@arcgis/core

Version:

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

6 lines (5 loc) • 9.68 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{urlToObject as n}from"../../core/urlUtils.js";import r from"../../geometry/Extent.js";import i from"../../geometry/SpatialReference.js";import{isAxesOrderReversedForWkid as s}from"../ogc/crsUtils.js";import{DateTime as o,FixedOffsetZone as l}from"luxon";const a={84:4326,83:4269,27:4267};function u(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=x("Capability",i),o=x("Service",i),l=s&&x("Request",s);if(!s||!o||!l)return null;const a=x("Layer",s);if(!a)return null;const u="WMS_Capabilities"===i.nodeName||"WMT_MS_Capabilities"===i.nodeName?i.getAttribute("version"):"1.3.0",c=N("Title",o,"")||N("Name",o,""),d=N("AccessConstraints",o,""),p=/^none$/i.test(d)?"":d,h=N("Abstract",o,""),g=parseInt(N("MaxWidth",o,"5000"),10),A=parseInt(N("MaxHeight",o,"5000"),10),L=b(l,"GetMap"),C=y(l,"GetMap"),F=S(a,u,r);if(!F)return null;let M,T=0;const I=Array.prototype.slice.call(s.childNodes),R=F.sublayers??[],v=e=>{null!=e&&R.push(e)};I.forEach((e=>{"Layer"===e.nodeName&&(0===T?M=e:1===T?(F.name&&(F.name="",v(S(M,u,r))),v(S(e,u,r))):v(S(e,u,r)),T++)}));const U=F.sublayers??[],V=F.fullExtents??[];0===U.length&&U.push(F),F.extent??=U[0].extent;const _=F.spatialReferences.length>0?F.spatialReferences:m(F),O=y(l,"GetFeatureInfo"),B=O?b(l,"GetFeatureInfo"):null,j=f(U),k=F.minScale||0,q=F.maxScale||0,X=F.dimensions??[],D=j.reduce(((e,t)=>e.concat(t.dimensions??[])),[]),G=X.concat(D).filter(w);let $=null;if(G.length){const t=G.map((e=>{const{extent:t}=e;return E(t)?t.map((e=>e.getTime())):t?.map((e=>[e.min.getTime(),e.max.getTime()]))})).flat(2).filter(e);$={startTimeField:null,endTimeField:null,trackIdField:void 0,timeExtent:[Math.min(...t),Math.max(...t)]}}return{copyright:p,description:h,dimensions:X,extent:F.extent,fullExtents:V,featureInfoFormats:B,featureInfoUrl:O,mapUrl:C,maxWidth:g,maxHeight:A,maxScale:q,minScale:k,layers:j,spatialReferences:_,supportedImageFormatTypes:L,timeInfo:$,title:c,version:u}}function c(e){const t=e.filter((e=>e.popupEnabled&&e.name&&e.queryable));return t.length?t.map((({name:e})=>e)).join():null}function m(e){if(e.spatialReferences.length>0)return e.spatialReferences;if(e.sublayers)for(const t of e.sublayers){const e=m(t);if(e.length>0)return e}return[]}function f(e){let t=[];for(const n of e)t.push(n),n.sublayers?.length&&(t=t.concat(f(n.sublayers)),delete n.sublayers);return t}function d(e,t,n){return t.getAttribute(e)??n}function p(e,t,n,r){const i=x(e,n);return i?d(t,i,r):r}function x(e,t){for(let n=0;n<t.childNodes.length;n++){const r=t.childNodes[n];if(L(r)&&r.nodeName===e)return r}return null}function h(e,t){if(null==t)return[];const n=[];for(let r=0;r<t.childNodes.length;r++){const i=t.childNodes[r];L(i)&&i.nodeName===e&&n.push(i)}return n}function N(e,t,n){return x(e,t)?.textContent??n}function g(e,t,n){if(!e)return null;const r=parseFloat(e.getAttribute("minx")),i=parseFloat(e.getAttribute("miny")),s=parseFloat(e.getAttribute("maxx")),o=parseFloat(e.getAttribute("maxy"));let l,a,u,c;return n?(l=isNaN(i)?-Number.MAX_VALUE:i,a=isNaN(r)?-Number.MAX_VALUE:r,u=isNaN(o)?Number.MAX_VALUE:o,c=isNaN(s)?Number.MAX_VALUE:s):(l=isNaN(r)?-Number.MAX_VALUE:r,a=isNaN(i)?-Number.MAX_VALUE:i,u=isNaN(s)?Number.MAX_VALUE:s,c=isNaN(o)?Number.MAX_VALUE:o),{xmin:l,ymin:a,xmax:u,ymax:c,spatialReference:{wkid:t}}}function y(e,t){const n=x(t,e);if(n){const e=x("DCPType",n);if(e){const t=x("HTTP",e);if(t){const e=x("Get",t);if(e){let t=p("OnlineResource","xlink:href",e,null);if(t){const e=t.indexOf("&");return-1!==e&&e===t.length-1&&(t=t.slice(0,-1)),T(t,["service","request"])}}}}}return null}function b(t,n){const r=h("Operation",t);if(!r.length){return h("Format",x(n,t)).map((({textContent:e})=>e)).filter(e)}const i=[];for(const e of r)if(e.getAttribute("name")===n){const t=h("Format",e);for(const{textContent:e}of t)null!=e&&i.push(e)}return i}function A(e,t,n){const r=x(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 S(e,t,n){if(!e)return null;const o=e.getAttribute("queryable")?.toLowerCase(),l="1"===o||"true"===o,u={id:n.idCounter++,fullExtents:[],parentLayerId:null,queryable:l,spatialReferences:[],sublayers:null},c=x("LatLonBoundingBox",e),m=x("EX_GeographicBoundingBox",e);let f=null;c&&(f=g(c,4326)),m&&(f=new r(0,0,0,0,new i({wkid:4326})),f.xmin=parseFloat(N("westBoundLongitude",m,"0")),f.ymin=parseFloat(N("southBoundLatitude",m,"0")),f.xmax=parseFloat(N("eastBoundLongitude",m,"0")),f.ymax=parseFloat(N("northBoundLatitude",m,"0"))),c||m||(f=new r(-180,-90,180,90,new i({wkid:4326}))),u.minScale=A(e,"MaxScaleDenominator",0),u.maxScale=A(e,"MinScaleDenominator",0);const p=["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)u.name=e.textContent||"";else if("Title"===e.nodeName)u.title=e.textContent||"";else if("Abstract"===e.nodeName)u.description=e.textContent||"";else if("BoundingBox"===e.nodeName){const n=e.getAttribute(p);if(n&&0===n.indexOf("EPSG:")){const r=parseInt(n.slice(5),10);0===r||isNaN(r)||f||(f="1.3.0"===t?g(e,r,s(r)):g(e,r))}const r=n?.indexOf(":");if(r&&r>-1){let i=parseInt(n.slice(r+1),10);0===i||isNaN(i)||(i=a[i]??i);const o="1.3.0"===t?g(e,i,s(i)):g(e,i);o&&u.fullExtents&&u.fullExtents.push(o)}}else if(e.nodeName===p){(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=a[t]??t;u.spatialReferences.includes(e)||u.spatialReferences.push(e)}}))}else if("Style"!==e.nodeName||u.legendUrl){if("Layer"===e.nodeName){const r=S(e,t,n);r&&(r.parentLayerId=u.id,u.sublayers||(u.sublayers=[]),u.sublayers.push(r))}}else{const t=x("LegendURL",e);if(t){const e=x("OnlineResource",t);e&&(u.legendUrl=e.getAttribute("xlink:href"))}}})),u.extent=f,u.dimensions=h("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"!==d("default",e,"0"),l="0"!==d("nearestValue",e,"0"),a="0"!==d("current",e,"0");if(w({name:t,units:n})){return{name:"time",units:"ISO8601",extent:v(r),default:v(s),multipleValues:o,nearestValue:l,current:a}}if(F({name:t,units:n})){return{name:"elevation",units:n,extent:I(r),unitSymbol:i,default:I(s),multipleValues:o,nearestValue:l}}return{name:t,units:n,extent:R(r),unitSymbol:i,default:R(s),multipleValues:o,nearestValue:l}})),u}function E(e){return Array.isArray(e)&&e.length>0&&e[0]instanceof Date}function L(e){return e.nodeType===Node.ELEMENT_NODE}function C(e){return void 0!==e.min&&void 0!==e.max}function F(e){return/^elevation$/i.test(e.name)&&/^(epsg|crs):\d+$/i.test(e.units)}function M(e){return!w(e)&&!F(e)}function w(e){return/^time$/i.test(e.name)&&/^iso8601$/i.test(e.units)}function T(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 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: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 v(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:U(t[0]),max:U(t[1]),resolution:t.length>=3&&"0"!==t[2]?V(t[2]):void 0}})).filter(e):r.map((e=>U(e)))}function U(e){return o.fromISO(e,{zone:l.utcInstance}).toJSDate()}function V(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:_(n[1]),months:_(n[2]),days:_(n[3]),hours:_(n[4]),minutes:_(n[5]),seconds:_(n[6])}}function _(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 O(e){return e.toISOString().replace(/\.[0-9]{3}/,"")}const B="0000-01-01T00:00:00Z",j="9999-12-31T23:59:59Z";function k(e){if(!e||e.isAllTime||e.isEmpty)return;const{start:t,end:n}=e;if(t&&n&&t.getTime()===n.getTime())return`${O(t)}`;return`${t?O(t):B}/${n?O(n):j}`}const q=new Set([102100,3857,102113,900913]),X=new Set([3395,54004]);function D(e,t){let n=e.wkid;return null==t?n:(null!=n&&t.includes(n)||!e.latestWkid||(n=e.latestWkid),null!=n&&q.has(n)?t.find((e=>q.has(e)))||t.find((e=>X.has(e)))||102100:n)}export{V as fromISODuration,c as getPopupLayers,C as isDimensionInterval,F as isElevationDimension,M as isGenericDimension,w as isTimeDimension,D as normalizeWKID,u as parseCapabilities,k as toTimeQueryParameter};