@vertigis/arcgis-extensions 53.11.0 → 53.12.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.
Files changed (28) hide show
  1. package/data/convert.d.ts +6 -0
  2. package/data/convert.js +1 -1
  3. package/data/support/_gpxExport.d.ts +114 -0
  4. package/data/support/_gpxExport.js +1 -0
  5. package/docs/html/assets/navigation.js +1 -1
  6. package/docs/html/assets/search.js +1 -1
  7. package/docs/html/functions/data_convert.toGpx.html +3 -0
  8. package/docs/html/functions/data_support__gpxExport.appendOptionsToElement.html +5 -0
  9. package/docs/html/functions/data_support__gpxExport.buildGpxTrack.html +6 -0
  10. package/docs/html/functions/data_support__gpxExport.buildGpxTrackPoint.html +7 -0
  11. package/docs/html/functions/data_support__gpxExport.buildGpxWaypoint.html +8 -0
  12. package/docs/html/functions/data_support__gpxExport.createGpxDocument.html +2 -0
  13. package/docs/html/functions/data_support__gpxExport.getGpxExtensions.html +6 -0
  14. package/docs/html/functions/data_support__gpxExport.getGpxTrackDescription.html +4 -0
  15. package/docs/html/functions/data_support__gpxExport.getGpxTrackId.html +5 -0
  16. package/docs/html/functions/data_support__gpxExport.getGpxTrackName.html +4 -0
  17. package/docs/html/functions/data_support__gpxExport.getGpxTrackTime.html +4 -0
  18. package/docs/html/functions/data_support__gpxExport.serializeGpxDocument.html +3 -0
  19. package/docs/html/interfaces/data_support__gpxExport.GpxFeatureOptions.html +12 -0
  20. package/docs/html/modules/data_convert.html +1 -0
  21. package/docs/html/modules/data_support__gpxExport.html +15 -0
  22. package/docs/html/modules.html +1 -0
  23. package/docs/html/variables/data_support__gpxExport.GPX_NS.html +1 -0
  24. package/docs/html/variables/data_support__gpxExport.V_NS.html +1 -0
  25. package/docs/html/variables/version.version.html +1 -1
  26. package/package.json +1 -1
  27. package/version.d.ts +1 -1
  28. package/version.js +1 -1
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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"