@vertigis/arcgis-extensions 53.11.0 → 53.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/Feature.js +1 -1
- package/data/convert.d.ts +6 -0
- package/data/convert.js +1 -1
- package/data/support/_gpxExport.d.ts +114 -0
- package/data/support/_gpxExport.js +1 -0
- package/docs/html/assets/navigation.js +1 -1
- package/docs/html/assets/search.js +1 -1
- package/docs/html/functions/data_convert.toGpx.html +3 -0
- package/docs/html/functions/data_support__gpxExport.appendOptionsToElement.html +5 -0
- package/docs/html/functions/data_support__gpxExport.buildGpxTrack.html +6 -0
- package/docs/html/functions/data_support__gpxExport.buildGpxTrackPoint.html +7 -0
- package/docs/html/functions/data_support__gpxExport.buildGpxWaypoint.html +8 -0
- package/docs/html/functions/data_support__gpxExport.createGpxDocument.html +2 -0
- package/docs/html/functions/data_support__gpxExport.getGpxExtensions.html +6 -0
- package/docs/html/functions/data_support__gpxExport.getGpxTrackDescription.html +4 -0
- package/docs/html/functions/data_support__gpxExport.getGpxTrackId.html +5 -0
- package/docs/html/functions/data_support__gpxExport.getGpxTrackName.html +4 -0
- package/docs/html/functions/data_support__gpxExport.getGpxTrackTime.html +4 -0
- package/docs/html/functions/data_support__gpxExport.serializeGpxDocument.html +3 -0
- package/docs/html/interfaces/data_support__gpxExport.GpxFeatureOptions.html +12 -0
- package/docs/html/modules/data_convert.html +1 -0
- package/docs/html/modules/data_support__gpxExport.html +15 -0
- package/docs/html/modules.html +1 -0
- package/docs/html/variables/data_support__gpxExport.GPX_NS.html +1 -0
- package/docs/html/variables/data_support__gpxExport.V_NS.html +1 -0
- package/docs/html/variables/version.version.html +1 -1
- package/package.json +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
package/data/Feature.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{__decorate as e}from"tslib";import t from"@arcgis/core/Graphic";import s from"@arcgis/core/core/Collection";import{fromJSON as i}from"@arcgis/core/geometry/support/jsonUtils";import{EntityBase as r}from"../Entity.js";import{Hyperlink as a}from"../Hyperlink.js";import{InvalidOperationError as o}from"../InvalidOperationError.js";import{isLayerExtension as n,isTableExtension as l,ItemType as h}from"../ItemType.js";import{handles as u}from"../support/HandlesMixin.js";import{serializable as p}from"../support/Serializable.js";import{createIHandle as c,notifyChange as m,onWatch as f,watch as d,watchEvent as g}from"../support/observableUtils.js";import{CaseInsensitiveObservableMap as y}from"../utilities/CaseInsensitiveObservableMap.js";import{MapTransformCollection as _}from"../utilities/MapTransformCollection.js";import{ObservableMap as b}from"../utilities/ObservableMap.js";import{ReadOnlyMap as x}from"../utilities/ReadOnlyMap.js";import{Time as F}from"../utilities/Time.js";import{flatten as w,groupBy as v}from"../utilities/array.js";import{checkArg as I}from"../utilities/checkArg.js";import{compare as S}from"../utilities/collection.js";import{isCodedValueDomain as z,isGeometry as A}from"../utilities/esri.js";import{getArcadeExpressionFromField as E,getRelationshipFromField as j,isArcadeExpressionField as T}from"../utilities/field.js";import{esriFormatToGeocortexFormat as k,parse as R}from"../utilities/format/date.js";import{NumberFormat as O}from"../utilities/format/formats.js";import{parse as M}from"../utilities/format/number.js";import{format as N}from"../utilities/format/string.js";import{esriFormatToGeocortexFormat as D,parse as V}from"../utilities/format/time.js";import{find as U,map as P}from"../utilities/iterable.js";import{getLogger as C}from"../utilities/log.js";import{map as G}from"../utilities/promise.js";import{caseInsensitiveEquals as H}from"../utilities/string.js";import{FeatureSettings as L}from"./FeatureSettings.js";import{Schema as Z}from"./Schema.js";const $=C("geocortex.api.data.Feature");export const SCORE_FIELD="_score";export const SCORE_FIELD_ORIGINAL="_score_original";let K=class extends r{attributes;get geometry(){return this._geometry}set geometry(e){this._geometry=A(e)||!e?e:i(e),this.schema.spatialReference=this._geometry?.spatialReference,m(this,"geometryType")}settings;schema;attachments;expressionFieldValues;_itemType=h.FEATURE;get geometryType(){return this.geometry?this.geometry.type:void 0}get source(){return this._source}set source(e){this._source===e||null==this._source&&null==e||(this._source&&this.settings.parent===this._source.featureSettings&&(this.settings.parent=void 0),this._source&&this.schema.parent===this._source.schema&&(this.schema.parent=void 0),this._source=e,this.settings.parent||(this.settings.parent=e?e.featureSettings:void 0),this.schema.parent||(this.schema.parent=e?e.schema:void 0),m(this,"attachmentsInitialized"),m(this,"relatedFeaturesInitialized"))}get primaryKey(){const e=this.attributes.get(this.schema.primaryKeyField);return null!=e?`${e}`:void 0}get hasGlobalId(){return!!this.schema.fields.find((e=>"global-id"===e.type))}get globalId(){const e=this.schema.fields.find((e=>"global-id"===e.type));return e?this.attributes.get(e.name):void 0}set globalId(e){const t=this.schema.fields.find((e=>"global-id"===e.type));if(!t)throw new o("Cannot set global ID on feature -- no global ID field.");this.attributes.set(t.name,e)}get presentableAttributes(){return null==this._presentableAttributes&&(this._presentableAttributes=new W(this)),this._presentableAttributes}get title(){return this.format(this._title||"")}get description(){return this.format(this._description)}get hyperlinks(){return this._hyperlinks||(this._hyperlinks=new ie(this))}get relatedFeatures(){return this._relatedFeatures}get type(){if(this.schema.typeIdField&&this.attributes.has(this.schema.typeIdField)){const e=this.attributes.get(this.schema.typeIdField);return this.schema.types.find((t=>t.id===e))}}get attachmentsInitialized(){return!this.source||this._attachmentsInitialized}get relatedFeaturesInitialized(){return!this.source||this.source.relationships.every((e=>this._initializedRelationships.has(e)))}get expressionsInitialized(){return!this.settings.popupTemplate?.expressionInfos?.length||this._expressionsInitialized}get _hydrationStatus(){return this._featureHydrationStatus?this._featureHydrationStatus:this.source?.capabilities?.supportsQuery&&1===this.attributes.size&&void 0!==this.primaryKey?"dehydrated":"hydrated"}set _hydrationStatus(e){this._featureHydrationStatus=e}get _key(){return`${this.source?.id}//${this.primaryKey??this.globalId??this.id}`}get _title(){let e;return this.settings.popupTemplate&&(e="function"==typeof this.settings.popupTemplate.title?this.settings.popupTemplate.title():this.settings.popupTemplate.title),e||this.schema.displayField&&this.presentableAttributes.get(this.schema.displayField)||""}get _description(){if(this.settings.popupTemplate?.content){if("string"==typeof this.settings.popupTemplate.content)return this.settings.popupTemplate.content;if(Array.isArray(this.settings.popupTemplate.content)){const e=this.settings.popupTemplate.content.find((e=>"text"===e.type));if(e)return e.text}}return""}_geometry;_source;_presentableAttributes;_hyperlinks;_featureHydrationStatus;_relatedFeatures;_expressionFieldValues=new b;_expressionValuesUpdatePending=!1;_attachmentsInitialized=!1;_expressionsInitialized=!1;_initializedRelationships=new WeakSet;constructor(e){super(e),this.settings=new L,this.settings._setFeature(this),this.schema=new Z,this.schema._featureSettings=this.settings,this.attachments=new s,this.attributes=new y,this._relatedFeatures=new b,this.expressionFieldValues=new B(this._expressionFieldValues,this),this._handles.add([d(this.settings,"popupTemplate",(()=>{this._expressionsInitialized=!1,m(this,"expressionsInitialized")}),{sync:!0}),f(this,"title",(()=>{const e=d(this.settings,"popupTemplate.title",(()=>m(this,"title")),{sync:!0}),t=this.presentableAttributes.on("change",(()=>m(this,"title")));return c([e,t])})),f(this,"description",(()=>{const e=d(this.settings,"popupTemplate.content",(()=>m(this,"description")),{sync:!0}),t=this.presentableAttributes.on("change",(()=>m(this,"description")));return c([e,t])})),f(this,"relatedFeaturesInitialized",(()=>g(this,"source.relationships",["after-changes",()=>{m(this,"relatedFeaturesInitialized")}])))])}format(e,...t){let s="string"==typeof e?{format:e}:e;I("options",s).isNotMissing();const{format:i}=s;I("format",i).isNotMissing();let r=s.format.replace(Y,ee);return r=r.replace(q,((e,t,i,r,a)=>ae(this,t||i,r,{...s,format:a?`{0:${a}}`:"{0}"}))),r=r.replace(te,"{{"),s={...s},s.format=r,N(s,...t)}clearExpressionInfos(){this._expressionFieldValues.clear()}toGraphic(){return toGraphic(this)}async fetchExpressionInfos(e=!1){const{expressionInfos:t}=this.settings.popupTemplate??{};if(!t)return;const{runAsyncArcadeExpression:s}=await import("../utilities/arcade.js");if(await Promise.all(t.map((async e=>{try{const t=this.source?.layer??this.source?.sublayer;let i=this.source?.mapExtension;if(!i){const e=this.source?.layerExtension;i=e?.mapExtension}this._expressionFieldValues.set(e.name,await s(e.expression,{layer:t,map:i?.map,feature:this,spatialReference:this.schema.spatialReference}))}catch(t){t instanceof Error&&$.error({message:"Error evaluating expression '{0}': {1}.",error:t},e.name,t.message),this._expressionFieldValues.set(e.name,se)}}))),e)return this.attributes.on("change",(async e=>{this._expressionValuesUpdatePending||(this._expressionValuesUpdatePending=!0,setTimeout((async()=>{this._expressionValuesUpdatePending=!1,await this.fetchExpressionInfos()}),0))}));this._expressionsInitialized=!0,m(this,"expressionsInitialized")}async fetchRelatedFeatures(e,t){if(!this.source)return;let s=[];if(e){const t=new Set(Array.isArray(e)?e:[e]);for(const e of t){const t="string"==typeof e?this.source.relationships.find((t=>t.id===e)):e;if(!t||!this.source.relationships.includes(t))throw new o("Relationship not found in feature source.");s.push(t)}}else s=this.source.relationships.toArray();const i=await G(s,(async e=>[e,await(async()=>{const s=await e.getRelatedFeatures(this,t);return this._initializedRelationships.add(e),s})()]));for(const e of i)this._relatedFeatures.set(e[0],e[1]);m(this,"relatedFeaturesInitialized")}async fetchAttachments(){if(this.source){const e=await this.source.getAttachments(this);S(this.attachments,e,{equals:(e,t)=>e.id===t.id,onMissing:(e,t)=>{this.attachments.remove(e)},onNew:(e,t)=>{this.attachments.add(e)},onMatch:(e,t,s,i)=>{this.attachments.splice(s,1,t)}}),this._attachmentsInitialized=!0,m(this,"attachmentsInitialized")}}async addAttachment(e){return this.source?.addAttachment(this,e)}async deleteAttachments(e){return this.source?.deleteAttachments(this,e)}_getSerializableProperties(){return{...super._getSerializableProperties(),attributes:{serializeModes:["project"],serialize:e=>{const t={};if("project"===e&&this.primaryKey&&(this.source?.capabilities).supportsQuery)t[this.schema.primaryKeyField]=this.primaryKey;else for(const[e,s]of this.attributes.entries())t[e]=s;return t},deserialize:e=>{if(this.attributes.clear(),e instanceof Map||e instanceof b)e.forEach(((e,t)=>{this.attributes.set(t,e)}));else for(const[t,s]of Object.entries(e))this.attributes.set(t,s)}},geometry:{serializeModes:["project"],serialize:e=>"project"===e&&(this.source?.capabilities).supportsQuery?this.getDefault("geometry"):this.geometry?.toJSON(),deserialize:e=>{A(e)?this.geometry=e:this.geometry=e?i(e):void 0}},settings:{serializeModes:["project"],serialize:e=>"project"===e&&(this.source?.capabilities).supportsQuery?this.getDefault("settings"):this.settings.toJSON(e)},schema:{serializeModes:["project"],serialize:e=>"project"===e&&(this.source?.capabilities).supportsQuery?this.getDefault("schema"):this.schema.toJSON(e)},source:["project"]}}async _onInitialize(){const e=this._findRelationshipIds(this._title,this._description),t=this.source?this.source.relationships.map((e=>e.id)).toArray():[],s=[];for(const i of e)t.includes(i)?s.push(this.fetchRelatedFeatures(i)):$.error("Could not find relationship '{0}' referenced in feature title or description.",i);await Promise.all(s)}_findRelationshipIds(...e){const t=[];for(const s of e){let e;const i=s.replace(Y,ee);for(;e=X.exec(i),null!==e;){const s=e[0];t.includes(s)||t.push(e[1])}}return t}};K=e([p],K);export{K as Feature};export function toFeature(e,t){const s=new K(t);if(e.attributes){const t=e.attributes;for(const[e,i]of Object.entries(t))s.attributes.set(e,i)}return s.geometry=e.geometry,e.popupTemplate&&(s.settings.popupTemplate=e.popupTemplate),s}export function toGraphic(e){const s=new t;s.attributes={};for(const t of e.attributes.keys())s.attributes[t]=e.attributes.get(t);return n(e.source)&&e.source.layer&&(s.layer=e.source.layer),l(e.source)&&e.source.table&&(s.layer=e.source.table),s.geometry=e.geometry,e.settings.popupTemplate&&(s.popupTemplate=e.settings.popupTemplate),s}const J="Presentable attributes are read-only.",Q="Feature hyperlinks are read-only. Modify the feature's hyperlink templates instead.";class B extends x{_feature;_pending=new Set;constructor(e,t){super(e),this._feature=t}get(e){return super.has(e)||this._calcExpressionValue(e),super.get(e)}async _calcExpressionValue(e){if(!this._pending.has(e)){this._pending.add(e);try{const{spatialReference:t}=this._feature.schema,s=this._feature.settings.popupTemplate?.expressionInfos?.find((t=>t.name===e));if(!s)return;const{isArcadeScriptAsync:i,runAsyncArcadeExpression:r,arcadeScriptUsesGeometry:a,runArcadeExpression:o}=await import("../utilities/arcade.js");try{if(i(s.expression,t)){const i=this._feature.source?.layer??this._feature.source?.sublayer;let a=this._feature.source?.mapExtension;if(!a){const e=this._feature.source?.layerExtension;a=e?.mapExtension}this._originalMap.set(e,await r(s.expression,{feature:this._feature,layer:i,map:a?.map,spatialReference:t}))}else{if(a(s.expression,t)){const{enableGeometrySupport:e}=await import("@arcgis/core/arcade/arcade");await e()}this._originalMap.set(e,o(s.expression,{feature:this._feature,spatialReference:t}))}}catch(t){t instanceof Error&&$.error({message:"Error evaluating expression '{0}': {1}.",error:t},e,t.message),this._originalMap.set(e,se)}}finally{this._pending.delete(e)}}}}class W extends x{get size(){return this._feature.attributes.size+this._feature.schema.fields._expressionFieldsLength}_feature;_numObservers;_onAllObserversRemoved;constructor(e){super(new y),this._feature=e,this._handles.add([f(this,"size",(()=>d(this._feature.attributes,"size",(()=>m(this,"size")),{sync:!0}))),f(this,"size",(()=>d(this._feature.schema.fields,"_expressionFieldsLength",(()=>m(this,"size")),{sync:!0})))])}destroy(){this._onAllObserversRemoved?.(),this._numObservers=0,super.destroy()}clear(){throw new o(J)}delete(e){throw new o(J)}forEach(e,t){I("callback",e).isNotMissing();for(const s of this.keys())e.call(t,this.get(s),s,this)}get(e){const t=this._getFieldExtensionFormat(e);return this._formatAttribute(e,t)}has(e){for(const t of this.keys())if(H(t,e))return!0;return!1}set(...e){throw new o(J)}*entries(){yield*P(this.keys(),(e=>[e,this.get(e)]))}*keys(){yield*this._feature.attributes.keys();for(const e of this._feature.schema.fields.expressionFields)yield e.name;if(null!=this._feature.source?.relationships)for(const e of this._feature.source.relationships)if("one-to-one"===e.cardinality||"many-to-one"===e.cardinality)for(const t of e.relatedSource.schema.fields)yield`relationships/${e.id}/${t.name}`}*values(){yield*P(this.keys(),(e=>this.get(e)))}[Symbol.iterator](){return this.entries()}toJSON(){return Array.from(this.entries())}on(e,t){if(I("callback",t).isNotMissing(),!this._numObservers){const e=new Map,t=new Set,s=()=>{for(const e of t)e.remove();t.clear()};let i;const r=()=>{const t=()=>{i&&(window.clearTimeout(i),i=void 0)};t(),i=window.setTimeout((()=>{const s=[],i=[];for(const[t,i]of this.entries())i!==e.get(t)&&s.push([t,i]);for(const[t,s]of e.entries())this.has(t)&&s===this.get(t)||i.push([t,s]);if(s.length||i.length){const e={added:s,removed:i,target:this};if(this.hasEventListener("after-add"))for(const e of s)this.emit("after-add",{target:this,item:e});if(this.hasEventListener("after-remove"))for(const e of i)this.emit("after-remove",{target:this,item:e});this.emit("change",e),a()}t()}))},a=()=>{e.clear(),s();for(const s of this.keys()){const i=this._getFieldExtension(s);let a="{0}";if(i){const e=d(i,"format",r);t.add(e),i.format&&(a=i.format)}e.set(s,this._formatAttribute(s,a))}};a();const o=this._feature.attributes.on("change",r),n=this._feature.schema.fieldExtensions.on("change",r),l=[d(this._feature.settings.formatSettings,"numberFormat",r),d(this._feature.settings.formatSettings,"dateFormat",r),d(this._feature.settings.formatSettings,"timeFormat",r),d(this._feature.settings.formatSettings,"locale",r)],h=this._feature.expressionFieldValues.on("change",r),u=this._feature.schema.fields.on("change",(e=>{(e.added?.some((e=>T(e.name)))||e.removed?.some((e=>T(e.name))))&&r()})),p=d(this._feature.settings,"popupTemplate",r);this._onAllObserversRemoved=()=>{h.remove(),o.remove(),n.remove(),u.remove();for(const e of l)e.remove();p.remove(),e.clear(),s()}}const s=super.on(e,t);return this._numObservers++,{remove:()=>{s.remove(),this._numObservers--,this._numObservers||this._onAllObserversRemoved()}}}_getFieldExtension(e){const t=this._feature.schema.findFieldByName(e);if(t)return this._feature.schema.fieldExtensions.forField(t)}_getFieldExtensionFormat(e){const t=this._getFieldExtension(e);return t?t.format:"{0}"}_formatAttribute(e,t){const s=E(e);if(null!=s)return ae(this._feature,"expression",s,{format:t});const[i,r]=j(e);return null!=i?ae(this._feature,i,r,{format:t}):ae(this._feature,void 0,e,{format:t})}}const q=/\{(?:relationships[\\/]([\w-]*)[\\/])?(?:(expression)[\\/])?([_a-zA-ZÀ-ÖØ-öø-ÿ][._a-zA-ZÀ-ÖØ-öø-ÿ0-9()]*)(?::([^}]*))?\}/gi,X=/\{relationships\/([\w-]*)[\\/]([^}]*)\}/gi,Y=/{{/g,ee="\0MAGIC\0",te=new RegExp(ee,"g"),se="#INVALID";class ie extends _{_feature;_hyperlinks;constructor(e){super(e.settings.hyperlinkTemplates,(e=>this._getHyperlink(e))),this._feature=e}destroy(){for(const e of this)e.destroy();super.destroy()}_getHyperlink(e){return null==this._hyperlinks&&(this._hyperlinks=new WeakMap),this._hyperlinks.has(e)||this._hyperlinks.set(e,new re(this._feature,e)),this._hyperlinks.get(e)}}let re=class extends(u(a)){get url(){return this._template.url?this._feature.format(this._template.url):this._template.url}set url(e){throw new o(Q)}get text(){return this._template.text?this._feature.format(this._template.text):this._template.text}set text(e){throw new o(Q)}get iconUrl(){return this._template.iconUrl?this._feature.format(this._template.iconUrl):this._template.iconUrl}set iconUrl(e){throw new o(Q)}get target(){return this._template.target?this._feature.format(this._template.target):this._template.target}set target(e){throw new o(Q)}get tooltip(){return this._template.tooltip?this._feature.format(this._template.tooltip):this._template.tooltip}set tooltip(e){throw new o(Q)}_feature;_template;constructor(e,t){super(t.toJSON()),this._feature=e,this._template=t,this._handles.add(f(this,(e=>{const t=d(this._template,e,(()=>m(this,e)),{sync:!0}),s=this._feature.presentableAttributes.on("change",(()=>{m(this,e)})),i=this._feature.relatedFeatures.on("change",(()=>{m(this,e)}));return c([t,s,i])})))}_getSerializableProperties(){return{}}};function ae(e,t,s,i={format:"{0}"}){if(!H(t,"expression")){if(t){const r=U(e.relatedFeatures.keys(),(e=>H(e.id,t)));if(!r)return $.debug("Could not resolve related field '{0}/{1}",t,s),se;const a=Array.from(e.relatedFeatures.get(r));return"many-to-one"===r.cardinality||"one-to-one"===r.cardinality?a.length<1?($.debug("Could not resolve related field '{0}/{1}",t,s),se):oe(a[0],s,i):a.map((e=>oe(e,s,i))).filter((e=>""!==e)).join(",")}return oe(e,s,i)}if(!e.settings.popupTemplate?.expressionInfos?.find((e=>H(e.name,s))))return $.debug("Could not find expression '{0}'.",s),se;try{const t=e.expressionFieldValues.get(s)??i.defaultExpressionValue??"",r=e.schema.findFieldByName(`expression/${s}`),a=null==r?void 0:e.schema.fieldExtensions.forField(r);return ne(e,t,s,a?.formatSettings,i)}catch(e){if(e instanceof Error)return $.error({message:"Error evaluating expression '{0}': {1}.",error:e},s,e.message),se;throw e}}function oe(e,t,s){let i;if(i=e.attributes.get(t),null==i)return"";const r=e.schema.findFieldByName(t),a=e.type?.domains?.[r?.name??t],o=e=>e.codedValues?.find((e=>e.code.toString()===i.toString()))?.name??i;let n;if(H(t,e.schema.typeIdField)){const t=a&&"inherited"!==a.type?a:r?.domain;i="coded-value"===t?.type?o(t):e.type?.name??i}else if(a&&z(a))i=o(a);else if(r?.domain&&z(r.domain))i=o(r.domain);else if(r){switch(r.type){case"integer":case"small-integer":case"big-integer":case"single":case"double":i=M(i);break;case"date":i=R({timeZone:e.schema.timeZone},i);break;case"timestamp-offset":case"date-only":i=R({},i),"date-only"===r.type&&(s.isDateOnly=!0);break;case"time-only":i=V(i);break;default:i=`${i.toString()}`}const t=e.schema.fieldExtensions.forField(r);t&&(n=t.formatSettings)}return ne(e,i,t,n,s)}function ne(e,t,s,i,r){if("string"==typeof t&&(null==r.format||"{0}"===r.format))return t;const a={...r};if("number"==typeof t||t instanceof Date||t instanceof F){null==a.locale&&(a.locale=i?.locale??e.settings.formatSettings.locale);const r=e.settings.popupTemplate?.fieldInfos?.find((e=>H(e.fieldName,s)))?.format;"number"==typeof t?function(e,t,s,i){null==e.currency&&(e.currency=t?.currency??i.settings.formatSettings.currency);null==e.numberFormat&&(e.numberFormat=t?.numberFormat,null==e.numberFormat&&(e.numberFormat=null==s?i.settings.formatSettings.numberFormat:s.digitSeparator?O.NUMBER:O.FIXED_POINT));null==e.fractionalDigits&&(e.fractionalDigits=t?.fractionalDigits,null==e.fractionalDigits&&(e.fractionalDigits=null==s?i.settings.formatSettings.fractionalDigits:s.places))}(a,i,r,e):t instanceof Date?function(e,t,s,i){null==e.dateFormat&&(e.dateFormat=t?.dateFormat,null==e.dateFormat&&(e.dateFormat=null==s?i.settings.formatSettings.dateFormat:k(s.dateFormat)));null==e.timeZone&&(e.timeZone=t?.timeZone??i.settings.formatSettings.timeZone)}(a,i,r,e):function(e,t,s,i){null==e.timeFormat&&(e.timeFormat=t?.timeFormat,null==e.timeFormat&&(e.timeFormat=null==s?i.settings.formatSettings.timeFormat:D(s.dateFormat)))}(a,i,r,e)}return N(a,t)}re=e([p],re);export async function resolveRelatedFeatures(e){const t=v(e,(e=>e.source));await Promise.all(w([...t.keys()].map((e=>e.relationships.toArray()))).map((e=>(async e=>{[...(await e.getAllRelatedFeatures(t.get(e.source))).entries()].forEach((([t,s])=>{t.relatedFeatures.set(e,s)}))})(e))))}
|
|
1
|
+
import{__decorate as e}from"tslib";import t from"@arcgis/core/Graphic";import s from"@arcgis/core/core/Collection";import{fromJSON as i}from"@arcgis/core/geometry/support/jsonUtils";import{EntityBase as r}from"../Entity.js";import{Hyperlink as a}from"../Hyperlink.js";import{InvalidOperationError as o}from"../InvalidOperationError.js";import{isLayerExtension as n,isSublayerExtension as l,isTableExtension as h,ItemType as u}from"../ItemType.js";import{handles as p}from"../support/HandlesMixin.js";import{serializable as c}from"../support/Serializable.js";import{createIHandle as m,notifyChange as f,onWatch as d,watch as g,watchEvent as y}from"../support/observableUtils.js";import{CaseInsensitiveObservableMap as _}from"../utilities/CaseInsensitiveObservableMap.js";import{MapTransformCollection as b}from"../utilities/MapTransformCollection.js";import{ObservableMap as x}from"../utilities/ObservableMap.js";import{ReadOnlyMap as F}from"../utilities/ReadOnlyMap.js";import{Time as w}from"../utilities/Time.js";import{flatten as v,groupBy as I}from"../utilities/array.js";import{checkArg as S}from"../utilities/checkArg.js";import{compare as z}from"../utilities/collection.js";import{isCodedValueDomain as A,isGeometry as E}from"../utilities/esri.js";import{getArcadeExpressionFromField as j,getRelationshipFromField as T,isArcadeExpressionField as k}from"../utilities/field.js";import{esriFormatToGeocortexFormat as R,parse as O}from"../utilities/format/date.js";import{NumberFormat as M}from"../utilities/format/formats.js";import{parse as N}from"../utilities/format/number.js";import{format as D}from"../utilities/format/string.js";import{esriFormatToGeocortexFormat as V,parse as U}from"../utilities/format/time.js";import{find as P,map as C}from"../utilities/iterable.js";import{getLogger as G}from"../utilities/log.js";import{map as H}from"../utilities/promise.js";import{caseInsensitiveEquals as L}from"../utilities/string.js";import{FeatureSettings as Z}from"./FeatureSettings.js";import{Schema as $}from"./Schema.js";const K=G("geocortex.api.data.Feature");export const SCORE_FIELD="_score";export const SCORE_FIELD_ORIGINAL="_score_original";let J=class extends r{attributes;get geometry(){return this._geometry}set geometry(e){this._geometry=E(e)||!e?e:i(e),this.schema.spatialReference=this._geometry?.spatialReference,f(this,"geometryType")}settings;schema;attachments;expressionFieldValues;_itemType=u.FEATURE;get geometryType(){return this.geometry?this.geometry.type:void 0}get source(){return this._source}set source(e){this._source===e||null==this._source&&null==e||(this._source&&this.settings.parent===this._source.featureSettings&&(this.settings.parent=void 0),this._source&&this.schema.parent===this._source.schema&&(this.schema.parent=void 0),this._source=e,this.settings.parent||(this.settings.parent=e?e.featureSettings:void 0),this.schema.parent||(this.schema.parent=e?e.schema:void 0),f(this,"attachmentsInitialized"),f(this,"relatedFeaturesInitialized"))}get primaryKey(){const e=this.attributes.get(this.schema.primaryKeyField);return null!=e?`${e}`:void 0}get hasGlobalId(){return!!this.schema.fields.find((e=>"global-id"===e.type))}get globalId(){const e=this.schema.fields.find((e=>"global-id"===e.type));return e?this.attributes.get(e.name):void 0}set globalId(e){const t=this.schema.fields.find((e=>"global-id"===e.type));if(!t)throw new o("Cannot set global ID on feature -- no global ID field.");this.attributes.set(t.name,e)}get presentableAttributes(){return null==this._presentableAttributes&&(this._presentableAttributes=new q(this)),this._presentableAttributes}get title(){return this.format(this._title||"")}get description(){return this.format(this._description)}get hyperlinks(){return this._hyperlinks||(this._hyperlinks=new re(this))}get relatedFeatures(){return this._relatedFeatures}get type(){if(this.schema.typeIdField&&this.attributes.has(this.schema.typeIdField)){const e=this.attributes.get(this.schema.typeIdField);return this.schema.types.find((t=>t.id===e))}}get attachmentsInitialized(){return!this.source||this._attachmentsInitialized}get relatedFeaturesInitialized(){return!this.source||this.source.relationships.every((e=>this._initializedRelationships.has(e)))}get expressionsInitialized(){return!this.settings.popupTemplate?.expressionInfos?.length||this._expressionsInitialized}get _hydrationStatus(){return this._featureHydrationStatus?this._featureHydrationStatus:this.source?.capabilities?.supportsQuery&&1===this.attributes.size&&void 0!==this.primaryKey?"dehydrated":"hydrated"}set _hydrationStatus(e){this._featureHydrationStatus=e}get _key(){return`${this.source?.id}//${this.primaryKey??this.globalId??this.id}`}get _title(){let e;return this.settings.popupTemplate&&(e="function"==typeof this.settings.popupTemplate.title?this.settings.popupTemplate.title():this.settings.popupTemplate.title),e||this.schema.displayField&&this.presentableAttributes.get(this.schema.displayField)||""}get _description(){if(this.settings.popupTemplate?.content){if("string"==typeof this.settings.popupTemplate.content)return this.settings.popupTemplate.content;if(Array.isArray(this.settings.popupTemplate.content)){const e=this.settings.popupTemplate.content.find((e=>"text"===e.type));if(e)return e.text}}return""}_geometry;_source;_presentableAttributes;_hyperlinks;_featureHydrationStatus;_relatedFeatures;_expressionFieldValues=new x;_expressionValuesUpdatePending=!1;_attachmentsInitialized=!1;_expressionsInitialized=!1;_initializedRelationships=new WeakSet;constructor(e){super(e),this.settings=new Z,this.settings._setFeature(this),this.schema=new $,this.schema._featureSettings=this.settings,this.attachments=new s,this.attributes=new _,this._relatedFeatures=new x,this.expressionFieldValues=new W(this._expressionFieldValues,this),this._handles.add([g(this.settings,"popupTemplate",(()=>{this._expressionsInitialized=!1,f(this,"expressionsInitialized")}),{sync:!0}),d(this,"title",(()=>{const e=g(this.settings,"popupTemplate.title",(()=>f(this,"title")),{sync:!0}),t=this.presentableAttributes.on("change",(()=>f(this,"title")));return m([e,t])})),d(this,"description",(()=>{const e=g(this.settings,"popupTemplate.content",(()=>f(this,"description")),{sync:!0}),t=this.presentableAttributes.on("change",(()=>f(this,"description")));return m([e,t])})),d(this,"relatedFeaturesInitialized",(()=>y(this,"source.relationships",["after-changes",()=>{f(this,"relatedFeaturesInitialized")}])))])}format(e,...t){let s="string"==typeof e?{format:e}:e;S("options",s).isNotMissing();const{format:i}=s;S("format",i).isNotMissing();let r=s.format.replace(ee,te);return r=r.replace(X,((e,t,i,r,a)=>oe(this,t||i,r,{...s,format:a?`{0:${a}}`:"{0}"}))),r=r.replace(se,"{{"),s={...s},s.format=r,D(s,...t)}clearExpressionInfos(){this._expressionFieldValues.clear()}toGraphic(){return toGraphic(this)}async fetchExpressionInfos(e=!1){const{expressionInfos:t}=this.settings.popupTemplate??{};if(!t)return;const{runAsyncArcadeExpression:s}=await import("../utilities/arcade.js");if(await Promise.all(t.map((async e=>{try{const t=this.source?.layer??this.source?.sublayer;let i=this.source?.mapExtension;if(!i){const e=this.source?.layerExtension;i=e?.mapExtension}this._expressionFieldValues.set(e.name,await s(e.expression,{layer:t,map:i?.map,feature:this,spatialReference:this.schema.spatialReference}))}catch(t){t instanceof Error&&K.error({message:"Error evaluating expression '{0}': {1}.",error:t},e.name,t.message),this._expressionFieldValues.set(e.name,ie)}}))),e)return this.attributes.on("change",(async e=>{this._expressionValuesUpdatePending||(this._expressionValuesUpdatePending=!0,setTimeout((async()=>{this._expressionValuesUpdatePending=!1,await this.fetchExpressionInfos()}),0))}));this._expressionsInitialized=!0,f(this,"expressionsInitialized")}async fetchRelatedFeatures(e,t){if(!this.source)return;let s=[];if(e){const t=new Set(Array.isArray(e)?e:[e]);for(const e of t){const t="string"==typeof e?this.source.relationships.find((t=>t.id===e)):e;if(!t||!this.source.relationships.includes(t))throw new o("Relationship not found in feature source.");s.push(t)}}else s=this.source.relationships.toArray();const i=await H(s,(async e=>[e,await(async()=>{const s=await e.getRelatedFeatures(this,t);return this._initializedRelationships.add(e),s})()]));for(const e of i)this._relatedFeatures.set(e[0],e[1]);f(this,"relatedFeaturesInitialized")}async fetchAttachments(){if(this.source){const e=await this.source.getAttachments(this);z(this.attachments,e,{equals:(e,t)=>e.id===t.id,onMissing:(e,t)=>{this.attachments.remove(e)},onNew:(e,t)=>{this.attachments.add(e)},onMatch:(e,t,s,i)=>{this.attachments.splice(s,1,t)}}),this._attachmentsInitialized=!0,f(this,"attachmentsInitialized")}}async addAttachment(e){return this.source?.addAttachment(this,e)}async deleteAttachments(e){return this.source?.deleteAttachments(this,e)}_getSerializableProperties(){return{...super._getSerializableProperties(),attributes:{serializeModes:["project"],serialize:e=>{const t={};if("project"===e&&this.primaryKey&&(this.source?.capabilities).supportsQuery)t[this.schema.primaryKeyField]=this.primaryKey;else for(const[e,s]of this.attributes.entries())t[e]=s;return t},deserialize:e=>{if(this.attributes.clear(),e instanceof Map||e instanceof x)e.forEach(((e,t)=>{this.attributes.set(t,e)}));else for(const[t,s]of Object.entries(e))this.attributes.set(t,s)}},geometry:{serializeModes:["project"],serialize:e=>"project"===e&&(this.source?.capabilities).supportsQuery?this.getDefault("geometry"):this.geometry?.toJSON(),deserialize:e=>{E(e)?this.geometry=e:this.geometry=e?i(e):void 0}},settings:{serializeModes:["project"],serialize:e=>"project"===e&&(this.source?.capabilities).supportsQuery?this.getDefault("settings"):this.settings.toJSON(e)},schema:{serializeModes:["project"],serialize:e=>"project"===e&&(this.source?.capabilities).supportsQuery?this.getDefault("schema"):this.schema.toJSON(e)},source:["project"]}}async _onInitialize(){const e=this._findRelationshipIds(this._title,this._description),t=this.source?this.source.relationships.map((e=>e.id)).toArray():[],s=[];for(const i of e)t.includes(i)?s.push(this.fetchRelatedFeatures(i)):K.error("Could not find relationship '{0}' referenced in feature title or description.",i);await Promise.all(s)}_findRelationshipIds(...e){const t=[];for(const s of e){let e;const i=s.replace(ee,te);for(;e=Y.exec(i),null!==e;){const s=e[0];t.includes(s)||t.push(e[1])}}return t}};J=e([c],J);export{J as Feature};export function toFeature(e,t){const s=new J(t);if(e.attributes){const t=e.attributes;for(const[e,i]of Object.entries(t))s.attributes.set(e,i)}return s.geometry=e.geometry,e.popupTemplate&&(s.settings.popupTemplate=e.popupTemplate),s}export function toGraphic(e){const s=new t;s.attributes={};for(const t of e.attributes.keys())s.attributes[t]=e.attributes.get(t);return n(e.source)&&e.source.layer?s.layer=e.source.layer:l(e.source)&&e.source.sublayer&&(s.layer=e.source.sublayer),h(e.source)&&e.source.table&&(s.layer=e.source.table),s.geometry=e.geometry,e.settings.popupTemplate&&(s.popupTemplate=e.settings.popupTemplate),s}const Q="Presentable attributes are read-only.",B="Feature hyperlinks are read-only. Modify the feature's hyperlink templates instead.";class W extends F{_feature;_pending=new Set;constructor(e,t){super(e),this._feature=t}get(e){return super.has(e)||this._calcExpressionValue(e),super.get(e)}async _calcExpressionValue(e){if(!this._pending.has(e)){this._pending.add(e);try{const{spatialReference:t}=this._feature.schema,s=this._feature.settings.popupTemplate?.expressionInfos?.find((t=>t.name===e));if(!s)return;const{isArcadeScriptAsync:i,runAsyncArcadeExpression:r,arcadeScriptUsesGeometry:a,runArcadeExpression:o}=await import("../utilities/arcade.js");try{if(i(s.expression,t)){const i=this._feature.source?.layer??this._feature.source?.sublayer;let a=this._feature.source?.mapExtension;if(!a){const e=this._feature.source?.layerExtension;a=e?.mapExtension}this._originalMap.set(e,await r(s.expression,{feature:this._feature,layer:i,map:a?.map,spatialReference:t}))}else{if(a(s.expression,t)){const{enableGeometrySupport:e}=await import("@arcgis/core/arcade/arcade");await e()}this._originalMap.set(e,o(s.expression,{feature:this._feature,spatialReference:t}))}}catch(t){t instanceof Error&&K.error({message:"Error evaluating expression '{0}': {1}.",error:t},e,t.message),this._originalMap.set(e,ie)}}finally{this._pending.delete(e)}}}}class q extends F{get size(){return this._feature.attributes.size+this._feature.schema.fields._expressionFieldsLength}_feature;_numObservers;_onAllObserversRemoved;constructor(e){super(new _),this._feature=e,this._handles.add([d(this,"size",(()=>g(this._feature.attributes,"size",(()=>f(this,"size")),{sync:!0}))),d(this,"size",(()=>g(this._feature.schema.fields,"_expressionFieldsLength",(()=>f(this,"size")),{sync:!0})))])}destroy(){this._onAllObserversRemoved?.(),this._numObservers=0,super.destroy()}clear(){throw new o(Q)}delete(e){throw new o(Q)}forEach(e,t){S("callback",e).isNotMissing();for(const s of this.keys())e.call(t,this.get(s),s,this)}get(e){const t=this._getFieldExtensionFormat(e);return this._formatAttribute(e,t)}has(e){for(const t of this.keys())if(L(t,e))return!0;return!1}set(...e){throw new o(Q)}*entries(){yield*C(this.keys(),(e=>[e,this.get(e)]))}*keys(){yield*this._feature.attributes.keys();for(const e of this._feature.schema.fields.expressionFields)yield e.name;if(null!=this._feature.source?.relationships)for(const e of this._feature.source.relationships)if("one-to-one"===e.cardinality||"many-to-one"===e.cardinality)for(const t of e.relatedSource.schema.fields)yield`relationships/${e.id}/${t.name}`}*values(){yield*C(this.keys(),(e=>this.get(e)))}[Symbol.iterator](){return this.entries()}toJSON(){return Array.from(this.entries())}on(e,t){if(S("callback",t).isNotMissing(),!this._numObservers){const e=new Map,t=new Set,s=()=>{for(const e of t)e.remove();t.clear()};let i;const r=()=>{const t=()=>{i&&(window.clearTimeout(i),i=void 0)};t(),i=window.setTimeout((()=>{const s=[],i=[];for(const[t,i]of this.entries())i!==e.get(t)&&s.push([t,i]);for(const[t,s]of e.entries())this.has(t)&&s===this.get(t)||i.push([t,s]);if(s.length||i.length){const e={added:s,removed:i,target:this};if(this.hasEventListener("after-add"))for(const e of s)this.emit("after-add",{target:this,item:e});if(this.hasEventListener("after-remove"))for(const e of i)this.emit("after-remove",{target:this,item:e});this.emit("change",e),a()}t()}))},a=()=>{e.clear(),s();for(const s of this.keys()){const i=this._getFieldExtension(s);let a="{0}";if(i){const e=g(i,"format",r);t.add(e),i.format&&(a=i.format)}e.set(s,this._formatAttribute(s,a))}};a();const o=this._feature.attributes.on("change",r),n=this._feature.schema.fieldExtensions.on("change",r),l=[g(this._feature.settings.formatSettings,"numberFormat",r),g(this._feature.settings.formatSettings,"dateFormat",r),g(this._feature.settings.formatSettings,"timeFormat",r),g(this._feature.settings.formatSettings,"locale",r)],h=this._feature.expressionFieldValues.on("change",r),u=this._feature.schema.fields.on("change",(e=>{(e.added?.some((e=>k(e.name)))||e.removed?.some((e=>k(e.name))))&&r()})),p=g(this._feature.settings,"popupTemplate",r);this._onAllObserversRemoved=()=>{h.remove(),o.remove(),n.remove(),u.remove();for(const e of l)e.remove();p.remove(),e.clear(),s()}}const s=super.on(e,t);return this._numObservers++,{remove:()=>{s.remove(),this._numObservers--,this._numObservers||this._onAllObserversRemoved()}}}_getFieldExtension(e){const t=this._feature.schema.findFieldByName(e);if(t)return this._feature.schema.fieldExtensions.forField(t)}_getFieldExtensionFormat(e){const t=this._getFieldExtension(e);return t?t.format:"{0}"}_formatAttribute(e,t){const s=j(e);if(null!=s)return oe(this._feature,"expression",s,{format:t});const[i,r]=T(e);return null!=i?oe(this._feature,i,r,{format:t}):oe(this._feature,void 0,e,{format:t})}}const X=/\{(?:relationships[\\/]([\w-]*)[\\/])?(?:(expression)[\\/])?([_a-zA-ZÀ-ÖØ-öø-ÿ][._a-zA-ZÀ-ÖØ-öø-ÿ0-9()]*)(?::([^}]*))?\}/gi,Y=/\{relationships\/([\w-]*)[\\/]([^}]*)\}/gi,ee=/{{/g,te="\0MAGIC\0",se=new RegExp(te,"g"),ie="#INVALID";class re extends b{_feature;_hyperlinks;constructor(e){super(e.settings.hyperlinkTemplates,(e=>this._getHyperlink(e))),this._feature=e}destroy(){for(const e of this)e.destroy();super.destroy()}_getHyperlink(e){return null==this._hyperlinks&&(this._hyperlinks=new WeakMap),this._hyperlinks.has(e)||this._hyperlinks.set(e,new ae(this._feature,e)),this._hyperlinks.get(e)}}let ae=class extends(p(a)){get url(){return this._template.url?this._feature.format(this._template.url):this._template.url}set url(e){throw new o(B)}get text(){return this._template.text?this._feature.format(this._template.text):this._template.text}set text(e){throw new o(B)}get iconUrl(){return this._template.iconUrl?this._feature.format(this._template.iconUrl):this._template.iconUrl}set iconUrl(e){throw new o(B)}get target(){return this._template.target?this._feature.format(this._template.target):this._template.target}set target(e){throw new o(B)}get tooltip(){return this._template.tooltip?this._feature.format(this._template.tooltip):this._template.tooltip}set tooltip(e){throw new o(B)}_feature;_template;constructor(e,t){super(t.toJSON()),this._feature=e,this._template=t,this._handles.add(d(this,(e=>{const t=g(this._template,e,(()=>f(this,e)),{sync:!0}),s=this._feature.presentableAttributes.on("change",(()=>{f(this,e)})),i=this._feature.relatedFeatures.on("change",(()=>{f(this,e)}));return m([t,s,i])})))}_getSerializableProperties(){return{}}};function oe(e,t,s,i={format:"{0}"}){if(!L(t,"expression")){if(t){const r=P(e.relatedFeatures.keys(),(e=>L(e.id,t)));if(!r)return K.debug("Could not resolve related field '{0}/{1}",t,s),ie;const a=Array.from(e.relatedFeatures.get(r));return"many-to-one"===r.cardinality||"one-to-one"===r.cardinality?a.length<1?(K.debug("Could not resolve related field '{0}/{1}",t,s),ie):ne(a[0],s,i):a.map((e=>ne(e,s,i))).filter((e=>""!==e)).join(",")}return ne(e,s,i)}if(!e.settings.popupTemplate?.expressionInfos?.find((e=>L(e.name,s))))return K.debug("Could not find expression '{0}'.",s),ie;try{const t=e.expressionFieldValues.get(s)??i.defaultExpressionValue??"",r=e.schema.findFieldByName(`expression/${s}`),a=null==r?void 0:e.schema.fieldExtensions.forField(r);return le(e,t,s,a?.formatSettings,i)}catch(e){if(e instanceof Error)return K.error({message:"Error evaluating expression '{0}': {1}.",error:e},s,e.message),ie;throw e}}function ne(e,t,s){let i;if(i=e.attributes.get(t),null==i)return"";const r=e.schema.findFieldByName(t),a=e.type?.domains?.[r?.name??t],o=e=>e.codedValues?.find((e=>e.code.toString()===i.toString()))?.name??i;let n;if(L(t,e.schema.typeIdField)){const t=a&&"inherited"!==a.type?a:r?.domain;i="coded-value"===t?.type?o(t):e.type?.name??i}else if(a&&A(a))i=o(a);else if(r?.domain&&A(r.domain))i=o(r.domain);else if(r){switch(r.type){case"integer":case"small-integer":case"big-integer":case"single":case"double":i=N(i);break;case"date":i=O({timeZone:e.schema.timeZone},i);break;case"timestamp-offset":case"date-only":i=O({},i),"date-only"===r.type&&(s.isDateOnly=!0);break;case"time-only":i=U(i);break;default:i=`${i.toString()}`}const t=e.schema.fieldExtensions.forField(r);t&&(n=t.formatSettings)}return le(e,i,t,n,s)}function le(e,t,s,i,r){if("string"==typeof t&&(null==r.format||"{0}"===r.format))return t;const a={...r};if("number"==typeof t||t instanceof Date||t instanceof w){null==a.locale&&(a.locale=i?.locale??e.settings.formatSettings.locale);const r=e.settings.popupTemplate?.fieldInfos?.find((e=>L(e.fieldName,s)))?.format;"number"==typeof t?function(e,t,s,i){null==e.currency&&(e.currency=t?.currency??i.settings.formatSettings.currency);null==e.numberFormat&&(e.numberFormat=t?.numberFormat,null==e.numberFormat&&(e.numberFormat=null==s?i.settings.formatSettings.numberFormat:s.digitSeparator?M.NUMBER:M.FIXED_POINT));null==e.fractionalDigits&&(e.fractionalDigits=t?.fractionalDigits,null==e.fractionalDigits&&(e.fractionalDigits=null==s?i.settings.formatSettings.fractionalDigits:s.places))}(a,i,r,e):t instanceof Date?function(e,t,s,i){null==e.dateFormat&&(e.dateFormat=t?.dateFormat,null==e.dateFormat&&(e.dateFormat=null==s?i.settings.formatSettings.dateFormat:R(s.dateFormat)));null==e.timeZone&&(e.timeZone=t?.timeZone??i.settings.formatSettings.timeZone)}(a,i,r,e):function(e,t,s,i){null==e.timeFormat&&(e.timeFormat=t?.timeFormat,null==e.timeFormat&&(e.timeFormat=null==s?i.settings.formatSettings.timeFormat:V(s.dateFormat)))}(a,i,r,e)}return D(a,t)}ae=e([c],ae);export async function resolveRelatedFeatures(e){const t=I(e,(e=>e.source));await Promise.all(v([...t.keys()].map((e=>e.relationships.toArray()))).map((e=>(async e=>{[...(await e.getAllRelatedFeatures(t.get(e.source))).entries()].forEach((([t,s])=>{t.relatedFeatures.set(e,s)}))})(e))))}
|
package/data/convert.d.ts
CHANGED
|
@@ -378,6 +378,12 @@ export declare function csvToUploadData(csvData: Blob | string, options?: FromCs
|
|
|
378
378
|
* @param options Options for the conversion.
|
|
379
379
|
*/
|
|
380
380
|
export declare function csvToFeatureSet(csvData: Blob | string, options?: FromCsvOptions): Promise<FeatureSet>;
|
|
381
|
+
/**
|
|
382
|
+
* Converts a {@link data/FeatureSet!FeatureSet } to a GPX blob.
|
|
383
|
+
*
|
|
384
|
+
* @param featureSet The feature set to convert.
|
|
385
|
+
*/
|
|
386
|
+
export declare function toGpx(featureSet: FeatureSet): Promise<Blob>;
|
|
381
387
|
/**
|
|
382
388
|
* Converts a {@link data/FeatureSet!FeatureSet } to an XLSX blob.
|
|
383
389
|
*
|
package/data/convert.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"@arcgis/core/Color.js";import t from"@arcgis/core/Graphic.js";import r from"@arcgis/core/geometry/Point";import o from"@arcgis/core/geometry/Polygon.js";import n from"@arcgis/core/geometry/Polyline.js";import a from"@arcgis/core/geometry/SpatialReference";import i from"@arcgis/core/layers/FeatureLayer.js";import s from"@arcgis/core/layers/GroupLayer.js";import c from"@arcgis/core/layers/support/Field.js";import l from"@arcgis/core/renderers/SimpleRenderer.js";import m from"@arcgis/core/renderers/UniqueValueRenderer.js";import u from"@arcgis/core/renderers/support/UniqueValueInfo.js";import f from"@arcgis/core/symbols/MeshSymbol3D.js";import y from"@arcgis/core/symbols/PictureMarkerSymbol.js";import p from"@arcgis/core/symbols/SimpleFillSymbol.js";import d from"@arcgis/core/symbols/SimpleLineSymbol.js";import g from"@arcgis/core/symbols/SimpleMarkerSymbol.js";import w from"dxf-parser";import{geometryTypeToJson as h}from"../json/GeometryJson.js";import{translate as F}from"../locale/language.js";import{INVARIANT as S}from"../locale.js";import{FeatureCollectionLayerExtension as T}from"../mapping/FeatureCollectionLayerExtension.js";import{GroupLayerExtension as N}from"../mapping/GroupLayerExtension.js";import{MapImageLayerExtension as O}from"../mapping/MapImageLayerExtension.js";import{CaseInsensitiveObservableMap as b}from"../utilities/CaseInsensitiveObservableMap.js";import{Time as x}from"../utilities/Time.js";import{checkArg as D,assertNever as M}from"../utilities/checkArg.js";import{isPoint as E,isMultipoint as R,isPolyline as A,isPolygon as I,isExtent as _}from"../utilities/esri.js";import{parse as G,format as L,DEFAULT_PARSING_FORMATS as C,INVALID_DATE as v}from"../utilities/format/date.js";import{DateFormat as P,NumberFormat as j,TimeFormat as U}from"../utilities/format/formats.js";import{parse as $,format as B}from"../utilities/format/number.js";import{parse as H,format as k,DEFAULT_PARSING_FORMATS as J}from"../utilities/format/time.js";import{project as z,esriToWKT as W,wktToEsri as X,esriWkidToWkt as q,esriWktToWkid as Y,esriToGeoJSON as Z,geoJSONToEsri as K}from"../utilities/geometry.js";import{getLogger as V}from"../utilities/log.js";import{isNumeric as Q}from"../utilities/number.js";import{delay as ee}from"../utilities/promise.js";import{caseInsensitiveEquals as te}from"../utilities/string.js";import{Feature as re}from"./Feature.js";import{FeatureSet as oe}from"./FeatureSet.js";import{DxfEntityProcessor as ne}from"./support/_dxfConverters.js";import{createLpkxLayer as ae}from"./support/_lpkxConverter.js";import{createFgdbLayer as ie}from"./support/fgdbConverter.js";const se=["=","-","+","@"],ce='"',le="\r\n",me="\n",ue=[...C.map(Je),"M/d/yy"],fe=[...J.map(We).map((e=>e.replace("AM/PM","tt")))],ye=/(\w+)_(point|multipoint|polyline|polygon)z?/;var pe;function de(){return V("geocortex.api.data.convert")}!function(e){e.DATE="D",e.NUMBER="N",e.STRING="C",e.BOOLEAN="L"}(pe||(pe={}));export const FIELD_NAME_REGEX=/[^a-zA-Z\d_]/g;export var GeometryFormat;!function(e){e.NONE="NONE",e.WKT="WKT",e.XY="XY",e.XYZ="XYZ",e.LAT_LON="LAT_LONG",e.GEO_JSON="GEO_JSON",e.ARCGIS_JSON="ARCGIS_JSON"}(GeometryFormat||(GeometryFormat={}));export const geometryTypeHeaders={[GeometryFormat.XYZ]:[["x","y","z"]],[GeometryFormat.XY]:[["x","y"]],[GeometryFormat.LAT_LON]:[["latitude","longitude"],["lat","lon"],["lat","long"]],[GeometryFormat.ARCGIS_JSON]:[["geometry"]],[GeometryFormat.GEO_JSON]:[["geometry"]],[GeometryFormat.WKT]:[["geometry"]]};const ge=[[GeometryFormat.ARCGIS_JSON,Le],[GeometryFormat.GEO_JSON,Ce],[GeometryFormat.WKT,ve]],we=new Map(ge);export async function uploadDataToFeatureSet(e){const t=await async function(e){const{data:t,includeHeaderRow:o,geometryFormat:n,geometryFields:a,locale:i,numberFormat:s,inSpatialReference:c}=e,l=o?t.slice(1):t;if(n===GeometryFormat.NONE)return{columnIndices:[]};const m=e=>Ue(e,i,s),u=(e,t)=>{const o=t===GeometryFormat.XYZ,n=t===GeometryFormat.LAT_LON;return{columnIndices:e,geometries:l.map((t=>{if(t.length>=Math.max(...e)&&Q(t[e[0]]?.raw,i)&&Q(t[e[1]]?.raw,i)&&(!o||Q(t[e[2]]?.raw,i)))return new r({x:m(n?t[e[1]].raw:t[e[0]].raw),y:m(n?t[e[0]].raw:t[e[1]].raw),z:o?m(t[e[2]].raw):0,spatialReference:c})}))}},f=async(e,t)=>({columnIndices:[e],geometries:await Promise.all(l.map((t=>t[e])).map((e=>{if(e?.raw)return t(e.raw.toString(),c)})))}),y=async(e,t)=>{switch(t){case GeometryFormat.NONE:return{columnIndices:[0]};case GeometryFormat.LAT_LON:case GeometryFormat.XYZ:case GeometryFormat.XY:return u(e,t);case GeometryFormat.ARCGIS_JSON:return f(e[0],Le);case GeometryFormat.GEO_JSON:return f(e[0],Ce);case GeometryFormat.WKT:return f(e[0],ve);default:return M(t,new Error(`Unknown geometry format "${t}".`))}};if(n){const e=Pe(o?t[0]:t[0].map(((e,t)=>({raw:t.toString()}))),n,o?a:a.map((e=>""+(parseInt(e.match(/\d+/g)[0])-1))));if(o&&void 0===e)throw new Error(`Error parsing file data: Expected geometry columns ${geometryTypeHeaders[n][0].join(",")} are missing for GeometryType.${n}`);return y(e??[0],n)}const[p,d]=await $e(t,c,o);if(p===GeometryFormat.NONE)return{columnIndices:[]};return d.length>1?u(d,p):f(d[0],we.get(p))}(e),o=function(e,t){const{data:r,displayField:o,includeHeaderRow:n,inSpatialReference:a,outSpatialReference:i,generatePrimaryKey:s}=e,c={fields:[]},l=e=>!(!t.columnIndices||0===t.columnIndices.length)&&t.columnIndices.includes(e);let{primaryKeyField:m}=e,u=0;for(let t=0;t<r[0].length;t++){if(l(t))continue;const o=He(e,t,!s&&!m&&!c.fields.find((e=>"esriFieldTypeOID"===e.type)));let a=r[0][t]?.raw?.toString(),i=a?.replace(FIELD_NAME_REGEX,"_");n&&i||(i="field"+ ++u,a=F("gcx.api.data.convert.import-field-alias",u)),c.fields.push({alias:a,name:i,type:o}),"esriFieldTypeOID"===o&&(m=i)}if(c.spatialReference=i??t.geometries?.[0]?.spatialReference??a,t.geometries?.length){const e=t.geometries.filter((e=>void 0!==e)).map((e=>e.type)),r=e[0];c.geometryType=e.every((e=>e===r))?h(r):void 0}if(!c.fields.find((e=>"esriFieldTypeOID"===e.type))){const e=c.fields.length+1,t=!!c.fields.find((e=>"objectid"===e.name.toLowerCase()));m=t?`OBJECTID_${e}`:"OBJECTID",c.fields.push({name:m,alias:m,type:"esriFieldTypeOID"})}return c.displayField=o??c.fields.find((e=>!te(e.name,m)&&"esriFieldTypeString"===e.type))?.name??c.fields.find((e=>!te(e.name,m)))?.name??m,c.primaryKeyField=m,c}(e,t),n=await async function(e,t,r){const{data:o,includeHeaderRow:n,outFields:a,escapeFormulaChars:i,locale:s,numberFormat:c,dateFormat:l,timeFormat:m}=e,{spatialReference:u}=r,f=[],y=n?o.slice(1):o,p=(e,r)=>!t.columnIndices||0===t.columnIndices.length||!t.columnIndices.includes(r);return await Promise.all(y.map((async(e,o)=>{const n=new re;for(let t=0;t<r.fields.length;t++){const u=r.fields[t],f=e.filter(p);if(a.includes("*")||a.filter((e=>te(e,u.name))).length>0){let e=await ke(f[t]?.raw,u,{escapeFormulaChars:i,dateFormat:l,numberFormat:c,timeFormat:m,locale:s});"esriFieldTypeOID"===u.type&&null===e&&(e=o),n.attributes.set(u.name,e)}}t.geometries&&(n.geometry=await De(t.geometries[o],u)),f.push(n)}))),f}(e,t,o);return new oe({features:n,schema:o})}export async function toCsv(e,t){D("featureSet",e).isNotMissing();const r=Array.from(e),o={...{useFormattedValues:!1,alwaysQuote:!1,escapeFormulaChars:!0,delimiter:",",dateFormat:P.ROUND_TRIP,timeFormat:U.ROUND_TRIP,geometryFormat:r.some((e=>void 0!==e.geometry&&null!==e.geometry))?GeometryFormat.WKT:GeometryFormat.NONE,includeByteOrderMark:!0,outSpatialReference:a.WGS84,includeHeaderRow:!0,outFields:be(e.source),rowDelimiter:navigator.platform?.startsWith("Win")?le:"\n"},...t},{includeByteOrderMark:n,includeHeaderRow:i,delimiter:s,outFields:c,rowDelimiter:l}=o,m=[];n&&m.push("\ufeff");const u=Ne(r,o),f=Oe(r,c,e.schema,!0),y=Oe(r,c,e.schema,!1);if(i){const e=[];for(const t of u)e.push(Me(t,o));for(const t of f)e.push(Me(t,o));for(const t of y)e.push(Me(t,o));const t=e.join(s)+l;m.push(t)}await Promise.all(r.map((async e=>{const t=[],r=(t,r)=>{const o=Re(e,t,r),n=e.schema.findFieldByName(t)?.type;return Me(Ee(o,{...r,isDateOnly:"date-only"===n}),r)};t.push(...await async function(e,t){let r=await xe(e,t);t.geometryFormat!==GeometryFormat.XYZ&&t.geometryFormat!==GeometryFormat.XY&&t.geometryFormat!==GeometryFormat.LAT_LON||(r=r.map((e=>void 0===e?"":Ee(e,t))));return r.map((e=>""===e?"":Me(e,t)))}(e.geometry,o)),t.push(...f.map((e=>r(e,o)))),t.push(...y.map((e=>r(e,o))));const n=`${t.join(s)}${l}`;m.push(n)})));return new Blob(m,{type:"text/plain",endings:"\n"===l||l===le?"transparent":"native"})}export async function csvToUploadData(e,t){let r;if(D("csvData",e).isNotMissing(),e instanceof Blob){const t=new Promise(((t,r)=>{const o=new FileReader;o.onload=()=>{t(o.result)},o.onerror=()=>{r(o.error)},o.readAsText(e)}));r=await t}else r=e;const o=Fe(t),n=o.rowDelimiter||function(e){let t=me;return Ge(e,le,((r,o)=>(0===r&&o===e.length||(t=le),!1))),t}(r),a=o.delimiter??function(e,t,r){const o=",";if(0===e.length)return o;const n=[];if(Ge(e,t,((t,r)=>(r!==e.length||t!==r)&&(n.push(e.substring(t,r)),n.length<3))),0===n.length)return o;let a=[{delimiter:",",rowsDelimiterOccurrences:[],rowsNumberAdjacentOccurrences:[]},{delimiter:";",rowsDelimiterOccurrences:[]},{delimiter:"|",rowsDelimiterOccurrences:[]},{delimiter:"\t",rowsDelimiterOccurrences:[]},{delimiter:" ",rowsDelimiterOccurrences:[]}].filter((e=>n[0].includes(e.delimiter)));if(0===a.length)return o;for(const e of n)for(const t of a){let o=0,n=0;Ge(e,t.delimiter,((a,i)=>{if(i!==e.length&&o++,","===t.delimiter){const t=e.charAt(i-1),o=e.charAt(i+1);Q(t,r)&&Q(o,r)&&n++}return!0})),t.rowsDelimiterOccurrences.push(o),","===t.delimiter&&t.rowsNumberAdjacentOccurrences.push(n)}if(a=a.filter((e=>e.rowsDelimiterOccurrences.every((t=>e.rowsDelimiterOccurrences[0]===t)))).sort(((e,t)=>t.rowsDelimiterOccurrences[0]-e.rowsDelimiterOccurrences[0])),a.length>1&&","===a[0].delimiter&&null!=r&&r!==S){const e=a[0];if(null!=e&&","===e.delimiter&&","===Intl.NumberFormat(r).formatToParts(1.1).find((e=>"decimal"===e.type))?.value)for(let t=0;t<e.rowsDelimiterOccurrences.length;t++)if(e.rowsDelimiterOccurrences[t]<=e.rowsNumberAdjacentOccurrences[t]){a=a.filter((e=>","!==e.delimiter));break}}if(0===a.length)return o;return a[0].delimiter}(r,n,t.locale),i=function(e,t,r){const o=[],n=(e,t)=>{const o=[];return Ge(e,r,((r,n)=>{const a=e.substring(r,n);return o.push({raw:_e(a,t,o.length)}),!0})),o};if(Ge(e,t,((t,r)=>{const a=e.substring(t,r);return a.length>0&&o.push(n(a,o.length)),!0})),o.length){const e=o[0].length;o.forEach(((t,r)=>{if(t.length!==e)throw new Error(`Detected invalid CSV: Row ${r} does not have expected number of columns: ${e}`)}))}return o}(r,n,a);let{geometryFormat:s,geometryFields:c}=t;if(!s){const[e,t]=await $e(i,o.inSpatialReference,o.includeHeaderRow);s=e,c=t.map((e=>o.includeHeaderRow?i[0][e]?.raw??F("gcx.api.data.convert.import-field-alias",(e+1).toString()):F("gcx.api.data.convert.import-field-alias",(e+1).toString())))}return{data:i,...o,geometryFormat:s,geometryFields:c}}export async function csvToFeatureSet(e,t){const r=Fe(t);return uploadDataToFeatureSet(await csvToUploadData(e,r))}export async function toXLSX(e,t){D("featureSet",e).isNotMissing();const r=Array.from(e),o={...{useFormattedValues:!1,includeHeaderRow:!0,escapeFormulaChars:!0,geometryFormat:r.some((e=>void 0!==e.geometry&&null!==e.geometry))?GeometryFormat.WKT:GeometryFormat.NONE,outFields:be(e.source),outSpatialReference:a.WGS84,dateFormat:P.DEFAULT,timeFormat:U.DEFAULT,numberFormat:j.DEFAULT,sheetName:"sheet1"},...t},{outFields:n,includeHeaderRow:i,dateFormat:s,timeFormat:c,numberFormat:l}=o,m=Ne(r,o),u=Oe(r,n,e.schema,!0),f=Oe(r,n,e.schema,!1),y=await import("xlsx"),p=y.utils.sheet_new();let d=!1;if(i){const t=m.concat(u).concat(function(e,t){const r=t?.schema?.fieldExtensions.initializedItems.map((e=>e.field));return e.map((e=>r?.find((t=>te(t.name,e)))?.alias??e))}(f,e.source));d=!0,y.utils.sheet_add_aoa(p,[t],{cellDates:!0})}await Promise.all(r.map((async e=>{const t=[],r=new Set,n=new Set;t.push(...await xe(e.geometry,o));for(const r of u){const n=qe(e.attributes.get(r),o);t.push(n)}for(const a of f){const i=Re(e,a,o);if(i instanceof x){const o=e.schema.findFieldByName(a);"time-only"===o?.type&&r.add(t.length)}else if(i instanceof Date){const r=e.schema.findFieldByName(a);"date-only"===r?.type&&n.add(t.length)}const s=qe(i,o);t.push(s)}if(!t.every((e=>"string"!=typeof e||e.length<=32767)))return void de().warn(`toXLSX cell limit exceeded, feature (${e.primaryKey??e.id}) omitted.`);y.utils.sheet_add_aoa(p,[t],{cellDates:!0,origin:d?-1:void 0}),d=!0;const a=y.utils.decode_range(p["!ref"]);for(let e=a.s.c;e<=a.e.c;e++){const t=p[y.utils.encode_cell({r:a.e.r,c:e})];"d"===t.t?r.has(e)?t.z=We(c??U.ROUND_TRIP):n.has(e)?t.z=ze(s??P.ROUND_TRIP):t.z=Je(s??P.ROUND_TRIP):"n"===t.t&&(t.z=Xe(l))}})));const g={SheetNames:[],Sheets:{}};g.SheetNames.push(o.sheetName),g.Sheets[o.sheetName]=p;const w=y.write(g,{type:"binary",bookType:"xlsx",compression:!0,bookSST:!0,cellDates:!0}),h=new Uint8Array(w.length);for(let e=0;e<w.length;e++)h[e]=w.charCodeAt(e);return new Blob([h.buffer],{type:"text/plain"})}export async function xlsxToUploadData(e,t){D("xlsxData",e).isNotMissing();const r=Se(t),o=await async function(e,t){const r=await import("xlsx"),o=new Promise(((o,n)=>{const a=new FileReader;a.onload=()=>{const e=new Uint8Array(a.result);let n="";for(const t of e)n+=String.fromCharCode(t);const i=r.read(n,{type:"binary",cellDates:!0}),s=t.sheetName||i.SheetNames[0],c=i.Sheets[s];o(c)},a.onerror=()=>{n(a.error)},a.readAsArrayBuffer(e)})),n=await o,a=r.utils.decode_range(n["!ref"]),i=[];for(let e=a.s.r;e<=a.e.r;e++){const t=[];for(let o=a.s.c;o<=a.e.c;o++){const a=n[`${r.utils.encode_cell({r:e,c:o})}`];a&&"d"===a.t&&a.v instanceof Date&&(a.v=new Date(a.v.getTime()+6e4*a.v.getTimezoneOffset())),t.push(a?{raw:a.v,formatted:"s"===a.t?void 0:a.w}:{raw:""})}i.push(t)}return i}(e,r);let{geometryFormat:n,geometryFields:a}=t;if(!n){const[e,t]=await $e(o,r.inSpatialReference,r.includeHeaderRow);n=e,a=t.map((e=>r.includeHeaderRow?o[0][e]?.raw.toString()??F("gcx.api.data.convert.import-field-alias",(e+1).toString()):F("gcx.api.data.convert.import-field-alias",(e+1).toString())))}return{data:o,...r,geometryFormat:n,geometryFields:a}}export async function xlsxToFeatureSet(e,t){D("xlsxData",e).isNotMissing();const r=Se(t);return uploadDataToFeatureSet(await xlsxToUploadData(e,r))}export function kmlHexToEsriColor(t){return e.fromHex(`#${t.match(/.{2}/g).reverse().join("")}`)}export function parseKMLCoordinates(e){return e.trim().split(/\s+/).map((e=>{const[t,r,o]=e.split(",").map(Number);return{x:t,y:r,z:o}}))}export function parseKMLSymbol(t,r,o){if(t){const r=t.querySelector("IconStyle > Icon > href")?.textContent;if(r)return new y({url:r,width:32,height:32});const o=t.querySelector("PolyStyle");if(o){const t=o.querySelector("color")?.textContent,r=t?kmlHexToEsriColor(t):new e([0,0,0,1]);return new p({color:r,outline:{color:[0,0,0,.5],width:1}})}const n=t.querySelector("LineStyle");if(n){const t=n.querySelector("color")?.textContent,r=t?kmlHexToEsriColor(t):new e([0,0,0,1]),o=parseFloat(n.querySelector("width")?.textContent||"1");return new d({color:r,width:o})}}return getDefaultSymbol(o,"polygon"===r?"polygon":"point"===r?"point":"polyline")}export async function toShapefile(e,t){D("featureSet",e).isNotMissing();const[{default:r},o]=await Promise.all([import("jszip"),import("../forked-libs/shp-write/index.js")]),n=Array.from(e),i={...{useFormattedValues:!1,outFields:be(e.source),fileName:e.title||"export"},...t},{outFields:s,outSpatialReference:c,fileName:l}=i,m=e=>e.geometry.hasZ||e.geometry.hasM,u=new Map,f=n.filter((e=>E(e.geometry)));u.set("POINTZ",f.filter(m)),u.set("POINT",f.filter((e=>!m(e))));const y=n.filter((e=>R(e.geometry)));u.set("MULTIPOINTZ",y.filter(m)),u.set("MULTIPOINT",y.filter((e=>!m(e))));const p=n.filter((e=>A(e.geometry)));u.set("POLYLINEZ",p.filter(m)),u.set("POLYLINE",p.filter((e=>!m(e))));const d=n.filter((e=>I(e.geometry)||_(e.geometry)));u.set("POLYGONZ",d.filter(m)),u.set("POLYGON",d.filter((e=>!m(e))));const g=Oe(n,s,e.schema,!0);let w=Oe(n,s,e.schema,!1);w=g.concat(w);const h=new r,F=Array.from(u.keys()).filter((e=>u.get(e).length>0));await Promise.all(F.map((async t=>{const r=u.get(t),n=await Promise.all(r.map((e=>De(e.geometry,c)))),s=await async function(e){const{wkid:t,wkt:r}=e[0].spatialReference;if(!e.every((e=>e.spatialReference.wkid===t&&e.spatialReference.wkt===r)))throw new Error("Cannot create shapefile that contains geometries with different spatial references.");return r??await q(t??a.WGS84.wkid)}(n),m=i.useFormattedValues?Object.assign({},...w.map((e=>({[e]:pe.STRING})))):function(e,t,r,o){const n={};for(const a of t){if(e.some((e=>Ae(e,a)))){n[a]=pe.STRING;continue}const t=r?r.fields.find((e=>te(e.name,a))):void 0;if(t){switch(t.type){case"oid":case"double":case"integer":case"single":case"small-integer":case"big-integer":n[a]=pe.NUMBER;break;case"date":case"timestamp-offset":n[a]=o?pe.NUMBER:pe.DATE;break;default:n[a]=pe.STRING}continue}const i=(e,t)=>e.attributes.get(t)??e.presentableAttributes.get(t);e.every((e=>i(e,a)instanceof Date||void 0===i(e,a)))&&e.some((e=>i(e,a)instanceof Date))?n[a]=o?pe.NUMBER:pe.DATE:e.every((e=>"number"==typeof i(e,a)||void 0===i(e,a)))&&e.some((e=>"number"==typeof i(e,a)))?n[a]=pe.NUMBER:e.every((e=>"boolean"==typeof i(e,a)||void 0===i(e,a)))&&e.some((e=>"boolean"==typeof i(e,a)))?n[a]=pe.BOOLEAN:n[a]=pe.STRING}return n}(r,w,e.schema,"timestamp"===i.dateFormat),f=function(e){return e.map((e=>{if(E(e)){const{x:t,y:r,z:o,m:n}=e,a=[t,r];return e.hasZ&&a.push(o),e.hasM&&a.push(n),Ye(a,e)}if(R(e))return Ze(e.points,e);if(A(e))return Ke(e.paths,e);if(I(e))return Ke(e.rings,e);if(_(e)){const t=[e.xmin,e.ymax];return[[t,[e.xmax,e.ymax],[e.xmax,e.ymin],[e.xmin,e.ymin],t]]}throw new Error("Unsupported geometry type.")}))}(n),y=function(e,t,r,o){const n=[];for(const a of e){const e={};for(const n of t){let t=Re(a,n,o);if(null==t&&(t=""),o.useFormattedValues)t=t.toString();else{t=Ve(t,r[n],{...o,isDateOnly:"date-only"===a.schema.findFieldByName(n)?.type})}e[n.replaceAll(".","_")]=t}n.push(e)}return n}(r,w,m,i);o.write(y,t,f,((e,r)=>{const o=F.length>1?`${l}_${t.toLowerCase()}`:l;h.file(`${o}.shp`,r.shp.buffer,{binary:!0}),h.file(`${o}.shx`,r.shx.buffer,{binary:!0}),h.file(`${o}.dbf`,r.dbf.buffer,{binary:!0}),h.file(`${o}.prj`,s)}))})));const S=await h.generateAsync({type:"uint8array"});return new Blob([S.buffer],{type:"text/plain"})}export async function kmlToLayerExtensions(e){D("blob",e).isNotMissing();const a=await e.text(),l=(new DOMParser).parseFromString(a,"application/xml"),m=function(e,a,u=!1){const f={};l.querySelectorAll("Style").forEach((e=>{f[`#${e.id}`]=e}));const y=e.querySelector(":scope > name")?.textContent??"Unnamed Container",p=new Map;e.querySelectorAll(":scope > Placemark").forEach(((e,i)=>{const s=e.querySelector("name")?.textContent??"",c=e.querySelector("description")?.textContent??"",l=function(e){const t=e.querySelector("Point > coordinates"),a=e.querySelector("LineString > coordinates"),i=e.querySelector("Polygon");if(t?.textContent){const[e]=parseKMLCoordinates(t.textContent.replace(/ /g,""));return new r(e)}if(a?.textContent)return new n({paths:[parseKMLCoordinates(a.textContent).map((({x:e,y:t})=>[e,t]))]});if(i?.textContent){const e=i.querySelector("outerBoundaryIs > LinearRing > coordinates");if(e?.textContent){const t=[parseKMLCoordinates(e.textContent).map((({x:e,y:t})=>[e,t]))];return new o({rings:t})}}return}(e);if(l?.type){const r=e.querySelector("styleUrl")?.textContent,o=parseKMLSymbol(r?f[r]:e.querySelector("Style"),l.type,a);p.has(l.type)||p.set(l.type,{graphics:[],symbols:[]});let n=function(e,t){for(let r=0;r<e.length;r++)if(Qe(e[r],t))return r;return-1}(p.get(l.type).symbols,o);-1===n&&(p.get(l.type).symbols.push(o),n=p.get(l.type).symbols.length-1),p.get(l.type).graphics.push(new t({geometry:l,attributes:{name:s,description:c,SymbolID:n,OBJECTID:y+i}}))}}));const d=e.querySelectorAll(":scope > Folder, :scope > Document");if(u||1!==p.size||0!==d.length){const e=new N({layer:new s({title:y})});return p.forEach(((t,r)=>{const o=new i({displayField:"name",title:`${r.slice(0,1).toUpperCase()+r.slice(1)}s`,source:t.graphics,renderer:et(t.symbols),fields:[new c({name:"OBJECTID",type:"oid",alias:"OBJECTID"}),new c({name:"SymbolID",type:"integer",alias:"SymbolID",editable:!1}),new c({name:"name",type:"string",alias:"name"}),new c({name:"description",type:"string",alias:"description",defaultValue:""})]}),n=new T({layer:o});e.layerExtensions.add(n)})),d.forEach(((t,r)=>{const o=m(t,r);e.layerExtensions.add(o)})),e}{const e=[...p.values()][0],t=new i({displayField:"name",title:y,source:e.graphics,renderer:et(e.symbols),fields:[new c({name:"OBJECTID",type:"oid",alias:"OBJECTID"}),new c({name:"SymbolID",type:"integer",alias:"SymbolID",editable:!1}),new c({name:"name",type:"string",alias:"name"}),new c({name:"description",type:"string",alias:"description",defaultValue:""})]});return new T({layer:t})}},u=[];return l.querySelectorAll("kml > Document, kml > Folder").forEach(((e,t)=>{const r=m(e,t,!0);r.layerExtensions.length&&u.push(r)})),u}export async function lpkxToLayerExtensions(e,t){const{displayServiceUrl:r,geoProcessedLpkxData:o}=t;D("options.lpkxBlob",e).isNotMissing(),D("options.displayServiceUrl",r).isNotMissing();const n=ae(o,e,r);return[new O({layer:n})]}export async function dxfToLayerExtensions(e,t,r){const{inputSpatialReference:o,outputSpatialReference:n}=t;D("options.dxfBlob",e).isNotMissing(),D("options.inputSpatialReference",o).isNotMissing(),D("options.outputSpatialReference",n).isNotMissing();const a=new ne(o,n,r),i=a.getContext(),c=await e.text(),l=new w;await ee();try{const e=l.parseSync(c);if(!e)throw new Error("DXF parsing failed: parser returned null");i.dxf=e}catch(e){throw e instanceof Error?e:new Error(String(e))}const m=e instanceof File?e.name:"dxf-layer",u=m.replace(/[^a-zA-Z0-9_.-]/g,"_");if(i.fileName=m,i.sanitizedFileName=u,i.subLayers=await a.processAll(),!i.subLayers||0===i.subLayers.length)return[];const f=new s({id:`dxf-group-${u}-${(new Date).getTime()}`,title:m,visible:!0}),y={layer:f,visibilityMode:"independent"};return f.layers.addMany(i.subLayers),[new N(y)]}export async function fgdbToLayerExtensions(e,t){const{displayServiceUrl:r,geoProcessedFgdbData:o}=t;D("options.fgdbBlob",e).isNotMissing(),D("options.displayServiceUrl",r).isNotMissing(),D("options.geoProcessedFgdbData",o).isNotMissing();const n=await ie(o,e,r);return[new O({layer:n})]}export async function shapefileToUploadData(e,t){D("shapefileData",e).isNotMissing();const o=Te(t),n=new Promise(((t,r)=>{const o=new FileReader;o.onload=()=>{t(o.result)},o.onerror=()=>{r(o.error)},o.readAsArrayBuffer(e)})),[{default:i},{default:s}]=await Promise.all([import("jszip"),import("shpjs")]),c=await n,l=await i.loadAsync(new Uint8Array(c)),m=new b;l.forEach(((e,t)=>{t&&m.set(t.name,t)}));const u=l.filter((()=>!0)).map((e=>e.name));let f,y=u.filter((e=>e.endsWith(".shp"))).map((e=>e.substring(0,e.length-4)));if(y=function(e){if(!e.length)return[];let t=e[0];const r=t.match(ye);return r?(t=r[1],e.filter((e=>{const r=e.match(ye);return r&&r[1]===t}))):[t]}(y),u.some((e=>e.endsWith(".prj")))&&!y.every((e=>m.has(`${e}.prj`))))throw new Error("Shapefile zip must contain the same prj file for each separate shapefile");await Promise.all(u.filter((e=>e.endsWith(".prj"))).map((async e=>{const t=await l.file(e).async("string");if(f){if(t!==f)throw new Error("Shapefile zip must contain the same prj file for each separate shapefile")}else f=t})));let p=[],d=[];for(const e of y){if(!m.has(`${e}.shp`)||!m.has(`${e}.shx`)||!m.has(`${e}.dbf`))throw new Error("Shapefile must contain shp, shx, and dbf files.");const t=s.parseShp(await m.get(`${e}.shp`).async("uint8array")),r=s.parseDbf(await m.get(`${e}.dbf`).async("uint8array"));if(r.length!==t.length)throw new Error("Shapefile must contain shp, shx, and dbf files.");p=p.concat(r),d=d.concat(t)}const g=await Promise.all(d.map((e=>async function(e,t){const o=E(e)?function(e){D("geometry.coordinates",e.type).matches("Point"),D("geometry.coordinates",e.coordinates).satisfies((e=>"number"==typeof e||Array.isArray(e)));const[t,o,n]=e.coordinates,i=new r({x:t,y:o,spatialReference:a.WGS84});if(Array.isArray(n)){const[e,t]=n;!e&&!t||e?i.z=e:i.m=t}return i}(e):await K(e);if(t){let e;try{const r=await Y(t);e=new a({wkid:$(r)})}catch{}e||(e=new a({wkt:t})),o.spatialReference=e}return o}(e,f)))),w=geometryTypeHeaders[GeometryFormat.ARCGIS_JSON][0][0];p.forEach(((e,t)=>e[w]=JSON.stringify(g[t].toJSON())));return{data:function(e){const t=e.map((e=>Object.keys(e))).reduce(((e,t)=>e.concat(t.filter((t=>!e.includes(t))))),[]);return[t.map((e=>({raw:e}))),...e.map((e=>t.map((t=>({raw:e[t]})))))]}(p),...o,includeHeaderRow:!0,geometryFormat:GeometryFormat.ARCGIS_JSON,geometryFields:[w],inSpatialReference:g[0]?.spatialReference??a.fromJSON({wkid:4326})}}export async function shapefileToFeatureSet(e,t){D("shapefileData",e).isNotMissing();const r=Te(t);return uploadDataToFeatureSet(await shapefileToUploadData(e,r))}export function getDefaultSymbol(e,t){const r=e%8;let o=["#FFDBFF","#88D6FF","#7F9FC3","#FF8200","#F34A53","#76E3B9","#E7BFFF","#FFC467"][r],n=["#EF3786","#005A99","#2D5070","#790C00","#4C0000","#006543","#6244A9","#904200"][r];if(Math.floor(e/8)%2!=0){const e=o;o=n,n=e}switch(t){case"point":case"multipoint":return new g({color:o,outline:{color:n}});case"polyline":return new d({color:o,width:"2"});case"polygon":return new p({color:o,outline:{color:n}});case"mesh":return new f({symbolLayers:[{type:"fill",material:{color:o},outline:{color:n}}]})}}function he(e){return{escapeFormulaChars:!0,outFields:["*"],generatePrimaryKey:!1,locale:S,detectOid:!e?.primaryKeyField}}function Fe(e){return{...{includeHeaderRow:!0,inSpatialReference:a.WGS84,...he(e)},...e}}function Se(e){return{...{includeHeaderRow:!0,inSpatialReference:a.WGS84,...he(e)},...e}}function Te(e){return{...{...he(e)},...e}}function Ne(e,t){return t.geometryFormat===GeometryFormat.XYZ?["x","y","z"]:t.geometryFormat===GeometryFormat.XY?["x","y"]:t.geometryFormat===GeometryFormat.LAT_LON?["latitude","longitude"]:t.geometryFormat===GeometryFormat.NONE?[]:["geometry"]}function Oe(e,t,r,o){const n=r.fields.filter((e=>"oid"===e.type)).map((e=>e.name)).toArray();if(o)return n;if(t&&!t.includes("*"))return t.filter((e=>!n.includes(e)));{const t=r.fields.filter((e=>"oid"!==e.type)).map((e=>e.name)).toArray();let o=[];for(const r of e)for(const e of r.attributes.keys())t.includes(e)||n.includes(e)||o.includes(e)||o.push(e);return o=o.sort(),t.concat(o)}}function be(e){if(!e)return["*"];const t=e.featureSettings.popupTemplate?.content;if(Array.isArray(t)){const e=new Set;for(const r of t)if("fields"===r.type&&Array.isArray(r.fieldInfos))for(const t of r.fieldInfos)t.visible&&e.add(t.fieldName);if(e.size>0)return Array.from(e)}const r=e.featureSettings.popupTemplate?.fieldInfos;if(Array.isArray(r)){const e=[];for(const t of r)t.visible&&e.push(t.fieldName);if(e.length>0)return e}return["*"]}async function xe(e,t){const r=await De(e,t.outSpatialReference);if(t.geometryFormat===GeometryFormat.XYZ){if(!r)return["","",""];if(!E(r))throw new Error("Cannot use geometry format XYZ with non-point geometry");return[r.x,r.y,r.z]}if(t.geometryFormat===GeometryFormat.XY){if(!r)return["",""];if(!E(r))throw new Error("Cannot use geometry format XY with non-point geometry");return[r.x,r.y]}if(t.geometryFormat===GeometryFormat.LAT_LON){if(!r)return["",""];if(!E(r))throw new Error("Cannot use geometry format LAT_LONG with non-point geometry");return[r.y,r.x]}return t.geometryFormat===GeometryFormat.ARCGIS_JSON?r?[JSON.stringify(r.toJSON())]:[""]:t.geometryFormat===GeometryFormat.WKT?r?[await W(r)]:[""]:t.geometryFormat===GeometryFormat.GEO_JSON?r?[JSON.stringify(await Z(r))]:[""]:[]}async function De(e,t){return e?.spatialReference&&!e.spatialReference.equals(t)&&t?(await z([e],t))[0]:e}function Me(e,t){const r=[t.delimiter,ce,"\r","\n",t.rowDelimiter];if(t.alwaysQuote||r.some((t=>e.includes(t)))){const t=e.replace(new RegExp(ce,"g"),`${ce}${ce}`);return`${ce}${t}${ce}`}return e}function Ee(e,t){if(null==e)return"";if(!t.useFormattedValues){if("number"==typeof e){const r=t.numberFormat||j.ROUND_TRIP;return B(r,e)}if(e instanceof Date)return"timestamp"===t.dateFormat?e.getTime().toString():L({format:t.dateFormat,timeZone:"UTC",isDateOnly:t.isDateOnly},e);if(e instanceof x)return k({format:t.timeFormat},e)}let r=e.toString();return t.escapeFormulaChars&&(r=Ie(r)),r}function Re(e,t,r){if(r.useFormattedValues||Ae(e,t))return e.presentableAttributes.get(t)??e.attributes.get(t);const o=e.schema.findFieldByName(t)?.type;if(null!=o)switch(o){case"date":case"date-only":case"timestamp-offset":{const r=G(e.attributes.get(t));if(!isNaN(r.getTime()))return r;break}case"time-only":{const r=H(e.attributes.get(t));if(r.isValid)return r;break}}return e.attributes.get(t)??e.presentableAttributes.get(t)}function Ae(e,t){return!!te(t,e.schema.typeIdField)||("coded-value"===e.type?.domains?.[t]?.type||"coded-value"===e.schema.findFieldByName(t)?.domain?.type)}function Ie(e){for(const t of se)if(e.startsWith(t))return`\t${e}`;return e}function _e(e,t,r){const o=e.startsWith(ce),n=e.endsWith(ce);if(o&&!n||!o&&n)throw new Error(`Detected invalid CSV: Missing opening or closing quote for value at row:${t} column:${r}`);const a=o?e.substring(1,e.length-1):e;let i=-1;return Ge(a,ce,((e,o)=>{if(o===a.length)return!0;if(i<0){if(o!==a.length)return i=o,!0}else if(o===i+1)return i=-1,!0;throw new Error(`Detected invalid CSV: Non-escaped quote for value at row:${t} column:${r}`)})),a.replace(new RegExp(`${ce}${ce}`,"g"),ce)}function Ge(e,t,r){let o,n=!1,a=0,i=0;for(;o=e.indexOf(t,a),!(o<0);){for(let t=a;t<o;)e.substring(t).startsWith(ce)?(n=!n,t+=1):t++;const s=o+t.length;if(!n){const e=r(i,o);if(i=s,!e)return}a=s}r(i,e.length)}async function Le(e,t){const r=JSON.parse(e),o=(await import("@arcgis/core/geometry/support/jsonUtils")).fromJSON(r);return r.spatialReference||(o.spatialReference=t),o}async function Ce(e,t){const r=await K(JSON.parse(e));return r.spatialReference=t,r}async function ve(e,t){const r=await X(e);return r.spatialReference=t,r}function Pe(e,t,r){const o=r?[r]:geometryTypeHeaders[t];for(const t of o){const r=t.map((t=>e.map((e=>e?.raw?.toString().trim().toLowerCase())).indexOf(t.trim().toLowerCase())));if(r.every((e=>e>=0)))return r}}async function je(e,t){return(await Promise.all(e.map((async(e,r)=>{const o=e?.raw;if("string"==typeof o&&""!==o)try{return await t(o,void 0),r}catch{return}})))).find((e=>void 0!==e))}function Ue(e,t,r){return"inv"===t?"string"==typeof e?parseFloat(e.replaceAll(",","")):e:$({locale:t,format:r},e)}async function $e(e,t,r){const o=r?e.slice(1):e;if(r){const r=Pe(e[0],GeometryFormat.ARCGIS_JSON);if(void 0!==r)for(const[e,n]of ge){try{await Be(r[0],n,t,o)}catch{continue}return[e,[r[0]]]}const n=[GeometryFormat.XYZ,GeometryFormat.XY,GeometryFormat.LAT_LON];for(const t of n){const r=Pe(e[0],t);if(void 0!==r)return[t,r]}}for(const[e,r]of ge){const n=await je(o[0],r);if(void 0!==n){try{await Be(n,r,t,o)}catch{continue}return[e,[n]]}}return[GeometryFormat.NONE,[]]}async function Be(e,t,r,o){return{columnIndices:[e],geometries:await Promise.all(o.map((t=>t[e])).map((e=>{if(e?.raw)return t(e.raw.toString(),r)})))}}function He(e,t,r){let o=!1,n=!0,a=!0,i=!0,s=!0,c=!0;const l=new Set,{data:m,includeHeaderRow:u,dateFormat:f,timeFormat:y,primaryKeyField:p,locale:d}=e,g=u?m[0]:[],w=u?m.slice(1):m;for(const e of w){const r=e[t];r?.raw&&(l.add(r.raw),o=!0,n&&(n=Q(r.raw,d)||Number.isNaN(r.raw)),a&&(a=r.raw instanceof Date||G(f||C,r.raw)!==v),s&&(s=G(f||ue,r.formatted)!==v),i&&(i=r.raw instanceof x||H(y||J,r.raw).isValid),c&&(c=H({format:y||fe,locale:"en"},r.formatted).isValid))}const h=l.size===w.length;return p&&g[t]?.raw===p||r&&o&&h&&n?"esriFieldTypeOID":o&&c?"esriFieldTypeTimeOnly":o&&s?"esriFieldTypeDate":o&&n?"esriFieldTypeDouble":o&&i?"esriFieldTypeTimeOnly":o&&a?"esriFieldTypeDate":"esriFieldTypeString"}async function ke(e,t,r){const{escapeFormulaChars:o,locale:n,numberFormat:a,dateFormat:i,timeFormat:s}=r;if("esriFieldTypeDouble"===t.type||"esriFieldTypeOID"===t.type)return"number"==typeof e?e:e?Ue(e,n,a):null;if("esriFieldTypeDate"===t.type){if(e instanceof Date)return e.getTime();if("number"==typeof e){const t=(await import("xlsx")).SSF.parse_date_code(e);return t?new Date(t.y,t.m-1,t.d,t.H,t.M,t.S).getTime():void 0}return""===e?null:G({locale:n,format:i},e).getTime()}if("esriFieldTypeTimeOnly"===t.type){if(e instanceof x)return e.toString();if(e instanceof Date)return new x(e).toString();if("number"==typeof e){const t=(await import("xlsx")).SSF.parse_date_code(e);return t?new x(`${t.H.toString().padStart(2,"0")}:${t.M.toString().padStart(2,"0")}:${t.S.toString().padStart(2,"0")}`).toString():void 0}return""===e?null:H({locale:n,format:s},e).toString()}const c=e?.toString()??"";if(o&&c.startsWith("\t"))for(const e of se)if(c.length>1&&c.charAt(1)===e)return c.substring(1);return c}function Je(e){switch(e){case P.DATE_SHORT:return"dd/MM/yyyy";case P.DATE_LONG:return"MMMM d, yyyy";case P.TIME_SHORT:return"h:mm AM/PM";case P.TIME_LONG:return"h:mm:ss AM/PM";case P.DATE_TIME_SHORT:case P.DEFAULT:return"MMM d yyyy h:mm AM/PM";case P.DATE_TIME_LONG:return"MMMM d yyyy h:mm AM/PM";case P.FULL:return"dddd, MMMM d yyyy h:mm AM/PM";case P.ISO_8601:case P.ROUND_TRIP:return'yyyy-MM-dd"T"HH:mm:ss';default:{const t=e.replace(/tt/g,"AM/PM");return t.includes("z")&&de().warn("Warning: Excel will not recognize timezone format 'z', 'zz', or 'zzz'"),t.includes("h")&&!t.includes("AM/PM")&&de().warn("Warning: Excel will interpret 'h' as 'H' if the format does not have an AM/PM designator"),t}}}function ze(e){switch(e){case P.DATE_SHORT:return"dd/MM/yyyy";case P.DATE_LONG:return"MMMM d, yyyy";case P.DATE_TIME_SHORT:case P.DEFAULT:return"MMM d yyyy";case P.DATE_TIME_LONG:return"MMMM d yyyy";case P.FULL:return"dddd, MMMM d yyyy";case P.ISO_8601:case P.ROUND_TRIP:return"yyyy-MM-dd";default:return e.replace(/TtZzHhmSsUua/g,"")}}function We(e){switch(e){case U.TIME_SHORT:return"h:mm AM/PM";case U.TIME_LONG:return"h:mm:ss AM/PM";case U.ISO_8601:case U.ROUND_TRIP:return"HH:mm:ss";default:{const t=e.replace(/tt/g,"AM/PM");return t.includes("h")&&!t.includes("AM/PM")&&de().warn("Warning: Excel will interpret 'h' as 'H' if the format does not have an AM/PM designator"),t}}}function Xe(e){switch(e){case j.ACCOUNTING:return'_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)';case j.CURRENCY:return'"$"#,##0.00';case j.FIXED_POINT:case j.DEFAULT:return"0.0000";case j.NUMBER:return"#,##0.0000";case j.PERCENT:return"0%";case j.ROUND_TRIP:return"0.00000";default:return e}}function qe(e,t){if(null==e)return"";if(!t.useFormattedValues){if("number"==typeof e)return e;if(e instanceof Date)return"timestamp"===t.dateFormat?e.getTime():e;if(e instanceof x)return e.toDate()}let r=e.toString();return t.escapeFormulaChars&&(r=Ie(r)),r}function Ye(e,t){return 3===e.length&&!t.hasZ&&t.hasM?[e[0],e[1],void 0,e[2]]:e}function Ze(e,t){return e.map((e=>Ye(e,t)))}function Ke(e,t){return e.map((e=>Ze(e,t)))}function Ve(e,t,r){switch(t){case pe.NUMBER:return e instanceof Date?e.getTime():$(e);case pe.STRING:return e instanceof Date?L({format:r.dateFormat??P.ROUND_TRIP,timeZone:"UTC",isDateOnly:r.isDateOnly},e):e instanceof x?k({format:r.timeFormat??U.ROUND_TRIP},e):"number"==typeof e?B(r.numberFormat??j.DEFAULT,e):e.toString();case pe.BOOLEAN:return!!e;case pe.DATE:return G(e);default:return e.toString()}}function Qe(e,t){return JSON.stringify(e.toJSON())===JSON.stringify(t.toJSON())}function et(e){return 1===e.length?new l({symbol:e[0]}):new m({field:"SymbolID",uniqueValueInfos:[...e.map(((e,t)=>new u({label:t.toString(),symbol:e,value:t})))]})}
|
|
1
|
+
import e from"@arcgis/core/Color.js";import t from"@arcgis/core/Graphic.js";import r from"@arcgis/core/geometry/Point";import o from"@arcgis/core/geometry/Polygon.js";import n from"@arcgis/core/geometry/Polyline.js";import a from"@arcgis/core/geometry/SpatialReference";import i from"@arcgis/core/layers/FeatureLayer.js";import s from"@arcgis/core/layers/GroupLayer.js";import c from"@arcgis/core/layers/support/Field.js";import l from"@arcgis/core/renderers/SimpleRenderer.js";import m from"@arcgis/core/renderers/UniqueValueRenderer.js";import u from"@arcgis/core/renderers/support/UniqueValueInfo.js";import f from"@arcgis/core/symbols/MeshSymbol3D.js";import p from"@arcgis/core/symbols/PictureMarkerSymbol.js";import y from"@arcgis/core/symbols/SimpleFillSymbol.js";import d from"@arcgis/core/symbols/SimpleLineSymbol.js";import g from"@arcgis/core/symbols/SimpleMarkerSymbol.js";import w from"dxf-parser";import{geometryTypeToJson as h}from"../json/GeometryJson.js";import{translate as F}from"../locale/language.js";import{INVARIANT as S}from"../locale.js";import{FeatureCollectionLayerExtension as N}from"../mapping/FeatureCollectionLayerExtension.js";import{GroupLayerExtension as T}from"../mapping/GroupLayerExtension.js";import{MapImageLayerExtension as O}from"../mapping/MapImageLayerExtension.js";import{CaseInsensitiveObservableMap as x}from"../utilities/CaseInsensitiveObservableMap.js";import{Time as b}from"../utilities/Time.js";import{checkArg as D,assertNever as M}from"../utilities/checkArg.js";import{isPoint as E,isMultipoint as R,isPolyline as A,isPolygon as I,isExtent as G}from"../utilities/esri.js";import{parse as _,format as C,DEFAULT_PARSING_FORMATS as L,INVALID_DATE as v}from"../utilities/format/date.js";import{DateFormat as P,NumberFormat as j,TimeFormat as U}from"../utilities/format/formats.js";import{parse as $,format as B}from"../utilities/format/number.js";import{parse as H,format as k,DEFAULT_PARSING_FORMATS as z}from"../utilities/format/time.js";import{project as J,esriToWKT as X,wktToEsri as W,esriWkidToWkt as q,esriWktToWkid as Y,esriToGeoJSON as Z,geoJSONToEsri as K}from"../utilities/geometry.js";import{getLogger as V}from"../utilities/log.js";import{isNumeric as Q}from"../utilities/number.js";import{delay as ee}from"../utilities/promise.js";import{caseInsensitiveEquals as te}from"../utilities/string.js";import{Feature as re}from"./Feature.js";import{FeatureSet as oe}from"./FeatureSet.js";import{DxfEntityProcessor as ne}from"./support/_dxfConverters.js";import{createGpxDocument as ae,serializeGpxDocument as ie,buildGpxTrack as se,buildGpxTrackPoint as ce,buildGpxWaypoint as le,getGpxExtensions as me,getGpxTrackDescription as ue,getGpxTrackName as fe,getGpxTrackTime as pe,getGpxTrackId as ye}from"./support/_gpxExport.js";import{createLpkxLayer as de}from"./support/_lpkxConverter.js";import{createFgdbLayer as ge}from"./support/fgdbConverter.js";const we=["=","-","+","@"],he='"',Fe="\r\n",Se="\n",Ne=[...L.map(et),"M/d/yy"],Te=[...z.map(rt).map((e=>e.replace("AM/PM","tt")))],Oe=/(\w+)_(point|multipoint|polyline|polygon)z?/;var xe;function be(){return V("geocortex.api.data.convert")}!function(e){e.DATE="D",e.NUMBER="N",e.STRING="C",e.BOOLEAN="L"}(xe||(xe={}));export const FIELD_NAME_REGEX=/[^a-zA-Z\d_]/g;export var GeometryFormat;!function(e){e.NONE="NONE",e.WKT="WKT",e.XY="XY",e.XYZ="XYZ",e.LAT_LON="LAT_LONG",e.GEO_JSON="GEO_JSON",e.ARCGIS_JSON="ARCGIS_JSON"}(GeometryFormat||(GeometryFormat={}));export const geometryTypeHeaders={[GeometryFormat.XYZ]:[["x","y","z"]],[GeometryFormat.XY]:[["x","y"]],[GeometryFormat.LAT_LON]:[["latitude","longitude"],["lat","lon"],["lat","long"]],[GeometryFormat.ARCGIS_JSON]:[["geometry"]],[GeometryFormat.GEO_JSON]:[["geometry"]],[GeometryFormat.WKT]:[["geometry"]]};const De=[[GeometryFormat.ARCGIS_JSON,ze],[GeometryFormat.GEO_JSON,Je],[GeometryFormat.WKT,Xe]],Me=new Map(De);export async function uploadDataToFeatureSet(e){const t=await async function(e){const{data:t,includeHeaderRow:o,geometryFormat:n,geometryFields:a,locale:i,numberFormat:s,inSpatialReference:c}=e,l=o?t.slice(1):t;if(n===GeometryFormat.NONE)return{columnIndices:[]};const m=e=>Ye(e,i,s),u=(e,t)=>{const o=t===GeometryFormat.XYZ,n=t===GeometryFormat.LAT_LON;return{columnIndices:e,geometries:l.map((t=>{if(t.length>=Math.max(...e)&&Q(t[e[0]]?.raw,i)&&Q(t[e[1]]?.raw,i)&&(!o||Q(t[e[2]]?.raw,i)))return new r({x:m(n?t[e[1]].raw:t[e[0]].raw),y:m(n?t[e[0]].raw:t[e[1]].raw),z:o?m(t[e[2]].raw):0,spatialReference:c})}))}},f=async(e,t)=>({columnIndices:[e],geometries:await Promise.all(l.map((t=>t[e])).map((e=>{if(e?.raw)return t(e.raw.toString(),c)})))}),p=async(e,t)=>{switch(t){case GeometryFormat.NONE:return{columnIndices:[0]};case GeometryFormat.LAT_LON:case GeometryFormat.XYZ:case GeometryFormat.XY:return u(e,t);case GeometryFormat.ARCGIS_JSON:return f(e[0],ze);case GeometryFormat.GEO_JSON:return f(e[0],Je);case GeometryFormat.WKT:return f(e[0],Xe);default:return M(t,new Error(`Unknown geometry format "${t}".`))}};if(n){const e=We(o?t[0]:t[0].map(((e,t)=>({raw:t.toString()}))),n,o?a:a.map((e=>""+(parseInt(e.match(/\d+/g)[0])-1))));if(o&&void 0===e)throw new Error(`Error parsing file data: Expected geometry columns ${geometryTypeHeaders[n][0].join(",")} are missing for GeometryType.${n}`);return p(e??[0],n)}const[y,d]=await Ze(t,c,o);if(y===GeometryFormat.NONE)return{columnIndices:[]};return d.length>1?u(d,y):f(d[0],Me.get(y))}(e),o=function(e,t){const{data:r,displayField:o,includeHeaderRow:n,inSpatialReference:a,outSpatialReference:i,generatePrimaryKey:s}=e,c={fields:[]},l=e=>!(!t.columnIndices||0===t.columnIndices.length)&&t.columnIndices.includes(e);let{primaryKeyField:m}=e,u=0;for(let t=0;t<r[0].length;t++){if(l(t))continue;const o=Ve(e,t,!s&&!m&&!c.fields.find((e=>"esriFieldTypeOID"===e.type)));let a=r[0][t]?.raw?.toString(),i=a?.replace(FIELD_NAME_REGEX,"_");n&&i||(i="field"+ ++u,a=F("gcx.api.data.convert.import-field-alias",u)),c.fields.push({alias:a,name:i,type:o}),"esriFieldTypeOID"===o&&(m=i)}if(c.spatialReference=i??t.geometries?.[0]?.spatialReference??a,t.geometries?.length){const e=t.geometries.filter((e=>void 0!==e)).map((e=>e.type)),r=e[0];c.geometryType=e.every((e=>e===r))?h(r):void 0}if(!c.fields.find((e=>"esriFieldTypeOID"===e.type))){const e=c.fields.length+1,t=!!c.fields.find((e=>"objectid"===e.name.toLowerCase()));m=t?`OBJECTID_${e}`:"OBJECTID",c.fields.push({name:m,alias:m,type:"esriFieldTypeOID"})}return c.displayField=o??c.fields.find((e=>!te(e.name,m)&&"esriFieldTypeString"===e.type))?.name??c.fields.find((e=>!te(e.name,m)))?.name??m,c.primaryKeyField=m,c}(e,t),n=await async function(e,t,r){const{data:o,includeHeaderRow:n,outFields:a,escapeFormulaChars:i,locale:s,numberFormat:c,dateFormat:l,timeFormat:m}=e,{spatialReference:u}=r,f=[],p=n?o.slice(1):o,y=(e,r)=>!t.columnIndices||0===t.columnIndices.length||!t.columnIndices.includes(r);return await Promise.all(p.map((async(e,o)=>{const n=new re;for(let t=0;t<r.fields.length;t++){const u=r.fields[t],f=e.filter(y);if(a.includes("*")||a.filter((e=>te(e,u.name))).length>0){let e=await Qe(f[t]?.raw,u,{escapeFormulaChars:i,dateFormat:l,numberFormat:c,timeFormat:m,locale:s});"esriFieldTypeOID"===u.type&&null===e&&(e=o),n.attributes.set(u.name,e)}}t.geometries&&(n.geometry=await ve(t.geometries[o],u)),f.push(n)}))),f}(e,t,o);return new oe({features:n,schema:o})}export async function toCsv(e,t){D("featureSet",e).isNotMissing();const r=Array.from(e),o={...{useFormattedValues:!1,alwaysQuote:!1,escapeFormulaChars:!0,delimiter:",",dateFormat:P.ROUND_TRIP,timeFormat:U.ROUND_TRIP,geometryFormat:r.some((e=>void 0!==e.geometry&&null!==e.geometry))?GeometryFormat.WKT:GeometryFormat.NONE,includeByteOrderMark:!0,outSpatialReference:a.WGS84,includeHeaderRow:!0,outFields:Ce(e.source),rowDelimiter:navigator.platform?.startsWith("Win")?Fe:"\n"},...t},{includeByteOrderMark:n,includeHeaderRow:i,delimiter:s,outFields:c,rowDelimiter:l}=o,m=[];n&&m.push("\ufeff");const u=Ge(r,o),f=_e(r,c,e.schema,!0),p=_e(r,c,e.schema,!1);if(i){const e=[];for(const t of u)e.push(Pe(t,o));for(const t of f)e.push(Pe(t,o));for(const t of p)e.push(Pe(t,o));const t=e.join(s)+l;m.push(t)}await Promise.all(r.map((async e=>{const t=[],r=(t,r)=>{const o=Ue(e,t,r),n=e.schema.findFieldByName(t)?.type;return Pe(je(o,{...r,isDateOnly:"date-only"===n}),r)};t.push(...await async function(e,t){let r=await Le(e,t);t.geometryFormat!==GeometryFormat.XYZ&&t.geometryFormat!==GeometryFormat.XY&&t.geometryFormat!==GeometryFormat.LAT_LON||(r=r.map((e=>void 0===e?"":je(e,t))));return r.map((e=>""===e?"":Pe(e,t)))}(e.geometry,o)),t.push(...f.map((e=>r(e,o)))),t.push(...p.map((e=>r(e,o))));const n=`${t.join(s)}${l}`;m.push(n)})));return new Blob(m,{type:"text/plain",endings:"\n"===l||l===Fe?"transparent":"native"})}export async function csvToUploadData(e,t){let r;if(D("csvData",e).isNotMissing(),e instanceof Blob){const t=new Promise(((t,r)=>{const o=new FileReader;o.onload=()=>{t(o.result)},o.onerror=()=>{r(o.error)},o.readAsText(e)}));r=await t}else r=e;const o=Re(t),n=o.rowDelimiter||function(e){let t=Se;return ke(e,Fe,((r,o)=>(0===r&&o===e.length||(t=Fe),!1))),t}(r),a=o.delimiter??function(e,t,r){const o=",";if(0===e.length)return o;const n=[];if(ke(e,t,((t,r)=>(r!==e.length||t!==r)&&(n.push(e.substring(t,r)),n.length<3))),0===n.length)return o;let a=[{delimiter:",",rowsDelimiterOccurrences:[],rowsNumberAdjacentOccurrences:[]},{delimiter:";",rowsDelimiterOccurrences:[]},{delimiter:"|",rowsDelimiterOccurrences:[]},{delimiter:"\t",rowsDelimiterOccurrences:[]},{delimiter:" ",rowsDelimiterOccurrences:[]}].filter((e=>n[0].includes(e.delimiter)));if(0===a.length)return o;for(const e of n)for(const t of a){let o=0,n=0;ke(e,t.delimiter,((a,i)=>{if(i!==e.length&&o++,","===t.delimiter){const t=e.charAt(i-1),o=e.charAt(i+1);Q(t,r)&&Q(o,r)&&n++}return!0})),t.rowsDelimiterOccurrences.push(o),","===t.delimiter&&t.rowsNumberAdjacentOccurrences.push(n)}if(a=a.filter((e=>e.rowsDelimiterOccurrences.every((t=>e.rowsDelimiterOccurrences[0]===t)))).sort(((e,t)=>t.rowsDelimiterOccurrences[0]-e.rowsDelimiterOccurrences[0])),a.length>1&&","===a[0].delimiter&&null!=r&&r!==S){const e=a[0];if(null!=e&&","===e.delimiter&&","===Intl.NumberFormat(r).formatToParts(1.1).find((e=>"decimal"===e.type))?.value)for(let t=0;t<e.rowsDelimiterOccurrences.length;t++)if(e.rowsDelimiterOccurrences[t]<=e.rowsNumberAdjacentOccurrences[t]){a=a.filter((e=>","!==e.delimiter));break}}if(0===a.length)return o;return a[0].delimiter}(r,n,t.locale),i=function(e,t,r){const o=[],n=(e,t)=>{const o=[];return ke(e,r,((r,n)=>{const a=e.substring(r,n);return o.push({raw:He(a,t,o.length)}),!0})),o};if(ke(e,t,((t,r)=>{const a=e.substring(t,r);return a.length>0&&o.push(n(a,o.length)),!0})),o.length){const e=o[0].length;o.forEach(((t,r)=>{if(t.length!==e)throw new Error(`Detected invalid CSV: Row ${r} does not have expected number of columns: ${e}`)}))}return o}(r,n,a);let{geometryFormat:s,geometryFields:c}=t;if(!s){const[e,t]=await Ze(i,o.inSpatialReference,o.includeHeaderRow);s=e,c=t.map((e=>o.includeHeaderRow?i[0][e]?.raw??F("gcx.api.data.convert.import-field-alias",(e+1).toString()):F("gcx.api.data.convert.import-field-alias",(e+1).toString())))}return{data:i,...o,geometryFormat:s,geometryFields:c}}export async function csvToFeatureSet(e,t){const r=Re(t);return uploadDataToFeatureSet(await csvToUploadData(e,r))}export async function toGpx(e){D("featureSet",e).isNotMissing();const t=Array.from(e),r=ae(),o=r.documentElement,n=new Set;for(const e of t){if(!e.geometry)continue;const t=await ve(e.geometry,a.WGS84),i={name:fe(e),desc:ue(e),time:pe(e),extensions:me(r,e),id:ye(e)};if(E(t))o.appendChild(le(r,t.y,t.x,t.hasZ?t.z:void 0,i));else if(A(t))for(const e of t.paths){if(e.length<2)continue;const n=e.map((([e,o,n])=>ce(r,o,e,t.hasZ?n:void 0)));o.appendChild(se(r,n,i))}else n.add(t.type)}if(n.size>0){const e=Array.from(n).join(", ");be().warn(`One or more features with unsupported geometry types (${e}) were ignored during GPX conversion. GPX format only supports points and polylines.`)}const i=ie(r);return new Blob([i],{type:"application/gpx+xml"})}export async function toXLSX(e,t){D("featureSet",e).isNotMissing();const r=Array.from(e),o={...{useFormattedValues:!1,includeHeaderRow:!0,escapeFormulaChars:!0,geometryFormat:r.some((e=>void 0!==e.geometry&&null!==e.geometry))?GeometryFormat.WKT:GeometryFormat.NONE,outFields:Ce(e.source),outSpatialReference:a.WGS84,dateFormat:P.DEFAULT,timeFormat:U.DEFAULT,numberFormat:j.DEFAULT,sheetName:"sheet1"},...t},{outFields:n,includeHeaderRow:i,dateFormat:s,timeFormat:c,numberFormat:l}=o,m=Ge(r,o),u=_e(r,n,e.schema,!0),f=_e(r,n,e.schema,!1),p=await import("xlsx"),y=p.utils.sheet_new();let d=!1;if(i){const t=m.concat(u).concat(function(e,t){const r=t?.schema?.fieldExtensions.initializedItems.map((e=>e.field));return e.map((e=>r?.find((t=>te(t.name,e)))?.alias??e))}(f,e.source));d=!0,p.utils.sheet_add_aoa(y,[t],{cellDates:!0})}await Promise.all(r.map((async e=>{const t=[],r=new Set,n=new Set;t.push(...await Le(e.geometry,o));for(const r of u){const n=nt(e.attributes.get(r),o);t.push(n)}for(const a of f){const i=Ue(e,a,o);if(i instanceof b){const o=e.schema.findFieldByName(a);"time-only"===o?.type&&r.add(t.length)}else if(i instanceof Date){const r=e.schema.findFieldByName(a);"date-only"===r?.type&&n.add(t.length)}const s=nt(i,o);t.push(s)}if(!t.every((e=>"string"!=typeof e||e.length<=32767)))return void be().warn(`toXLSX cell limit exceeded, feature (${e.primaryKey??e.id}) omitted.`);p.utils.sheet_add_aoa(y,[t],{cellDates:!0,origin:d?-1:void 0}),d=!0;const a=p.utils.decode_range(y["!ref"]);for(let e=a.s.c;e<=a.e.c;e++){const t=y[p.utils.encode_cell({r:a.e.r,c:e})];"d"===t.t?r.has(e)?t.z=rt(c??U.ROUND_TRIP):n.has(e)?t.z=tt(s??P.ROUND_TRIP):t.z=et(s??P.ROUND_TRIP):"n"===t.t&&(t.z=ot(l))}})));const g={SheetNames:[],Sheets:{}};g.SheetNames.push(o.sheetName),g.Sheets[o.sheetName]=y;const w=p.write(g,{type:"binary",bookType:"xlsx",compression:!0,bookSST:!0,cellDates:!0}),h=new Uint8Array(w.length);for(let e=0;e<w.length;e++)h[e]=w.charCodeAt(e);return new Blob([h.buffer],{type:"text/plain"})}export async function xlsxToUploadData(e,t){D("xlsxData",e).isNotMissing();const r=Ae(t),o=await async function(e,t){const r=await import("xlsx"),o=new Promise(((o,n)=>{const a=new FileReader;a.onload=()=>{const e=new Uint8Array(a.result);let n="";for(const t of e)n+=String.fromCharCode(t);const i=r.read(n,{type:"binary",cellDates:!0}),s=t.sheetName||i.SheetNames[0],c=i.Sheets[s];o(c)},a.onerror=()=>{n(a.error)},a.readAsArrayBuffer(e)})),n=await o,a=r.utils.decode_range(n["!ref"]),i=[];for(let e=a.s.r;e<=a.e.r;e++){const t=[];for(let o=a.s.c;o<=a.e.c;o++){const a=n[`${r.utils.encode_cell({r:e,c:o})}`];a&&"d"===a.t&&a.v instanceof Date&&(a.v=new Date(a.v.getTime()+6e4*a.v.getTimezoneOffset())),t.push(a?{raw:a.v,formatted:"s"===a.t?void 0:a.w}:{raw:""})}i.push(t)}return i}(e,r);let{geometryFormat:n,geometryFields:a}=t;if(!n){const[e,t]=await Ze(o,r.inSpatialReference,r.includeHeaderRow);n=e,a=t.map((e=>r.includeHeaderRow?o[0][e]?.raw.toString()??F("gcx.api.data.convert.import-field-alias",(e+1).toString()):F("gcx.api.data.convert.import-field-alias",(e+1).toString())))}return{data:o,...r,geometryFormat:n,geometryFields:a}}export async function xlsxToFeatureSet(e,t){D("xlsxData",e).isNotMissing();const r=Ae(t);return uploadDataToFeatureSet(await xlsxToUploadData(e,r))}export function kmlHexToEsriColor(t){return e.fromHex(`#${t.match(/.{2}/g).reverse().join("")}`)}export function parseKMLCoordinates(e){return e.trim().split(/\s+/).map((e=>{const[t,r,o]=e.split(",").map(Number);return{x:t,y:r,z:o}}))}export function parseKMLSymbol(t,r,o){if(t){const r=t.querySelector("IconStyle > Icon > href")?.textContent;if(r)return new p({url:r,width:32,height:32});const o=t.querySelector("PolyStyle");if(o){const t=o.querySelector("color")?.textContent,r=t?kmlHexToEsriColor(t):new e([0,0,0,1]);return new y({color:r,outline:{color:[0,0,0,.5],width:1}})}const n=t.querySelector("LineStyle");if(n){const t=n.querySelector("color")?.textContent,r=t?kmlHexToEsriColor(t):new e([0,0,0,1]),o=parseFloat(n.querySelector("width")?.textContent||"1");return new d({color:r,width:o})}}return getDefaultSymbol(o,"polygon"===r?"polygon":"point"===r?"point":"polyline")}export async function toShapefile(e,t){D("featureSet",e).isNotMissing();const[{default:r},o]=await Promise.all([import("jszip"),import("../forked-libs/shp-write/index.js")]),n=Array.from(e),i={...{useFormattedValues:!1,outFields:Ce(e.source),fileName:e.title||"export"},...t},{outFields:s,outSpatialReference:c,fileName:l}=i,m=e=>e.geometry.hasZ||e.geometry.hasM,u=new Map,f=n.filter((e=>E(e.geometry)));u.set("POINTZ",f.filter(m)),u.set("POINT",f.filter((e=>!m(e))));const p=n.filter((e=>R(e.geometry)));u.set("MULTIPOINTZ",p.filter(m)),u.set("MULTIPOINT",p.filter((e=>!m(e))));const y=n.filter((e=>A(e.geometry)));u.set("POLYLINEZ",y.filter(m)),u.set("POLYLINE",y.filter((e=>!m(e))));const d=n.filter((e=>I(e.geometry)||G(e.geometry)));u.set("POLYGONZ",d.filter(m)),u.set("POLYGON",d.filter((e=>!m(e))));const g=_e(n,s,e.schema,!0);let w=_e(n,s,e.schema,!1);w=g.concat(w);const h=new r,F=Array.from(u.keys()).filter((e=>u.get(e).length>0));await Promise.all(F.map((async t=>{const r=u.get(t),n=await Promise.all(r.map((e=>ve(e.geometry,c)))),s=await async function(e){const{wkid:t,wkt:r}=e[0].spatialReference;if(!e.every((e=>e.spatialReference.wkid===t&&e.spatialReference.wkt===r)))throw new Error("Cannot create shapefile that contains geometries with different spatial references.");return r??await q(t??a.WGS84.wkid)}(n),m=i.useFormattedValues?Object.assign({},...w.map((e=>({[e]:xe.STRING})))):function(e,t,r,o){const n={};for(const a of t){if(e.some((e=>$e(e,a)))){n[a]=xe.STRING;continue}const t=r?r.fields.find((e=>te(e.name,a))):void 0;if(t){switch(t.type){case"oid":case"double":case"integer":case"single":case"small-integer":case"big-integer":n[a]=xe.NUMBER;break;case"date":case"timestamp-offset":n[a]=o?xe.NUMBER:xe.DATE;break;default:n[a]=xe.STRING}continue}const i=(e,t)=>e.attributes.get(t)??e.presentableAttributes.get(t);e.every((e=>i(e,a)instanceof Date||void 0===i(e,a)))&&e.some((e=>i(e,a)instanceof Date))?n[a]=o?xe.NUMBER:xe.DATE:e.every((e=>"number"==typeof i(e,a)||void 0===i(e,a)))&&e.some((e=>"number"==typeof i(e,a)))?n[a]=xe.NUMBER:e.every((e=>"boolean"==typeof i(e,a)||void 0===i(e,a)))&&e.some((e=>"boolean"==typeof i(e,a)))?n[a]=xe.BOOLEAN:n[a]=xe.STRING}return n}(r,w,e.schema,"timestamp"===i.dateFormat),f=function(e){return e.map((e=>{if(E(e)){const{x:t,y:r,z:o,m:n}=e,a=[t,r];return e.hasZ&&a.push(o),e.hasM&&a.push(n),at(a,e)}if(R(e))return it(e.points,e);if(A(e))return st(e.paths,e);if(I(e))return st(e.rings,e);if(G(e)){const t=[e.xmin,e.ymax];return[[t,[e.xmax,e.ymax],[e.xmax,e.ymin],[e.xmin,e.ymin],t]]}throw new Error("Unsupported geometry type.")}))}(n),p=function(e,t,r,o){const n=[];for(const a of e){const e={};for(const n of t){let t=Ue(a,n,o);if(null==t&&(t=""),o.useFormattedValues)t=t.toString();else{t=ct(t,r[n],{...o,isDateOnly:"date-only"===a.schema.findFieldByName(n)?.type})}e[n.replaceAll(".","_")]=t}n.push(e)}return n}(r,w,m,i);o.write(p,t,f,((e,r)=>{const o=F.length>1?`${l}_${t.toLowerCase()}`:l;h.file(`${o}.shp`,r.shp.buffer,{binary:!0}),h.file(`${o}.shx`,r.shx.buffer,{binary:!0}),h.file(`${o}.dbf`,r.dbf.buffer,{binary:!0}),h.file(`${o}.prj`,s)}))})));const S=await h.generateAsync({type:"uint8array"});return new Blob([S.buffer],{type:"text/plain"})}export async function kmlToLayerExtensions(e){D("blob",e).isNotMissing();const a=await e.text(),l=(new DOMParser).parseFromString(a,"application/xml"),m=function(e,a,u=!1){const f={};l.querySelectorAll("Style").forEach((e=>{f[`#${e.id}`]=e}));const p=e.querySelector(":scope > name")?.textContent??"Unnamed Container",y=new Map;e.querySelectorAll(":scope > Placemark").forEach(((e,i)=>{const s=e.querySelector("name")?.textContent??"",c=e.querySelector("description")?.textContent??"",l=function(e){const t=e.querySelector("Point > coordinates"),a=e.querySelector("LineString > coordinates"),i=e.querySelector("Polygon");if(t?.textContent){const[e]=parseKMLCoordinates(t.textContent.replace(/ /g,""));return new r(e)}if(a?.textContent)return new n({paths:[parseKMLCoordinates(a.textContent).map((({x:e,y:t})=>[e,t]))]});if(i?.textContent){const e=i.querySelector("outerBoundaryIs > LinearRing > coordinates");if(e?.textContent){const t=[parseKMLCoordinates(e.textContent).map((({x:e,y:t})=>[e,t]))];return new o({rings:t})}}return}(e);if(l?.type){const r=e.querySelector("styleUrl")?.textContent,o=parseKMLSymbol(r?f[r]:e.querySelector("Style"),l.type,a);y.has(l.type)||y.set(l.type,{graphics:[],symbols:[]});let n=function(e,t){for(let r=0;r<e.length;r++)if(lt(e[r],t))return r;return-1}(y.get(l.type).symbols,o);-1===n&&(y.get(l.type).symbols.push(o),n=y.get(l.type).symbols.length-1),y.get(l.type).graphics.push(new t({geometry:l,attributes:{name:s,description:c,SymbolID:n,OBJECTID:p+i}}))}}));const d=e.querySelectorAll(":scope > Folder, :scope > Document");if(u||1!==y.size||0!==d.length){const e=new T({layer:new s({title:p})});return y.forEach(((t,r)=>{const o=new i({displayField:"name",title:`${r.slice(0,1).toUpperCase()+r.slice(1)}s`,source:t.graphics,renderer:mt(t.symbols),fields:[new c({name:"OBJECTID",type:"oid",alias:"OBJECTID"}),new c({name:"SymbolID",type:"integer",alias:"SymbolID",editable:!1}),new c({name:"name",type:"string",alias:"name"}),new c({name:"description",type:"string",alias:"description",defaultValue:""})]}),n=new N({layer:o});e.layerExtensions.add(n)})),d.forEach(((t,r)=>{const o=m(t,r);e.layerExtensions.add(o)})),e}{const e=[...y.values()][0],t=new i({displayField:"name",title:p,source:e.graphics,renderer:mt(e.symbols),fields:[new c({name:"OBJECTID",type:"oid",alias:"OBJECTID"}),new c({name:"SymbolID",type:"integer",alias:"SymbolID",editable:!1}),new c({name:"name",type:"string",alias:"name"}),new c({name:"description",type:"string",alias:"description",defaultValue:""})]});return new N({layer:t})}},u=[];return l.querySelectorAll("kml > Document, kml > Folder").forEach(((e,t)=>{const r=m(e,t,!0);r.layerExtensions.length&&u.push(r)})),u}export async function lpkxToLayerExtensions(e,t){const{displayServiceUrl:r,geoProcessedLpkxData:o}=t;D("options.lpkxBlob",e).isNotMissing(),D("options.displayServiceUrl",r).isNotMissing();const n=de(o,e,r);return[new O({layer:n})]}export async function dxfToLayerExtensions(e,t,r){const{inputSpatialReference:o,outputSpatialReference:n}=t;D("options.dxfBlob",e).isNotMissing(),D("options.inputSpatialReference",o).isNotMissing(),D("options.outputSpatialReference",n).isNotMissing();const a=new ne(o,n,r),i=a.getContext(),c=await e.text(),l=new w;await ee();try{const e=l.parseSync(c);if(!e)throw new Error("DXF parsing failed: parser returned null");i.dxf=e}catch(e){throw e instanceof Error?e:new Error(String(e))}const m=e instanceof File?e.name:"dxf-layer",u=m.replace(/[^a-zA-Z0-9_.-]/g,"_");if(i.fileName=m,i.sanitizedFileName=u,i.subLayers=await a.processAll(),!i.subLayers||0===i.subLayers.length)return[];const f=new s({id:`dxf-group-${u}-${(new Date).getTime()}`,title:m,visible:!0}),p={layer:f,visibilityMode:"independent"};return f.layers.addMany(i.subLayers),[new T(p)]}export async function fgdbToLayerExtensions(e,t){const{displayServiceUrl:r,geoProcessedFgdbData:o}=t;D("options.fgdbBlob",e).isNotMissing(),D("options.displayServiceUrl",r).isNotMissing(),D("options.geoProcessedFgdbData",o).isNotMissing();const n=await ge(o,e,r);return[new O({layer:n})]}export async function shapefileToUploadData(e,t){D("shapefileData",e).isNotMissing();const o=Ie(t),n=new Promise(((t,r)=>{const o=new FileReader;o.onload=()=>{t(o.result)},o.onerror=()=>{r(o.error)},o.readAsArrayBuffer(e)})),[{default:i},{default:s}]=await Promise.all([import("jszip"),import("shpjs")]),c=await n,l=await i.loadAsync(new Uint8Array(c)),m=new x;l.forEach(((e,t)=>{t&&m.set(t.name,t)}));const u=l.filter((()=>!0)).map((e=>e.name));let f,p=u.filter((e=>e.endsWith(".shp"))).map((e=>e.substring(0,e.length-4)));if(p=function(e){if(!e.length)return[];let t=e[0];const r=t.match(Oe);return r?(t=r[1],e.filter((e=>{const r=e.match(Oe);return r&&r[1]===t}))):[t]}(p),u.some((e=>e.endsWith(".prj")))&&!p.every((e=>m.has(`${e}.prj`))))throw new Error("Shapefile zip must contain the same prj file for each separate shapefile");await Promise.all(u.filter((e=>e.endsWith(".prj"))).map((async e=>{const t=await l.file(e).async("string");if(f){if(t!==f)throw new Error("Shapefile zip must contain the same prj file for each separate shapefile")}else f=t})));let y=[],d=[];for(const e of p){if(!m.has(`${e}.shp`)||!m.has(`${e}.shx`)||!m.has(`${e}.dbf`))throw new Error("Shapefile must contain shp, shx, and dbf files.");const t=s.parseShp(await m.get(`${e}.shp`).async("uint8array")),r=s.parseDbf(await m.get(`${e}.dbf`).async("uint8array"));if(r.length!==t.length)throw new Error("Shapefile must contain shp, shx, and dbf files.");y=y.concat(r),d=d.concat(t)}const g=await Promise.all(d.map((e=>async function(e,t){const o=E(e)?function(e){D("geometry.coordinates",e.type).matches("Point"),D("geometry.coordinates",e.coordinates).satisfies((e=>"number"==typeof e||Array.isArray(e)));const[t,o,n]=e.coordinates,i=new r({x:t,y:o,spatialReference:a.WGS84});if(Array.isArray(n)){const[e,t]=n;!e&&!t||e?i.z=e:i.m=t}return i}(e):await K(e);if(t){let e;try{const r=await Y(t);e=new a({wkid:$(r)})}catch{}e||(e=new a({wkt:t})),o.spatialReference=e}return o}(e,f)))),w=geometryTypeHeaders[GeometryFormat.ARCGIS_JSON][0][0];y.forEach(((e,t)=>e[w]=JSON.stringify(g[t].toJSON())));return{data:function(e){const t=e.map((e=>Object.keys(e))).reduce(((e,t)=>e.concat(t.filter((t=>!e.includes(t))))),[]);return[t.map((e=>({raw:e}))),...e.map((e=>t.map((t=>({raw:e[t]})))))]}(y),...o,includeHeaderRow:!0,geometryFormat:GeometryFormat.ARCGIS_JSON,geometryFields:[w],inSpatialReference:g[0]?.spatialReference??a.fromJSON({wkid:4326})}}export async function shapefileToFeatureSet(e,t){D("shapefileData",e).isNotMissing();const r=Ie(t);return uploadDataToFeatureSet(await shapefileToUploadData(e,r))}export function getDefaultSymbol(e,t){const r=e%8;let o=["#FFDBFF","#88D6FF","#7F9FC3","#FF8200","#F34A53","#76E3B9","#E7BFFF","#FFC467"][r],n=["#EF3786","#005A99","#2D5070","#790C00","#4C0000","#006543","#6244A9","#904200"][r];if(Math.floor(e/8)%2!=0){const e=o;o=n,n=e}switch(t){case"point":case"multipoint":return new g({color:o,outline:{color:n}});case"polyline":return new d({color:o,width:"2"});case"polygon":return new y({color:o,outline:{color:n}});case"mesh":return new f({symbolLayers:[{type:"fill",material:{color:o},outline:{color:n}}]})}}function Ee(e){return{escapeFormulaChars:!0,outFields:["*"],generatePrimaryKey:!1,locale:S,detectOid:!e?.primaryKeyField}}function Re(e){return{...{includeHeaderRow:!0,inSpatialReference:a.WGS84,...Ee(e)},...e}}function Ae(e){return{...{includeHeaderRow:!0,inSpatialReference:a.WGS84,...Ee(e)},...e}}function Ie(e){return{...{...Ee(e)},...e}}function Ge(e,t){return t.geometryFormat===GeometryFormat.XYZ?["x","y","z"]:t.geometryFormat===GeometryFormat.XY?["x","y"]:t.geometryFormat===GeometryFormat.LAT_LON?["latitude","longitude"]:t.geometryFormat===GeometryFormat.NONE?[]:["geometry"]}function _e(e,t,r,o){const n=r.fields.filter((e=>"oid"===e.type)).map((e=>e.name)).toArray();if(o)return n;if(t&&!t.includes("*"))return t.filter((e=>!n.includes(e)));{const t=r.fields.filter((e=>"oid"!==e.type)).map((e=>e.name)).toArray();let o=[];for(const r of e)for(const e of r.attributes.keys())t.includes(e)||n.includes(e)||o.includes(e)||o.push(e);return o=o.sort(),t.concat(o)}}function Ce(e){if(!e)return["*"];const t=e.featureSettings.popupTemplate?.content;if(Array.isArray(t)){const e=new Set;for(const r of t)if("fields"===r.type&&Array.isArray(r.fieldInfos))for(const t of r.fieldInfos)t.visible&&e.add(t.fieldName);if(e.size>0)return Array.from(e)}const r=e.featureSettings.popupTemplate?.fieldInfos;if(Array.isArray(r)){const e=[];for(const t of r)t.visible&&e.push(t.fieldName);if(e.length>0)return e}return["*"]}async function Le(e,t){const r=await ve(e,t.outSpatialReference);if(t.geometryFormat===GeometryFormat.XYZ){if(!r)return["","",""];if(!E(r))throw new Error("Cannot use geometry format XYZ with non-point geometry");return[r.x,r.y,r.z]}if(t.geometryFormat===GeometryFormat.XY){if(!r)return["",""];if(!E(r))throw new Error("Cannot use geometry format XY with non-point geometry");return[r.x,r.y]}if(t.geometryFormat===GeometryFormat.LAT_LON){if(!r)return["",""];if(!E(r))throw new Error("Cannot use geometry format LAT_LONG with non-point geometry");return[r.y,r.x]}return t.geometryFormat===GeometryFormat.ARCGIS_JSON?r?[JSON.stringify(r.toJSON())]:[""]:t.geometryFormat===GeometryFormat.WKT?r?[await X(r)]:[""]:t.geometryFormat===GeometryFormat.GEO_JSON?r?[JSON.stringify(await Z(r))]:[""]:[]}async function ve(e,t){return e?.spatialReference&&!e.spatialReference.equals(t)&&t?(await J([e],t))[0]:e}function Pe(e,t){const r=[t.delimiter,he,"\r","\n",t.rowDelimiter];if(t.alwaysQuote||r.some((t=>e.includes(t)))){const t=e.replace(new RegExp(he,"g"),`${he}${he}`);return`${he}${t}${he}`}return e}function je(e,t){if(null==e)return"";if(!t.useFormattedValues){if("number"==typeof e){const r=t.numberFormat||j.ROUND_TRIP;return B(r,e)}if(e instanceof Date)return"timestamp"===t.dateFormat?e.getTime().toString():C({format:t.dateFormat,timeZone:"UTC",isDateOnly:t.isDateOnly},e);if(e instanceof b)return k({format:t.timeFormat},e)}let r=e.toString();return t.escapeFormulaChars&&(r=Be(r)),r}function Ue(e,t,r){if(r.useFormattedValues||$e(e,t))return e.presentableAttributes.get(t)??e.attributes.get(t);const o=e.schema.findFieldByName(t)?.type;if(null!=o)switch(o){case"date":case"date-only":case"timestamp-offset":{const r=_(e.attributes.get(t));if(!isNaN(r.getTime()))return r;break}case"time-only":{const r=H(e.attributes.get(t));if(r.isValid)return r;break}}return e.attributes.get(t)??e.presentableAttributes.get(t)}function $e(e,t){return!!te(t,e.schema.typeIdField)||("coded-value"===e.type?.domains?.[t]?.type||"coded-value"===e.schema.findFieldByName(t)?.domain?.type)}function Be(e){for(const t of we)if(e.startsWith(t))return`\t${e}`;return e}function He(e,t,r){const o=e.startsWith(he),n=e.endsWith(he);if(o&&!n||!o&&n)throw new Error(`Detected invalid CSV: Missing opening or closing quote for value at row:${t} column:${r}`);const a=o?e.substring(1,e.length-1):e;let i=-1;return ke(a,he,((e,o)=>{if(o===a.length)return!0;if(i<0){if(o!==a.length)return i=o,!0}else if(o===i+1)return i=-1,!0;throw new Error(`Detected invalid CSV: Non-escaped quote for value at row:${t} column:${r}`)})),a.replace(new RegExp(`${he}${he}`,"g"),he)}function ke(e,t,r){let o,n=!1,a=0,i=0;for(;o=e.indexOf(t,a),!(o<0);){for(let t=a;t<o;)e.substring(t).startsWith(he)?(n=!n,t+=1):t++;const s=o+t.length;if(!n){const e=r(i,o);if(i=s,!e)return}a=s}r(i,e.length)}async function ze(e,t){const r=JSON.parse(e),o=(await import("@arcgis/core/geometry/support/jsonUtils")).fromJSON(r);return r.spatialReference||(o.spatialReference=t),o}async function Je(e,t){const r=await K(JSON.parse(e));return r.spatialReference=t,r}async function Xe(e,t){const r=await W(e);return r.spatialReference=t,r}function We(e,t,r){const o=r?[r]:geometryTypeHeaders[t];for(const t of o){const r=t.map((t=>e.map((e=>e?.raw?.toString().trim().toLowerCase())).indexOf(t.trim().toLowerCase())));if(r.every((e=>e>=0)))return r}}async function qe(e,t){return(await Promise.all(e.map((async(e,r)=>{const o=e?.raw;if("string"==typeof o&&""!==o)try{return await t(o,void 0),r}catch{return}})))).find((e=>void 0!==e))}function Ye(e,t,r){return"inv"===t?"string"==typeof e?parseFloat(e.replaceAll(",","")):e:$({locale:t,format:r},e)}async function Ze(e,t,r){const o=r?e.slice(1):e;if(r){const r=We(e[0],GeometryFormat.ARCGIS_JSON);if(void 0!==r)for(const[e,n]of De){try{await Ke(r[0],n,t,o)}catch{continue}return[e,[r[0]]]}const n=[GeometryFormat.XYZ,GeometryFormat.XY,GeometryFormat.LAT_LON];for(const t of n){const r=We(e[0],t);if(void 0!==r)return[t,r]}}for(const[e,r]of De){const n=await qe(o[0],r);if(void 0!==n){try{await Ke(n,r,t,o)}catch{continue}return[e,[n]]}}return[GeometryFormat.NONE,[]]}async function Ke(e,t,r,o){return{columnIndices:[e],geometries:await Promise.all(o.map((t=>t[e])).map((e=>{if(e?.raw)return t(e.raw.toString(),r)})))}}function Ve(e,t,r){let o=!1,n=!0,a=!0,i=!0,s=!0,c=!0;const l=new Set,{data:m,includeHeaderRow:u,dateFormat:f,timeFormat:p,primaryKeyField:y,locale:d}=e,g=u?m[0]:[],w=u?m.slice(1):m;for(const e of w){const r=e[t];r?.raw&&(l.add(r.raw),o=!0,n&&(n=Q(r.raw,d)||Number.isNaN(r.raw)),a&&(a=r.raw instanceof Date||_(f||L,r.raw)!==v),s&&(s=_(f||Ne,r.formatted)!==v),i&&(i=r.raw instanceof b||H(p||z,r.raw).isValid),c&&(c=H({format:p||Te,locale:"en"},r.formatted).isValid))}const h=l.size===w.length;return y&&g[t]?.raw===y||r&&o&&h&&n?"esriFieldTypeOID":o&&c?"esriFieldTypeTimeOnly":o&&s?"esriFieldTypeDate":o&&n?"esriFieldTypeDouble":o&&i?"esriFieldTypeTimeOnly":o&&a?"esriFieldTypeDate":"esriFieldTypeString"}async function Qe(e,t,r){const{escapeFormulaChars:o,locale:n,numberFormat:a,dateFormat:i,timeFormat:s}=r;if("esriFieldTypeDouble"===t.type||"esriFieldTypeOID"===t.type)return"number"==typeof e?e:e?Ye(e,n,a):null;if("esriFieldTypeDate"===t.type){if(e instanceof Date)return e.getTime();if("number"==typeof e){const t=(await import("xlsx")).SSF.parse_date_code(e);return t?new Date(t.y,t.m-1,t.d,t.H,t.M,t.S).getTime():void 0}return""===e?null:_({locale:n,format:i},e).getTime()}if("esriFieldTypeTimeOnly"===t.type){if(e instanceof b)return e.toString();if(e instanceof Date)return new b(e).toString();if("number"==typeof e){const t=(await import("xlsx")).SSF.parse_date_code(e);return t?new b(`${t.H.toString().padStart(2,"0")}:${t.M.toString().padStart(2,"0")}:${t.S.toString().padStart(2,"0")}`).toString():void 0}return""===e?null:H({locale:n,format:s},e).toString()}const c=e?.toString()??"";if(o&&c.startsWith("\t"))for(const e of we)if(c.length>1&&c.charAt(1)===e)return c.substring(1);return c}function et(e){switch(e){case P.DATE_SHORT:return"dd/MM/yyyy";case P.DATE_LONG:return"MMMM d, yyyy";case P.TIME_SHORT:return"h:mm AM/PM";case P.TIME_LONG:return"h:mm:ss AM/PM";case P.DATE_TIME_SHORT:case P.DEFAULT:return"MMM d yyyy h:mm AM/PM";case P.DATE_TIME_LONG:return"MMMM d yyyy h:mm AM/PM";case P.FULL:return"dddd, MMMM d yyyy h:mm AM/PM";case P.ISO_8601:case P.ROUND_TRIP:return'yyyy-MM-dd"T"HH:mm:ss';default:{const t=e.replace(/tt/g,"AM/PM");return t.includes("z")&&be().warn("Warning: Excel will not recognize timezone format 'z', 'zz', or 'zzz'"),t.includes("h")&&!t.includes("AM/PM")&&be().warn("Warning: Excel will interpret 'h' as 'H' if the format does not have an AM/PM designator"),t}}}function tt(e){switch(e){case P.DATE_SHORT:return"dd/MM/yyyy";case P.DATE_LONG:return"MMMM d, yyyy";case P.DATE_TIME_SHORT:case P.DEFAULT:return"MMM d yyyy";case P.DATE_TIME_LONG:return"MMMM d yyyy";case P.FULL:return"dddd, MMMM d yyyy";case P.ISO_8601:case P.ROUND_TRIP:return"yyyy-MM-dd";default:return e.replace(/TtZzHhmSsUua/g,"")}}function rt(e){switch(e){case U.TIME_SHORT:return"h:mm AM/PM";case U.TIME_LONG:return"h:mm:ss AM/PM";case U.ISO_8601:case U.ROUND_TRIP:return"HH:mm:ss";default:{const t=e.replace(/tt/g,"AM/PM");return t.includes("h")&&!t.includes("AM/PM")&&be().warn("Warning: Excel will interpret 'h' as 'H' if the format does not have an AM/PM designator"),t}}}function ot(e){switch(e){case j.ACCOUNTING:return'_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)';case j.CURRENCY:return'"$"#,##0.00';case j.FIXED_POINT:case j.DEFAULT:return"0.0000";case j.NUMBER:return"#,##0.0000";case j.PERCENT:return"0%";case j.ROUND_TRIP:return"0.00000";default:return e}}function nt(e,t){if(null==e)return"";if(!t.useFormattedValues){if("number"==typeof e)return e;if(e instanceof Date)return"timestamp"===t.dateFormat?e.getTime():e;if(e instanceof b)return e.toDate()}let r=e.toString();return t.escapeFormulaChars&&(r=Be(r)),r}function at(e,t){return 3===e.length&&!t.hasZ&&t.hasM?[e[0],e[1],void 0,e[2]]:e}function it(e,t){return e.map((e=>at(e,t)))}function st(e,t){return e.map((e=>it(e,t)))}function ct(e,t,r){switch(t){case xe.NUMBER:return e instanceof Date?e.getTime():$(e);case xe.STRING:return e instanceof Date?C({format:r.dateFormat??P.ROUND_TRIP,timeZone:"UTC",isDateOnly:r.isDateOnly},e):e instanceof b?k({format:r.timeFormat??U.ROUND_TRIP},e):"number"==typeof e?B(r.numberFormat??j.DEFAULT,e):e.toString();case xe.BOOLEAN:return!!e;case xe.DATE:return _(e);default:return e.toString()}}function lt(e,t){return JSON.stringify(e.toJSON())===JSON.stringify(t.toJSON())}function mt(e){return 1===e.length?new l({symbol:e[0]}):new m({field:"SymbolID",uniqueValueInfos:[...e.map(((e,t)=>new u({label:t.toString(),symbol:e,value:t})))]})}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { Feature } from "../Feature";
|
|
2
|
+
export declare const GPX_NS = "http://www.topografix.com/GPX/1/1";
|
|
3
|
+
export declare const V_NS = "http://vertigis.com/gpx";
|
|
4
|
+
/**
|
|
5
|
+
* Optional properties for a GPX feature.
|
|
6
|
+
*/
|
|
7
|
+
export interface GpxFeatureOptions {
|
|
8
|
+
/**
|
|
9
|
+
* The name of the feature.
|
|
10
|
+
*/
|
|
11
|
+
name?: string;
|
|
12
|
+
/**
|
|
13
|
+
* The description of the feature.
|
|
14
|
+
*/
|
|
15
|
+
desc?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Creation/modification timestamp for element (ISO 8601 UTC format).
|
|
18
|
+
*/
|
|
19
|
+
time?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Custom extensions for the GPX feature.
|
|
22
|
+
*/
|
|
23
|
+
extensions?: Element[];
|
|
24
|
+
/**
|
|
25
|
+
* Unique identifier for the feature.
|
|
26
|
+
*/
|
|
27
|
+
id?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Creates a new GPX XML document.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createGpxDocument(): Document;
|
|
33
|
+
/**
|
|
34
|
+
* Serializes a GPX document to an XML string.
|
|
35
|
+
*
|
|
36
|
+
* @param doc The GPX document to serialize.
|
|
37
|
+
*/
|
|
38
|
+
export declare function serializeGpxDocument(doc: Document): string;
|
|
39
|
+
/**
|
|
40
|
+
* Appends GPX feature options as child elements to a parent element.
|
|
41
|
+
*
|
|
42
|
+
* @param doc The parent Document.
|
|
43
|
+
* @param parent The Element to append the options to.
|
|
44
|
+
* @param options The GPX feature options to append.
|
|
45
|
+
*/
|
|
46
|
+
export declare function appendOptionsToElement(doc: Document, parent: Element, options: GpxFeatureOptions): void;
|
|
47
|
+
/**
|
|
48
|
+
* Builds a GPX waypoint (<wpt>) XML Element.
|
|
49
|
+
*
|
|
50
|
+
* @param doc The parent Document.
|
|
51
|
+
* @param lat The latitude of the waypoint.
|
|
52
|
+
* @param lon The longitude of the waypoint.
|
|
53
|
+
* @param ele The optional elevation of the waypoint.
|
|
54
|
+
* @param options Optional GPX feature properties.
|
|
55
|
+
* @returns The XML Element representing the GPX waypoint.
|
|
56
|
+
*/
|
|
57
|
+
export declare function buildGpxWaypoint(doc: Document, lat: number, lon: number, ele?: number, options?: GpxFeatureOptions): Element;
|
|
58
|
+
/**
|
|
59
|
+
* Builds a GPX track point (<trkpt>) XML Element.
|
|
60
|
+
*
|
|
61
|
+
* @param doc The parent Document.
|
|
62
|
+
* @param lat The latitude of the track point.
|
|
63
|
+
* @param lon The longitude of the track point.
|
|
64
|
+
* @param ele The optional elevation of the track point.
|
|
65
|
+
* @returns The XML Element representing the GPX track point.
|
|
66
|
+
*/
|
|
67
|
+
export declare function buildGpxTrackPoint(doc: Document, lat: number, lon: number, ele?: number): Element;
|
|
68
|
+
/**
|
|
69
|
+
* Builds a GPX track (<trk>) XML Element containing track segments.
|
|
70
|
+
*
|
|
71
|
+
* @param doc The parent Document.
|
|
72
|
+
* @param trkpts The XML Elements containing all track points.
|
|
73
|
+
* @param options Optional GPX feature properties.
|
|
74
|
+
* @returns The XML Element representing the GPX track.
|
|
75
|
+
*/
|
|
76
|
+
export declare function buildGpxTrack(doc: Document, trkpts: Element[], options?: GpxFeatureOptions): Element;
|
|
77
|
+
/**
|
|
78
|
+
* Gets the cleaned name for a GPX track from a feature's title.
|
|
79
|
+
*
|
|
80
|
+
* @param feature The feature to extract the name from.
|
|
81
|
+
* @returns The cleaned track name, or undefined if not present.
|
|
82
|
+
*/
|
|
83
|
+
export declare function getGpxTrackName(feature: Feature): string | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* Gets the identifier for a GPX track from a feature's objectid or fid
|
|
86
|
+
* attribute.
|
|
87
|
+
*
|
|
88
|
+
* @param feature The feature to extract the identifier from.
|
|
89
|
+
* @returns The track identifier, or undefined if not present.
|
|
90
|
+
*/
|
|
91
|
+
export declare function getGpxTrackId(feature: Feature): string | undefined;
|
|
92
|
+
/**
|
|
93
|
+
* Gets the cleaned description for a GPX track from a feature's description.
|
|
94
|
+
*
|
|
95
|
+
* @param feature The feature to extract the description from.
|
|
96
|
+
* @returns The cleaned track description, or undefined if not present.
|
|
97
|
+
*/
|
|
98
|
+
export declare function getGpxTrackDescription(feature: Feature): string | undefined;
|
|
99
|
+
/**
|
|
100
|
+
* Gets the formatted time for a GPX track from a feature's attributes.
|
|
101
|
+
*
|
|
102
|
+
* @param feature The feature to extract the time from.
|
|
103
|
+
* @returns The formatted time string, or undefined if not present.
|
|
104
|
+
*/
|
|
105
|
+
export declare function getGpxTrackTime(feature: Feature): string | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* Gets the custom GPX extensions from a feature's attributes.
|
|
108
|
+
*
|
|
109
|
+
* @param doc The parent Document.
|
|
110
|
+
* @param feature The feature to extract the extensions from.
|
|
111
|
+
* @returns An array of XML Elements representing the GPX extensions, or
|
|
112
|
+
* undefined if not present.
|
|
113
|
+
*/
|
|
114
|
+
export declare function getGpxExtensions(doc: Document, feature: Feature): Element[] | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{parse as t}from"../../utilities/format/date.js";export const GPX_NS="http://www.topografix.com/GPX/1/1";export const V_NS="http://vertigis.com/gpx";export function createGpxDocument(){const t=document.implementation.createDocument(GPX_NS,"gpx",void 0),e=t.documentElement;return e.setAttribute("version","1.1"),e.setAttribute("creator","VertiGIS"),e.setAttribute("xmlns:v",V_NS),t}export function serializeGpxDocument(t){return`<?xml version="1.0" encoding="UTF-8"?>\n${(new XMLSerializer).serializeToString(t)}`}export function appendOptionsToElement(t,e,n){const{name:o,desc:i,time:r,extensions:c,id:s}=n;if(o){const n=t.createElementNS(GPX_NS,"name");n.textContent=void 0===s?o:`${o}_${s}`,e.appendChild(n)}if(i){const n=t.createElementNS(GPX_NS,"desc");n.textContent=i,e.appendChild(n)}if(r){const n=t.createElementNS(GPX_NS,"time");n.textContent=r,e.appendChild(n)}if(c&&c.length>0){const n=t.createElementNS(GPX_NS,"extensions");for(const t of c)n.appendChild(t);e.appendChild(n)}}export function buildGpxWaypoint(t,e,n,o,i={}){const r=t.createElementNS(GPX_NS,"wpt");if(r.setAttribute("lat",e.toString()),r.setAttribute("lon",n.toString()),void 0!==o){const e=t.createElementNS(GPX_NS,"ele");e.textContent=o.toString(),r.appendChild(e)}return appendOptionsToElement(t,r,i),r}export function buildGpxTrackPoint(t,e,n,o){const i=t.createElementNS(GPX_NS,"trkpt");if(i.setAttribute("lat",e.toString()),i.setAttribute("lon",n.toString()),void 0!==o){const e=t.createElementNS(GPX_NS,"ele");e.textContent=o.toString(),i.appendChild(e)}return i}export function buildGpxTrack(t,e,n={}){const o=t.createElementNS(GPX_NS,"trk");appendOptionsToElement(t,o,n);const i=t.createElementNS(GPX_NS,"trkseg");for(const t of e)i.appendChild(t);return o.appendChild(i),o}export function getGpxTrackName(t){const e=t.title??t.source?.title??void 0;if(!e)return;return e.toString()}export function getGpxTrackId(t){const e=t.attributes.get("objectid")??t.attributes.get("fid");if(null!=e)return String(e)}export function getGpxTrackDescription(t){const e=t.description??t.title;if(!e)return;return e.toString()}export function getGpxTrackTime(e){const{attributes:n,schema:o}=e;if(!n||!o)return;const i=["date","timestamp-offset","date-only"];for(const e of o.fields)if(i.includes(e.type)){const i=n.get(e.name);if(null!=i){const n="date"===e.type?{timeZone:o.timeZone}:{},r=t(n,i);if(r instanceof Date&&!isNaN(r.getTime()))return r.toISOString()}}for(const[e,o]of n.entries())if(e.toLowerCase().includes("date")&&null!=o){const e=t({},o);if(e instanceof Date&&!isNaN(e.getTime()))return e.toISOString()}}export function getGpxExtensions(t,e){const{attributes:n}=e;if(!n)return;const o=[];for(const[e,i]of n.entries()){if(null==i)continue;const n=e.replace(/[^a-zA-Z0-9_]/g,"_"),r=String(i),c=t.createElementNS(V_NS,`v:${n}`);c.textContent=r,o.push(c)}return o.length>0?o:void 0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
window.navigationData = "data:application/octet-stream;base64,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"
|
|
1
|
+
window.navigationData = "data:application/octet-stream;base64,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"
|