@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 8.94 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import e from"../../request.js";import t from"../../core/Error.js";import n from"../../core/Logger.js";import{makeAbsolute as i,addQueryParameters as r,urlToObject as o}from"../../core/urlUtils.js";import a from"../../geometry/SpatialReference.js";import{wgs84 as s}from"../../geometry/support/spatialReferenceUtils.js";import{project as l}from"../../geometry/support/webMercatorUtils.js";import{convertToFeatureSet as c,convertToGeometry as u,convertFromGeometry as d}from"../graphics/featureConversionUtils.js";import p from"../graphics/OptimizedFeatureSet.js";import{validateGeoJSON as f,inferLayerProperties as m,createOptimizedFeatures as g}from"../graphics/sources/geojson/geojson.js";import{createDrawingInfo as y}from"../graphics/sources/support/clientSideDefaults.js";import{mixAttributes as w}from"../graphics/sources/support/sourceUtils.js";import h from"../support/FieldsIndex.js";import{kebabDict as b}from"../support/fieldType.js";import{utc as j}from"../../time/constants.js";const F=()=>n.getLogger("esri.layers.ogc.ogcFeatureUtils"),I="startindex",T=new Set([I,"offset"]),k="http://www.opengis.net/def/crs/",x=`${k}OGC/1.3/CRS84`;async function S(n,o,a={},s=5){const{links:l}=n,c=L(l,"items","application/geo+json")||L(l,"http://www.opengis.net/def/rel/ogc/1.0/items","application/geo+json");if(null==c)throw new t("ogc-feature-layer:missing-items-page","Missing items url");const{apiKey:u,customParameters:d,signal:p}=a,g=i(c.href,n.landingPage.url),w={limit:s,...d,token:u},T=r(g,w),k={accept:"application/geo+json"},{data:x}=await e(T,{signal:p,headers:k}),S=U(T,s,x.links)??I;f(x);const v=x.numberMatched,O=m(x,{geometryType:o.geometryType}),P=o.fields||O.fields||[],q=null!=o.hasZ?o.hasZ:O.hasZ,C=O.geometryType,N=o.objectIdField||O.objectIdFieldName||"OBJECTID";let R=o.timeInfo;const W=P.find(({name:e})=>e===N);if(W)W.editable=!1,W.nullable=!1;else{if(!O.objectIdFieldType)throw new t("ogc-feature-layer:missing-feature-id","Collection geojson require a feature id as a unique identifier");P.unshift({name:N,alias:N,type:"number"===O.objectIdFieldType?"esriFieldTypeOID":"esriFieldTypeString",editable:!1,nullable:!1})}if(N!==O.objectIdFieldName){const e=P.find(({name:e})=>e===O.objectIdFieldName);e&&(e.type="esriFieldTypeInteger")}P===O.fields&&O.unknownFields.length>0&&F().warn({name:"ogc-feature-layer:unknown-field-types",message:"Some fields types couldn't be inferred from the features and were dropped",details:{unknownFields:O.unknownFields}});for(const e of P){if(null==e.name&&(e.name=e.alias),null==e.alias&&(e.alias=e.name),"esriFieldTypeOID"!==e.type&&"esriFieldTypeGlobalID"!==e.type&&(e.editable=null==e.editable||!!e.editable,e.nullable=null==e.nullable||!!e.nullable),!e.name)throw new t("ogc-feature-layer:invalid-field-name","field name is missing",{field:e});if(!b.jsonValues.includes(e.type))throw new t("ogc-feature-layer:invalid-field-type",`invalid type for field "${e.name}"`,{field:e})}if(R){const e=new h(P);if(R.startTimeField){const t=e.get(R.startTimeField);t?(R.startTimeField=t.name,t.type="esriFieldTypeDate"):R.startTimeField=null}if(R.endTimeField){const t=e.get(R.endTimeField);t?(R.endTimeField=t.name,t.type="esriFieldTypeDate"):R.endTimeField=null}if(R.trackIdField){const t=e.get(R.trackIdField);t?R.trackIdField=t.name:(R.trackIdField=null,F().warn({name:"ogc-feature-layer:invalid-timeInfo-trackIdField",message:"trackIdField is missing",details:{timeInfo:R}}))}R.timeReference||={timeZoneIANA:j},R.startTimeField||R.endTimeField||(F().warn({name:"ogc-feature-layer:invalid-timeInfo",message:"startTimeField and endTimeField are missing",details:{timeInfo:R}}),R=void 0)}return{drawingInfo:C?y(C):null,extent:K(n),geometryType:C,fields:P,hasZ:!!q,objectIdField:N,paginationParameter:S,timeInfo:R,featureCount:v}}async function v(n,r={}){const{links:o,url:a}=n,s=L(o,"data","application/json")??L(o,"http://www.opengis.net/def/rel/ogc/1.0/data","application/json");if(!s)throw new t("ogc-feature-layer:missing-collections-page","Missing collections url");const{apiKey:l,customParameters:c,signal:u}=r,d=i(s.href,a),{data:p}=await e(d,{signal:u,headers:{accept:"application/json"},query:{...c,token:l}});for(const e of p.collections)e.landingPage=n;return p}async function O(n,r={}){const{links:o,url:a}=n,s=L(o,"conformance","application/json")||L(o,"http://www.opengis.net/def/rel/ogc/1.0/conformance","application/json");if(null==s)throw new t("ogc-feature-layer:missing-conformance-page","Missing conformance url");const{apiKey:l,customParameters:c,signal:u}=r,d=i(s.href,a),{data:p}=await e(d,{signal:u,headers:{accept:"application/json"},query:{...c,token:l}});return p}async function P(t,n={}){const{apiKey:i,customParameters:r,signal:o}=n,{data:a}=await e(t,{signal:o,headers:{accept:"application/json"},query:{...r,token:i}});return a.url=t,a}async function q(t,n={}){const{links:r,url:o}=t,a=L(r,"service-desc","application/vnd.oai.openapi+json;version=3.0");if(null==a)return F().warn("ogc-feature-layer:missing-openapi-page","The OGC API-Features server does not have an OpenAPI page."),null;const{apiKey:s,customParameters:l,signal:c}=n,u=i(a.href,o),{data:d}=await e(u,{signal:c,headers:{accept:"application/vnd.oai.openapi+json;version=3.0"},query:{...l,token:s}});return d}function C(e){const t=/^http:\/\/www\.opengis.net\/def\/crs\/(?<authority>.*)\/(?<version>.*)\/(?<code>.*)$/i.exec(e),n=t?.groups;if(!n)return null;const{authority:i,code:r}=n;switch(i.toLowerCase()){case"ogc":switch(r.toLowerCase()){case"crs27":return a.GCS_NAD_1927.wkid;case"crs83":return 4269;case"crs84":case"crs84h":return a.WGS84.wkid;default:return null}case"esri":case"epsg":{const e=Number.parseInt(r,10);return Number.isNaN(e)?null:e}default:return null}}async function N(e,t,n){const i=await R(e,t,n);return c(i)}async function R(n,r,o){const{collection:{links:c,landingPage:{url:f}},layerDefinition:m,maxRecordCount:y,queryParameters:{apiKey:b,customParameters:j},spatialReference:F,supportedCrs:I}=n,T=L(c,"items","application/geo+json")||L(c,"http://www.opengis.net/def/rel/ogc/1.0/items","application/geo+json");if(!T)throw new t("ogc-feature-layer:missing-items-page","Missing items url");const{geometry:k,num:x,start:S,timeExtent:v,where:O}=r;if(r.objectIds)throw new t("ogc-feature-layer:query-by-objectids-not-supported","Queries with object ids are not supported");const P=a.fromJSON(F),q=r.outSpatialReference??P,C=q.isWGS84?null:$(q,I),N=Z(k,I),R=M(v),W=D(O),G=x??(null==S?y:10),K=0===S?void 0:S,{fields:U,geometryType:A,hasZ:J,objectIdField:z,paginationParameter:E}=m,_=i(T.href,f),{data:B}=await e(_,{...o,query:{...j,...N,crs:C,datetime:R,query:W,limit:G,[E]:K,token:b},headers:{accept:"application/geo+json"}}),Q=g(B,{geometryType:A,hasZ:J,objectIdField:z}),V=Q.length===G&&!!L(B.links??[],"next","application/geo+json"),H=new h(U);for(const e of Q){const t={};w(H,t,e.attributes,!0);for(const e of H.fields)e.nullable&&!(e.name in t)&&(t[e.name]=null);t[z]=e.attributes[z],e.attributes=t}if(!C&&q.isWebMercator)for(const e of Q)if(null!=e.geometry&&null!=A){const t=u(e.geometry,A,J,!1);t.spatialReference=a.WGS84,e.geometry=d(l(t,q))}for(const e of Q)e.objectId=e.attributes[z];const X=C||!C&&q.isWebMercator?q.toJSON():s,Y=new p;return Y.exceededTransferLimit=V,Y.features=Q,Y.fields=U,Y.geometryType=A,Y.hasZ=J,Y.spatialReference=X,Y}function W(e){return null!=e&&"extent"===e.type}function $(e,t){const{isWebMercator:n,wkid:i,latestWkid:r}=e;if(!i&&!r)return null;const o=n?t[3857]??t[102100]??t[102113]??t[900913]:i&&t[i]||r&&t[r];return o?`${k}${o}`:null}function G(e){if(!e)return"";const{xmin:t,ymin:n,xmax:i,ymax:r}=e;return`${t},${n},${i},${r}`}function M(e){if(!e)return null;const{start:t,end:n}=e;return`${null!=t?t.toISOString():".."}/${null!=n?n.toISOString():".."}`}function D(e){return e&&"1=1"!==e?e:null}function Z(e,t){if(!W(e))return null;const{spatialReference:n}=e;if(!n||n.isWGS84)return{bbox:G(e)};const i=$(n,t);return null!=i?{bbox:G(e),"bbox-crs":i}:n.isWebMercator?{bbox:G(l(e,a.WGS84))}:null}function K(e){const t=e.extent?.spatial;if(!t)return null;const n=t.bbox[0],i=4===n.length,[r,o]=n,s=i?void 0:n[2];return{xmin:r,ymin:o,xmax:i?n[2]:n[3],ymax:i?n[3]:n[4],zmin:s,zmax:i?void 0:n[5],spatialReference:a.WGS84.toJSON()}}function L(e,t,n){return e.find(({rel:e,type:i})=>e===t&&i===n)??e.find(({rel:e,type:n})=>e===t&&!n)}function U(e,t,n){if(!n)return;const i=L(n,"next","application/geo+json"),r=o(i?.href)?.query;if(!r)return;const a=o(e).query,s=Object.keys(a??{}),l=Object.entries(r).filter(([e])=>!s.includes(e)).find(([e,n])=>T.has(e.toLowerCase())&&Number.parseInt(n,10)===t),c=l?.[0];return c}export{x as crsDefault,k as crsPrefix,S as getCollectionDefinition,v as getServerCollectionsPage,O as getServerConformance,P as getServerLandingPage,q as getServerOpenApi,C as getSpatialReferenceWkid,N as queryFeatureSetJSON,R as queryOptimizedFeatureSet};