12345 |
- /*
- All material copyright ESRI, All Rights Reserved, unless otherwise specified.
- See https://js.arcgis.com/4.24/esri/copyright.txt for details.
- */
- import"../../geometry.js";import e from"../../request.js";import t from"../../core/Error.js";import i from"../../core/Logger.js";import{isNone as n,unwrapOr as r,isSome as a}from"../../core/maybe.js";import{WGS84 as s}from"../../geometry/support/spatialReferenceUtils.js";import{project as o}from"../../geometry/support/webMercatorUtils.js";import{convertToFeatureSet as l,convertToGeometry as c,convertFromGeometry as d}from"../graphics/featureConversionUtils.js";import u from"../graphics/OptimizedFeatureSet.js";import{validateGeoJSON as p,inferLayerProperties as m,createOptimizedFeatures as f}from"../graphics/sources/geojson/geojson.js";import{createDrawingInfo as g}from"../graphics/sources/support/clientSideDefaults.js";import y from"../support/FieldsIndex.js";import{kebabDict as w}from"../support/fieldType.js";import h from"../../geometry/SpatialReference.js";const b=i.getLogger("esri.layers.graphics.sources.ogcfeature"),j="http://www.opengis.net/def/crs/",F=`${j}OGC/1.3/CRS84`;async function I(i,r,a={},s=5){const{links:o}=i,l=G(o,"items","application/geo+json")||G(o,"http://www.opengis.net/def/rel/ogc/1.0/items","application/geo+json");if(n(l))throw new t("ogc-feature-layer:missing-items-page","Missing items url");const{data:c}=await e(l.href,{signal:a.signal,query:{limit:s,...a.customParameters,token:a.apiKey},headers:{accept:"application/geo+json"}});await p(c);const d=m(c,{geometryType:r.geometryType}),u=r.fields||d.fields||[],f=null!=r.hasZ?r.hasZ:d.hasZ,h=d.geometryType,j=r.objectIdField||d.objectIdFieldName||"OBJECTID";let F=r.timeInfo;const I=u.find((e=>e.name===j));if(!I){if(!d.objectIdFieldType)throw new t("ogc-feature-layer:missing-feature-id","Collection geojson require a feature id as a unique identifier");u.unshift({name:j,alias:j,type:"esriFieldTypeOID",editable:!1,nullable:!1})}else I.type="esriFieldTypeOID",I.editable=!1,I.nullable=!1;if(j!==d.objectIdFieldName){const e=u.find((e=>e.name===d.objectIdFieldName));e&&(e.type="esriFieldTypeInteger")}u===d.fields&&d.unknownFields.length>0&&b.warn({name:"ogc-feature-layer:unknown-field-types",message:"Some fields types couldn't be inferred from the features and were dropped",details:{unknownFields:d.unknownFields}});for(const e of u){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(!w.jsonValues.includes(e.type))throw new t("ogc-feature-layer:invalid-field-type",`invalid type for field "${e.name}"`,{field:e})}if(F){const e=new y(u);if(F.startTimeField){const t=e.get(F.startTimeField);t?(F.startTimeField=t.name,t.type="esriFieldTypeDate"):F.startTimeField=null}if(F.endTimeField){const t=e.get(F.endTimeField);t?(F.endTimeField=t.name,t.type="esriFieldTypeDate"):F.endTimeField=null}if(F.trackIdField){const t=e.get(F.trackIdField);t?F.trackIdField=t.name:(F.trackIdField=null,b.warn({name:"ogc-feature-layer:invalid-timeInfo-trackIdField",message:"trackIdField is missing",details:{timeInfo:F}}))}F.startTimeField||F.endTimeField||(b.warn({name:"ogc-feature-layer:invalid-timeInfo",message:"startTimeField and endTimeField are missing",details:{timeInfo:F}}),F=null)}return{drawingInfo:h?g(h):null,geometryType:h,fields:u,hasZ:!!f,objectIdField:j,timeInfo:F}}async function T(i,r={}){const{links:a}=i,s=G(a,"data","application/json")||G(a,"http://www.opengis.net/def/rel/ogc/1.0/data","application/json");if(n(s))throw new t("ogc-feature-layer:missing-collections-page","Missing collections url");const{apiKey:o,customParameters:l,signal:c}=r,{data:d}=await e(s.href,{signal:c,headers:{accept:"application/json"},query:{...l,token:o}});return d}async function k(i,r={}){const{links:a}=i,s=G(a,"conformance","application/json")||G(a,"http://www.opengis.net/def/rel/ogc/1.0/conformance","application/json");if(n(s))throw new t("ogc-feature-layer:missing-conformance-page","Missing conformance url");const{apiKey:o,customParameters:l,signal:c}=r,{data:d}=await e(s.href,{signal:c,headers:{accept:"application/json"},query:{...l,token:o}});return d}async function S(t,i={}){const{apiKey:n,customParameters:r,signal:a}=i,{data:s}=await e(t,{signal:a,headers:{accept:"application/json"},query:{...r,token:n}});return s}async function x(t,i={}){const r="application/vnd.oai.openapi+json;version=3.0",a=G(t.links,"service-desc",r);if(n(a))return b.warn("ogc-feature-layer:missing-openapi-page","The OGC API-Features server does not have an OpenAPI page."),null;const{apiKey:s,customParameters:o,signal:l}=i,{data:c}=await e(a.href,{signal:l,headers:{accept:r},query:{...o,token:s}});return c}function N(e){const t=/^http:\/\/www\.opengis.net\/def\/crs\/(?<authority>.*)\/(?<version>.*)\/(?<code>.*)$/i.exec(e)?.groups;if(!t)return null;const{authority:i,code:n}=t;switch(i.toLowerCase()){case"ogc":switch(n.toLowerCase()){case"crs27":return h.GCS_NAD_1927.wkid;case"crs83":return 4269;case"crs84":case"crs84h":return h.WGS84.wkid;default:return null}case"esri":case"epsg":{const e=Number.parseInt(n,10);return Number.isNaN(e)?null:e}default:return null}}async function q(e,t,i){const n=await v(e,t,i);return l(n)}async function v(i,l,p){const{capabilities:{query:{maxRecordCount:m}},collection:g,layerDefinition:y,queryParameters:{apiKey:w,customParameters:b},spatialReference:j,supportedCrs:F}=i,{links:I}=g,T=G(I,"items","application/geo+json")||G(I,"http://www.opengis.net/def/rel/ogc/1.0/items","application/geo+json");if(n(T))throw new t("ogc-feature-layer:missing-items-page","Missing items url");const{geometry:k,num:S,start:x,timeExtent:N,where:q}=l;if(l.objectIds)throw new t("ogc-feature-layer:query-by-objectids-not-supported","Queries with objectids are not supported");const v=h.fromJSON(j),M=r(l.outSpatialReference,v),C=M.isWGS84?null:O(M,F),P=D(k,F),W=R(N),Z=$(q),K=S??(null!=x&&void 0!==x?10:m),{data:L}=await e(T.href,{...p,query:{...b,...P,crs:C,datetime:W,query:Z,limit:K,startindex:x,token:w},headers:{accept:"application/geo+json"}});let A=!1;if(L.links){const e=L.links.find((e=>"next"===e.rel));A=!!e}!A&&Number.isInteger(L.numberMatched)&&Number.isInteger(L.numberReturned)&&(A=L.numberReturned<L.numberMatched);const{fields:E,globalIdField:J,hasM:U,hasZ:_,objectIdField:z}=y,B=y.geometryType,Q=f(L,{geometryType:B,hasZ:_,objectIdField:z});if(!C&&M.isWebMercator)for(const e of Q)if(a(e.geometry)){const t=c(e.geometry,B,_,!1);t.spatialReference=h.WGS84,e.geometry=d(o(t,M))}for(const e of Q)e.objectId=e.attributes[z];const V=C||!C&&M.isWebMercator?M.toJSON():s,H=new u;return H.exceededTransferLimit=A,H.features=Q,H.fields=E,H.geometryType=B,H.globalIdFieldName=J,H.hasM=U,H.hasZ=_,H.objectIdFieldName=z,H.spatialReference=V,H}function M(e){return a(e)&&"extent"===e.type}function O(e,t){const{isWebMercator:i,wkid:n}=e;if(!n)return null;const r=i?t[3857]??t[102100]??t[102113]??t[900913]:t[e.wkid];return r?`${j}${r}`:null}function C(e){if(n(e))return"";const{xmin:t,ymin:i,xmax:r,ymax:a}=e;return`${t},${i},${r},${a}`}function R(e){if(n(e))return null;const{start:t,end:i}=e;return`${a(t)?t.toISOString():".."}/${a(i)?i.toISOString():".."}`}function $(e){return n(e)||!e||"1=1"===e?null:e}function D(e,t){if(!M(e))return null;const{spatialReference:i}=e;if(!i||i.isWGS84)return{bbox:C(e)};const n=O(i,t);return a(n)?{bbox:C(e),"bbox-crs":n}:i.isWebMercator?{bbox:C(o(e,h.WGS84))}:null}function G(e,t,i){return e.find((e=>e.rel===t&&e.type===i))||e.find((e=>e.rel===t&&!e.type))}export{F as crsDefault,j as crsPrefix,I as getCollectionDefinition,T as getServerCollections,k as getServerConformance,S as getServerLandingPage,x as getServerOpenApi,N as getSpatialReferenceWkid,q as queryFeatureSetJSON,v as queryOptimizedFeatureSet};
|