@vertigis/arcgis-extensions 53.17.1 → 53.18.1
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/convert.d.ts +2 -2
- package/data/convert.js +1 -1
- package/data/support/_fgdbConverter.d.ts +62 -0
- package/data/support/_fgdbConverter.js +1 -1
- package/docs/html/assets/navigation.js +1 -1
- package/docs/html/assets/search.js +1 -1
- package/docs/html/functions/data_support__fgdbConverter.getAnnotationLabelingInfo.html +7 -0
- package/docs/html/functions/data_support__fgdbConverter.getAnnotationTextField.html +7 -0
- package/docs/html/functions/data_support__fgdbConverter.getDefaultLabelPlacement.html +4 -0
- package/docs/html/functions/data_support__fgdbConverter.getLayerDrawPriority.html +8 -0
- package/docs/html/interfaces/data_support__fgdbConverter.DynamicLayerMetadataResponse.html +9 -3
- package/docs/html/modules/data_convert.html +3 -2
- package/docs/html/modules/data_support__fgdbConverter.html +4 -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/convert.d.ts
CHANGED
|
@@ -10,8 +10,9 @@ import type { GeometryType } from "../support/esri.js";
|
|
|
10
10
|
import { DateFormat, NumberFormat, TimeFormat } from "../utilities/format/formats.js";
|
|
11
11
|
import { FeatureSet } from "./FeatureSet.js";
|
|
12
12
|
import type { IDxfJsonComponentContext } from "./support/_dxfInterfaces.js";
|
|
13
|
-
import {
|
|
13
|
+
import type { GeoProcessedFgdbData } from "./support/_fgdbConverter.js";
|
|
14
14
|
import type { GeoProcessedLpkxData } from "./support/lpkxInterfaces.js";
|
|
15
|
+
export type { GeoProcessedFgdbData } from "./support/_fgdbConverter.js";
|
|
15
16
|
/**
|
|
16
17
|
* A union of simple fill, line, and marker symbols.
|
|
17
18
|
*/
|
|
@@ -494,4 +495,3 @@ export declare function shapefileToFeatureSet(shapefileData: Blob, options?: Fro
|
|
|
494
495
|
* @param geometryType The geometry type used to return the appropriate symbol.
|
|
495
496
|
*/
|
|
496
497
|
export declare function getDefaultSymbol(colorIndex: number, geometryType: GeometryType): SimpleSymbol | MeshSymbol3D | undefined;
|
|
497
|
-
export {};
|
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 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 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 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{}from"./support/_fgdbConverter.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";const de=["=","-","+","@"],ge='"',we="\r\n",he="\n",Fe=[...C.map(Ve),"M/d/yy"],Se=[...z.map(et).map((e=>e.replace("AM/PM","tt")))],Ne=/(\w+)_(point|multipoint|polyline|polygon)z?/;var Te;function Oe(){return V("geocortex.api.data.convert")}!function(e){e.DATE="D",e.NUMBER="N",e.STRING="C",e.BOOLEAN="L"}(Te||(Te={}));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 xe=[[GeometryFormat.ARCGIS_JSON,He],[GeometryFormat.GEO_JSON,ke],[GeometryFormat.WKT,ze]],be=new Map(xe);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=>We(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],He);case GeometryFormat.GEO_JSON:return f(e[0],ke);case GeometryFormat.WKT:return f(e[0],ze);default:return M(t,new Error(`Unknown geometry format "${t}".`))}};if(n){const e=Je(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 qe(t,c,o);if(y===GeometryFormat.NONE)return{columnIndices:[]};return d.length>1?u(d,y):f(d[0],be.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=Ze(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 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 Le(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:Ge(e.source),rowDelimiter:navigator.platform?.startsWith("Win")?we:"\n"},...t},{includeByteOrderMark:n,includeHeaderRow:i,delimiter:s,outFields:c,rowDelimiter:l}=o,m=[];n&&m.push("\ufeff");const u=Ae(r,o),f=Ie(r,c,e.schema,!0),p=Ie(r,c,e.schema,!1);if(i){const e=[];for(const t of u)e.push(Ce(t,o));for(const t of f)e.push(Ce(t,o));for(const t of p)e.push(Ce(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=Pe(e,t,r),n=e.schema.findFieldByName(t)?.type;return Ce(ve(o,{...r,isDateOnly:"date-only"===n}),r)};t.push(...await async function(e,t){let r=await _e(e,t);t.geometryFormat!==GeometryFormat.XYZ&&t.geometryFormat!==GeometryFormat.XY&&t.geometryFormat!==GeometryFormat.LAT_LON||(r=r.map((e=>void 0===e?"":ve(e,t))));return r.map((e=>""===e?"":Ce(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===we?"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=Me(t),n=o.rowDelimiter||function(e){let t=he;return Be(e,we,((r,o)=>(0===r&&o===e.length||(t=we),!1))),t}(r),a=o.delimiter??function(e,t,r){const o=",";if(0===e.length)return o;const n=[];if(Be(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;Be(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 Be(e,r,((r,n)=>{const a=e.substring(r,n);return o.push({raw:$e(a,t,o.length)}),!0})),o};if(Be(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 qe(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=Me(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 Le(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(", ");Oe().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:Ge(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=Ae(r,o),u=Ie(r,n,e.schema,!0),f=Ie(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 _e(e.geometry,o));for(const r of u){const n=rt(e.attributes.get(r),o);t.push(n)}for(const a of f){const i=Pe(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=rt(i,o);t.push(s)}if(!t.every((e=>"string"!=typeof e||e.length<=32767)))return void Oe().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=et(c??U.ROUND_TRIP):n.has(e)?t.z=Qe(s??P.ROUND_TRIP):t.z=Ve(s??P.ROUND_TRIP):"n"===t.t&&(t.z=tt(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=Ee(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 qe(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=Ee(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:Ge(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=Ie(n,s,e.schema,!0);let w=Ie(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=>Le(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]:Te.STRING})))):function(e,t,r,o){const n={};for(const a of t){if(e.some((e=>je(e,a)))){n[a]=Te.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]=Te.NUMBER;break;case"date":case"timestamp-offset":n[a]=o?Te.NUMBER:Te.DATE;break;default:n[a]=Te.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?Te.NUMBER:Te.DATE:e.every((e=>"number"==typeof i(e,a)||void 0===i(e,a)))&&e.some((e=>"number"==typeof i(e,a)))?n[a]=Te.NUMBER:e.every((e=>"boolean"==typeof i(e,a)||void 0===i(e,a)))&&e.some((e=>"boolean"==typeof i(e,a)))?n[a]=Te.BOOLEAN:n[a]=Te.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),ot(a,e)}if(R(e))return nt(e.points,e);if(A(e))return at(e.paths,e);if(I(e))return at(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=Pe(a,n,o);if(null==t&&(t=""),o.useFormattedValues)t=t.toString();else{t=it(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(st(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:ct(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:ct(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{createLpkxLayer:n}=await import("./support/_lpkxConverter.js"),a=n(o,e,r);return[new O({layer:a})]}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{createFgdbLayer:n}=await import("./support/_fgdbConverter.js"),a=await n(o,e,r);return[new O({layer:a})]}export async function shapefileToUploadData(e,t){D("shapefileData",e).isNotMissing();const o=Re(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(Ne);return r?(t=r[1],e.filter((e=>{const r=e.match(Ne);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=Re(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 De(e){return{escapeFormulaChars:!0,outFields:["*"],generatePrimaryKey:!1,locale:S,detectOid:!e?.primaryKeyField}}function Me(e){return{...{includeHeaderRow:!0,inSpatialReference:a.WGS84,...De(e)},...e}}function Ee(e){return{...{includeHeaderRow:!0,inSpatialReference:a.WGS84,...De(e)},...e}}function Re(e){return{...{...De(e)},...e}}function Ae(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 Ie(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 Ge(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 _e(e,t){const r=await Le(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 Le(e,t){return e?.spatialReference&&!e.spatialReference.equals(t)&&t?(await J([e],t))[0]:e}function Ce(e,t){const r=[t.delimiter,ge,"\r","\n",t.rowDelimiter];if(t.alwaysQuote||r.some((t=>e.includes(t)))){const t=e.replace(new RegExp(ge,"g"),`${ge}${ge}`);return`${ge}${t}${ge}`}return e}function ve(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 b)return k({format:t.timeFormat},e)}let r=e.toString();return t.escapeFormulaChars&&(r=Ue(r)),r}function Pe(e,t,r){if(r.useFormattedValues||je(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 je(e,t){return!!te(t,e.schema.typeIdField)||("coded-value"===e.type?.domains?.[t]?.type||"coded-value"===e.schema.findFieldByName(t)?.domain?.type)}function Ue(e){for(const t of de)if(e.startsWith(t))return`\t${e}`;return e}function $e(e,t,r){const o=e.startsWith(ge),n=e.endsWith(ge);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 Be(a,ge,((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(`${ge}${ge}`,"g"),ge)}function Be(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(ge)?(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 He(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 ke(e,t){const r=await K(JSON.parse(e));return r.spatialReference=t,r}async function ze(e,t){const r=await W(e);return r.spatialReference=t,r}function Je(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 Xe(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 We(e,t,r){return"inv"===t?"string"==typeof e?parseFloat(e.replaceAll(",","")):e:$({locale:t,format:r},e)}async function qe(e,t,r){const o=r?e.slice(1):e;if(r){const r=Je(e[0],GeometryFormat.ARCGIS_JSON);if(void 0!==r)for(const[e,n]of xe){try{await Ye(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=Je(e[0],t);if(void 0!==r)return[t,r]}}for(const[e,r]of xe){const n=await Xe(o[0],r);if(void 0!==n){try{await Ye(n,r,t,o)}catch{continue}return[e,[n]]}}return[GeometryFormat.NONE,[]]}async function Ye(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 Ze(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||C,r.raw)!==v),s&&(s=_(f||Fe,r.formatted)!==v),i&&(i=r.raw instanceof b||H(p||z,r.raw).isValid),c&&(c=H({format:p||Se,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 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?We(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 de)if(c.length>1&&c.charAt(1)===e)return c.substring(1);return c}function Ve(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")&&Oe().warn("Warning: Excel will not recognize timezone format 'z', 'zz', or 'zzz'"),t.includes("h")&&!t.includes("AM/PM")&&Oe().warn("Warning: Excel will interpret 'h' as 'H' if the format does not have an AM/PM designator"),t}}}function Qe(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 et(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")&&Oe().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 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 rt(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=Ue(r)),r}function ot(e,t){return 3===e.length&&!t.hasZ&&t.hasM?[e[0],e[1],void 0,e[2]]:e}function nt(e,t){return e.map((e=>ot(e,t)))}function at(e,t){return e.map((e=>nt(e,t)))}function it(e,t,r){switch(t){case Te.NUMBER:return e instanceof Date?e.getTime():$(e);case Te.STRING:return e instanceof Date?L({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 Te.BOOLEAN:return!!e;case Te.DATE:return _(e);default:return e.toString()}}function st(e,t){return JSON.stringify(e.toJSON())===JSON.stringify(t.toJSON())}function ct(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 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 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";const de=["=","-","+","@"],ge='"',we="\r\n",he="\n",Fe=[...C.map(Ve),"M/d/yy"],Se=[...z.map(et).map((e=>e.replace("AM/PM","tt")))],Ne=/(\w+)_(point|multipoint|polyline|polygon)z?/;var Te;function Oe(){return V("geocortex.api.data.convert")}!function(e){e.DATE="D",e.NUMBER="N",e.STRING="C",e.BOOLEAN="L"}(Te||(Te={}));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 xe=[[GeometryFormat.ARCGIS_JSON,He],[GeometryFormat.GEO_JSON,ke],[GeometryFormat.WKT,ze]],be=new Map(xe);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=>We(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],He);case GeometryFormat.GEO_JSON:return f(e[0],ke);case GeometryFormat.WKT:return f(e[0],ze);default:return M(t,new Error(`Unknown geometry format "${t}".`))}};if(n){const e=Je(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 qe(t,c,o);if(y===GeometryFormat.NONE)return{columnIndices:[]};return d.length>1?u(d,y):f(d[0],be.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=Ze(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 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 Le(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:Ge(e.source),rowDelimiter:navigator.platform?.startsWith("Win")?we:"\n"},...t},{includeByteOrderMark:n,includeHeaderRow:i,delimiter:s,outFields:c,rowDelimiter:l}=o,m=[];n&&m.push("\ufeff");const u=Ae(r,o),f=Ie(r,c,e.schema,!0),p=Ie(r,c,e.schema,!1);if(i){const e=[];for(const t of u)e.push(Ce(t,o));for(const t of f)e.push(Ce(t,o));for(const t of p)e.push(Ce(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=Pe(e,t,r),n=e.schema.findFieldByName(t)?.type;return Ce(ve(o,{...r,isDateOnly:"date-only"===n}),r)};t.push(...await async function(e,t){let r=await _e(e,t);t.geometryFormat!==GeometryFormat.XYZ&&t.geometryFormat!==GeometryFormat.XY&&t.geometryFormat!==GeometryFormat.LAT_LON||(r=r.map((e=>void 0===e?"":ve(e,t))));return r.map((e=>""===e?"":Ce(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===we?"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=Me(t),n=o.rowDelimiter||function(e){let t=he;return Be(e,we,((r,o)=>(0===r&&o===e.length||(t=we),!1))),t}(r),a=o.delimiter??function(e,t,r){const o=",";if(0===e.length)return o;const n=[];if(Be(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;Be(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 Be(e,r,((r,n)=>{const a=e.substring(r,n);return o.push({raw:$e(a,t,o.length)}),!0})),o};if(Be(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 qe(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=Me(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 Le(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(", ");Oe().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:Ge(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=Ae(r,o),u=Ie(r,n,e.schema,!0),f=Ie(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 _e(e.geometry,o));for(const r of u){const n=rt(e.attributes.get(r),o);t.push(n)}for(const a of f){const i=Pe(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=rt(i,o);t.push(s)}if(!t.every((e=>"string"!=typeof e||e.length<=32767)))return void Oe().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=et(c??U.ROUND_TRIP):n.has(e)?t.z=Qe(s??P.ROUND_TRIP):t.z=Ve(s??P.ROUND_TRIP):"n"===t.t&&(t.z=tt(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=Ee(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 qe(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=Ee(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:Ge(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=Ie(n,s,e.schema,!0);let w=Ie(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=>Le(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]:Te.STRING})))):function(e,t,r,o){const n={};for(const a of t){if(e.some((e=>je(e,a)))){n[a]=Te.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]=Te.NUMBER;break;case"date":case"timestamp-offset":n[a]=o?Te.NUMBER:Te.DATE;break;default:n[a]=Te.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?Te.NUMBER:Te.DATE:e.every((e=>"number"==typeof i(e,a)||void 0===i(e,a)))&&e.some((e=>"number"==typeof i(e,a)))?n[a]=Te.NUMBER:e.every((e=>"boolean"==typeof i(e,a)||void 0===i(e,a)))&&e.some((e=>"boolean"==typeof i(e,a)))?n[a]=Te.BOOLEAN:n[a]=Te.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),ot(a,e)}if(R(e))return nt(e.points,e);if(A(e))return at(e.paths,e);if(I(e))return at(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=Pe(a,n,o);if(null==t&&(t=""),o.useFormattedValues)t=t.toString();else{t=it(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(st(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:ct(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:ct(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{createLpkxLayer:n}=await import("./support/_lpkxConverter.js"),a=n(o,e,r);return[new O({layer:a})]}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{createFgdbLayer:n}=await import("./support/_fgdbConverter.js"),a=await n(o,e,r);return[new O({layer:a})]}export async function shapefileToUploadData(e,t){D("shapefileData",e).isNotMissing();const o=Re(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(Ne);return r?(t=r[1],e.filter((e=>{const r=e.match(Ne);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=Re(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 De(e){return{escapeFormulaChars:!0,outFields:["*"],generatePrimaryKey:!1,locale:S,detectOid:!e?.primaryKeyField}}function Me(e){return{...{includeHeaderRow:!0,inSpatialReference:a.WGS84,...De(e)},...e}}function Ee(e){return{...{includeHeaderRow:!0,inSpatialReference:a.WGS84,...De(e)},...e}}function Re(e){return{...{...De(e)},...e}}function Ae(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 Ie(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 Ge(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 _e(e,t){const r=await Le(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 Le(e,t){return e?.spatialReference&&!e.spatialReference.equals(t)&&t?(await J([e],t))[0]:e}function Ce(e,t){const r=[t.delimiter,ge,"\r","\n",t.rowDelimiter];if(t.alwaysQuote||r.some((t=>e.includes(t)))){const t=e.replace(new RegExp(ge,"g"),`${ge}${ge}`);return`${ge}${t}${ge}`}return e}function ve(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 b)return k({format:t.timeFormat},e)}let r=e.toString();return t.escapeFormulaChars&&(r=Ue(r)),r}function Pe(e,t,r){if(r.useFormattedValues||je(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 je(e,t){return!!te(t,e.schema.typeIdField)||("coded-value"===e.type?.domains?.[t]?.type||"coded-value"===e.schema.findFieldByName(t)?.domain?.type)}function Ue(e){for(const t of de)if(e.startsWith(t))return`\t${e}`;return e}function $e(e,t,r){const o=e.startsWith(ge),n=e.endsWith(ge);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 Be(a,ge,((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(`${ge}${ge}`,"g"),ge)}function Be(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(ge)?(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 He(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 ke(e,t){const r=await K(JSON.parse(e));return r.spatialReference=t,r}async function ze(e,t){const r=await W(e);return r.spatialReference=t,r}function Je(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 Xe(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 We(e,t,r){return"inv"===t?"string"==typeof e?parseFloat(e.replaceAll(",","")):e:$({locale:t,format:r},e)}async function qe(e,t,r){const o=r?e.slice(1):e;if(r){const r=Je(e[0],GeometryFormat.ARCGIS_JSON);if(void 0!==r)for(const[e,n]of xe){try{await Ye(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=Je(e[0],t);if(void 0!==r)return[t,r]}}for(const[e,r]of xe){const n=await Xe(o[0],r);if(void 0!==n){try{await Ye(n,r,t,o)}catch{continue}return[e,[n]]}}return[GeometryFormat.NONE,[]]}async function Ye(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 Ze(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||C,r.raw)!==v),s&&(s=_(f||Fe,r.formatted)!==v),i&&(i=r.raw instanceof b||H(p||z,r.raw).isValid),c&&(c=H({format:p||Se,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 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?We(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 de)if(c.length>1&&c.charAt(1)===e)return c.substring(1);return c}function Ve(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")&&Oe().warn("Warning: Excel will not recognize timezone format 'z', 'zz', or 'zzz'"),t.includes("h")&&!t.includes("AM/PM")&&Oe().warn("Warning: Excel will interpret 'h' as 'H' if the format does not have an AM/PM designator"),t}}}function Qe(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 et(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")&&Oe().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 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 rt(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=Ue(r)),r}function ot(e,t){return 3===e.length&&!t.hasZ&&t.hasM?[e[0],e[1],void 0,e[2]]:e}function nt(e,t){return e.map((e=>ot(e,t)))}function at(e,t){return e.map((e=>nt(e,t)))}function it(e,t,r){switch(t){case Te.NUMBER:return e instanceof Date?e.getTime():$(e);case Te.STRING:return e instanceof Date?L({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 Te.BOOLEAN:return!!e;case Te.DATE:return _(e);default:return e.toString()}}function st(e,t){return JSON.stringify(e.toJSON())===JSON.stringify(t.toJSON())}function ct(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,4 +1,5 @@
|
|
|
1
1
|
import MapImageLayer from "@arcgis/core/layers/MapImageLayer";
|
|
2
|
+
import type { LabelClassProperties } from "@arcgis/core/layers/support/LabelClass.js";
|
|
2
3
|
import { type GeometryJsonType } from "../../json/GeometryJson.js";
|
|
3
4
|
import type { GeometryType } from "../../support/esri.js";
|
|
4
5
|
/**
|
|
@@ -9,6 +10,22 @@ export interface DynamicLayerMetadataResponse {
|
|
|
9
10
|
* The geometry type of the layer.
|
|
10
11
|
*/
|
|
11
12
|
geometryType: GeometryJsonType;
|
|
13
|
+
/**
|
|
14
|
+
* The drawing information of the layer.
|
|
15
|
+
*/
|
|
16
|
+
drawingInfo?: {
|
|
17
|
+
labelingInfo?: LabelClassProperties[];
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* The display field of the layer.
|
|
21
|
+
*/
|
|
22
|
+
displayField?: string;
|
|
23
|
+
/**
|
|
24
|
+
* The list of fields available on the layer.
|
|
25
|
+
*/
|
|
26
|
+
fields?: {
|
|
27
|
+
name: string;
|
|
28
|
+
}[];
|
|
12
29
|
}
|
|
13
30
|
/**
|
|
14
31
|
* Data structure holding results from the FGDB geoprocessing task.
|
|
@@ -59,3 +76,48 @@ export declare function extractLayerTitle(featureClassName: string): string;
|
|
|
59
76
|
* @returns The draw priority, where a higher number is drawn on top.
|
|
60
77
|
*/
|
|
61
78
|
export declare function getGeometryDrawPriority(geometryType: GeometryType | undefined): number;
|
|
79
|
+
/**
|
|
80
|
+
* Determines the field name to use for annotation text. Preferentially uses the
|
|
81
|
+
* "TextString" field if available, then the display field, then defaults to
|
|
82
|
+
* "TextString".
|
|
83
|
+
*
|
|
84
|
+
* @param fields The list of fields available on the layer.
|
|
85
|
+
* @param displayField The display field for the layer.
|
|
86
|
+
* @returns The field name to use for text.
|
|
87
|
+
*/
|
|
88
|
+
export declare function getAnnotationTextField(fields: {
|
|
89
|
+
name: string;
|
|
90
|
+
}[] | undefined, displayField: string | undefined): string;
|
|
91
|
+
/**
|
|
92
|
+
* Gets or generates labeling info specifically tailored for annotation layers.
|
|
93
|
+
*
|
|
94
|
+
* @param labelingInfo Existing labeling info, if provided.
|
|
95
|
+
* @param fields The list of fields on the layer.
|
|
96
|
+
* @param displayField The display field of the layer.
|
|
97
|
+
* @param geometryType The geometry type of the layer.
|
|
98
|
+
* @returns An array of label class properties to be used for annotations.
|
|
99
|
+
*/
|
|
100
|
+
export declare function getAnnotationLabelingInfo(labelingInfo: LabelClassProperties[] | undefined, fields: {
|
|
101
|
+
name: string;
|
|
102
|
+
}[] | undefined, displayField: string | undefined, geometryType: GeometryType | undefined): LabelClassProperties[];
|
|
103
|
+
/**
|
|
104
|
+
* Determines the overall draw priority for a layer, considering if it is an
|
|
105
|
+
* annotation layer.
|
|
106
|
+
*
|
|
107
|
+
* @param layer An object containing the layer's geometry type and a boolean
|
|
108
|
+
* flag indicating if it's an annotation.
|
|
109
|
+
* @param layer.geometryType The geometry type of the layer.
|
|
110
|
+
* @param layer.isAnnotation Whether the layer is an annotation layer.
|
|
111
|
+
* @returns The draw priority number.
|
|
112
|
+
*/
|
|
113
|
+
export declare function getLayerDrawPriority(layer: {
|
|
114
|
+
geometryType: GeometryType | undefined;
|
|
115
|
+
isAnnotation: boolean;
|
|
116
|
+
}): number;
|
|
117
|
+
/**
|
|
118
|
+
* Maps a given geometry type to a default label placement string.
|
|
119
|
+
*
|
|
120
|
+
* @param geometryType The geometry type of the feature.
|
|
121
|
+
* @returns A suitable label placement strategy for the geometry type.
|
|
122
|
+
*/
|
|
123
|
+
export declare function getDefaultLabelPlacement(geometryType: GeometryType | undefined): LabelClassProperties["labelPlacement"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"@arcgis/core/geometry/Extent.js";import
|
|
1
|
+
import e from"@arcgis/core/geometry/Extent.js";import t from"@arcgis/core/geometry/SpatialReference.js";import r from"@arcgis/core/layers/MapImageLayer";import a from"@arcgis/core/renderers/SimpleRenderer.js";import n from"@arcgis/core/symbols/TextSymbol.js";import{jsonToGeometryType as o}from"../../json/GeometryJson.js";import{DefaultArcGISRequestHelper as i}from"../../support/ArcGISRequestHelper.js";import{caseInsensitiveEquals as l}from"../../utilities/string.js";import{getDefaultSymbol as s}from"../convert.js";const c=new i;export async function createFgdbLayer(n,o,i){const l=n.createdFeatureClasses.split(";"),{workspaceId:c}=n,y=await Promise.all(l.map((async e=>{const t=e.startsWith("afc_");return{featureClassName:e,layerTitle:extractLayerTitle(e),isAnnotation:t,...await _fetchLayerMetadata(i,c,e)}})));y.sort(((e,t)=>getLayerDrawPriority(e)-getLayerDrawPriority(t)));const p=y.map(((e,t)=>{const r={id:t,title:e.layerTitle,source:{type:"data-layer",dataSource:{type:"table",workspaceId:c,dataSourceName:e.featureClassName,gdbVersion:""}}};return e.isAnnotation?(r.opacity=0,r.labelsVisible=!0,r.labelingInfo=getAnnotationLabelingInfo(e.labelingInfo,e.fields,e.displayField,"point")):(r.renderer=new a({symbol:s(t,e.geometryType)}),r.labelsVisible=!1,e.labelingInfo?r.labelingInfo=e.labelingInfo:e.displayField&&(r.labelingInfo=[{labelExpressionInfo:{expression:`$feature.${e.displayField}`},labelPlacement:getDefaultLabelPlacement(e.geometryType)}])),r})),m=(o instanceof File?o.name:"fgdb-layer").replace(/[^a-zA-Z0-9_.-]/g,"_"),f=n.bbox||[],u=new e({xmin:f[0],ymin:f[1],xmax:f[2],ymax:f[3],spatialReference:new t({wkid:Number(n.outCrs||t.WebMercator)})});return new r({title:m,url:i,sublayers:p,visible:!0,fullExtent:u})}export async function _fetchLayerMetadata(e,t,r){const a={id:0,source:{type:"dataLayer",dataSource:{type:"table",workspaceId:t,dataSourceName:r}}},n=`${e}/dynamicLayer?f=json&layer=${encodeURIComponent(JSON.stringify(a))}`,i=await c.request(n,{method:"auto",responseType:"json"}),{geometryType:l,drawingInfo:s,displayField:y,fields:p}=i.data;return{geometryType:o(l),labelingInfo:s?.labelingInfo,displayField:y,fields:p}}export function extractLayerTitle(e){return e.replace(/^a?fc_[^_]+_/,"")}export function getGeometryDrawPriority(e){switch(e){case"polygon":case"extent":case"mesh":case"multipatch":return 0;case"polyline":return 1;case"point":case"multipoint":return 2;default:return-1}}export function getAnnotationTextField(e,t){const r=e?.find((e=>l(e.name,"TextString")))?.name;return r??t??"TextString"}export function getAnnotationLabelingInfo(e,t,r,a){const o=e??[];return(o.length>0?o:[{labelExpressionInfo:{expression:`$feature.${getAnnotationTextField(t,r)}`},labelPlacement:getDefaultLabelPlacement(a)}]).map((e=>({...e,symbol:e.symbol??new n({color:"black"})})))}export function getLayerDrawPriority(e){return e.isAnnotation?3:getGeometryDrawPriority(e.geometryType)}export function getDefaultLabelPlacement(e){switch(e){case"polyline":return"center-along";case"polygon":case"extent":return"always-horizontal";case"point":case"multipoint":return"center-center";default:return"above-right"}}
|
|
@@ -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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"
|