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