@vertigis/arcgis-extensions 53.7.0 → 53.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/convert.d.ts +22 -0
- package/data/convert.js +1 -1
- package/data/support/fgdbConverter.d.ts +61 -0
- package/data/support/fgdbConverter.js +1 -0
- package/docs/html/assets/navigation.js +1 -1
- package/docs/html/assets/search.js +1 -1
- package/docs/html/functions/data_convert.fgdbToLayerExtensions.html +5 -0
- package/docs/html/functions/data_support_fgdbConverter.createFgdbLayer.html +9 -0
- package/docs/html/functions/data_support_fgdbConverter.extractLayerTitle.html +4 -0
- package/docs/html/functions/data_support_fgdbConverter.getGeometryDrawPriority.html +6 -0
- package/docs/html/interfaces/data_convert.FgdbToLayerExtensionsOptions.html +6 -0
- package/docs/html/interfaces/data_support_fgdbConverter.DynamicLayerMetadataResponse.html +4 -0
- package/docs/html/interfaces/data_support_fgdbConverter.GeoProcessedFgdbData.html +10 -0
- package/docs/html/modules/data_convert.html +2 -0
- package/docs/html/modules/data_support_fgdbConverter.html +6 -0
- package/docs/html/modules.html +1 -0
- package/docs/html/variables/version.version.html +1 -1
- package/mapping/_LayerExtensionCollectionImpl.js +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,6 +10,7 @@ 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 { type GeoProcessedFgdbData } from "./support/fgdbConverter.js";
|
|
13
14
|
/**
|
|
14
15
|
* A union of simple fill, line, and marker symbols.
|
|
15
16
|
*/
|
|
@@ -316,6 +317,19 @@ export interface DxfToLayerExtensionsOptions {
|
|
|
316
317
|
*/
|
|
317
318
|
outputSpatialReference: SpatialReference;
|
|
318
319
|
}
|
|
320
|
+
/**
|
|
321
|
+
* Options for converting a FGDB file to layer extensions.
|
|
322
|
+
*/
|
|
323
|
+
export interface FgdbToLayerExtensionsOptions {
|
|
324
|
+
/**
|
|
325
|
+
* The URL of the map service to use for the dynamic layer.
|
|
326
|
+
*/
|
|
327
|
+
displayServiceUrl: string;
|
|
328
|
+
/**
|
|
329
|
+
* The geoprocessing result data for the file geodatabase.
|
|
330
|
+
*/
|
|
331
|
+
geoProcessedFgdbData: GeoProcessedFgdbData;
|
|
332
|
+
}
|
|
319
333
|
/**
|
|
320
334
|
* A collection of well known field names associated with different geometry
|
|
321
335
|
* formats.
|
|
@@ -421,6 +435,14 @@ export declare function kmlToLayerExtensions(kmlBlob: Blob): Promise<LayerExtens
|
|
|
421
435
|
* @returns A promise that resolves to an array of `LayerExtension` objects.
|
|
422
436
|
*/
|
|
423
437
|
export declare function dxfToLayerExtensions(dxfBlob: Blob, options: DxfToLayerExtensionsOptions, contextOverrides?: Partial<IDxfJsonComponentContext>): Promise<LayerExtension[]>;
|
|
438
|
+
/**
|
|
439
|
+
* Converts a Blob that represents FGDB data to an array of layer extensions.
|
|
440
|
+
*
|
|
441
|
+
* @param fgdbBlob The Blob containing FGDB data to convert.
|
|
442
|
+
* @param options The options for converting the FGDB file.
|
|
443
|
+
* @returns A promise that resolves to an array of `LayerExtension` objects.
|
|
444
|
+
*/
|
|
445
|
+
export declare function fgdbToLayerExtensions(fgdbBlob: Blob, options: FgdbToLayerExtensionsOptions): Promise<LayerExtension[]>;
|
|
424
446
|
/**
|
|
425
447
|
* Converts a Blob that represents zipped Shapefile data to a data table.
|
|
426
448
|
*
|
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{CaseInsensitiveObservableMap as O}from"../utilities/CaseInsensitiveObservableMap.js";import{Time as D}from"../utilities/Time.js";import{checkArg as b,assertNever as x}from"../utilities/checkArg.js";import{isPoint as M,isMultipoint as E,isPolyline as R,isPolygon as A,isExtent as I}from"../utilities/esri.js";import{parse as G,format as _,DEFAULT_PARSING_FORMATS as C,INVALID_DATE as L}from"../utilities/format/date.js";import{DateFormat as v,NumberFormat as P,TimeFormat as j}from"../utilities/format/formats.js";import{parse as U,format as $}from"../utilities/format/number.js";import{parse as H,format as B,DEFAULT_PARSING_FORMATS as J}from"../utilities/format/time.js";import{project as z,esriToWKT as k,wktToEsri as W,esriWkidToWkt as X,esriWktToWkid as q,esriToGeoJSON as Y,geoJSONToEsri as Z}from"../utilities/geometry.js";import{getLogger as K}from"../utilities/log.js";import{isNumeric as V}from"../utilities/number.js";import{delay as Q}from"../utilities/promise.js";import{caseInsensitiveEquals as ee}from"../utilities/string.js";import{Feature as te}from"./Feature.js";import{FeatureSet as re}from"./FeatureSet.js";import{DxfEntityProcessor as oe}from"./support/_dxfConverters.js";const ne=["=","-","+","@"],ae='"',ie="\r\n",se="\n",ce=[...C.map(He),"M/d/yy"],le=[...J.map(Je).map((e=>e.replace("AM/PM","tt")))],me=/(\w+)_(point|multipoint|polyline|polygon)z?/;var ue;function fe(){return K("geocortex.api.data.convert")}!function(e){e.DATE="D",e.NUMBER="N",e.STRING="C",e.BOOLEAN="L"}(ue||(ue={}));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 ye=[[GeometryFormat.ARCGIS_JSON,Ie],[GeometryFormat.GEO_JSON,Ge],[GeometryFormat.WKT,_e]],pe=new Map(ye);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=>ve(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)&&V(t[e[0]]?.raw,i)&&V(t[e[1]]?.raw,i)&&(!o||V(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],Ie);case GeometryFormat.GEO_JSON:return f(e[0],Ge);case GeometryFormat.WKT:return f(e[0],_e);default:return x(t,new Error(`Unknown geometry format "${t}".`))}};if(n){const e=Ce(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 Pe(t,c,o);if(p===GeometryFormat.NONE)return{columnIndices:[]};return d.length>1?u(d,p):f(d[0],pe.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=Ue(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=>!ee(e.name,m)&&"esriFieldTypeString"===e.type))?.name??c.fields.find((e=>!ee(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 te;for(let t=0;t<r.fields.length;t++){const u=r.fields[t],f=e.filter(p);if(a.includes("*")||a.filter((e=>ee(e,u.name))).length>0){let e=await $e(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 Oe(t.geometries[o],u)),f.push(n)}))),f}(e,t,o);return new re({features:n,schema:o})}export async function toCsv(e,t){b("featureSet",e).isNotMissing();const r=Array.from(e),o={...{useFormattedValues:!1,alwaysQuote:!1,escapeFormulaChars:!0,delimiter:",",dateFormat:v.ROUND_TRIP,timeFormat:j.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:Te(e.source),rowDelimiter:navigator.platform?.startsWith("Win")?ie:"\n"},...t},{includeByteOrderMark:n,includeHeaderRow:i,delimiter:s,outFields:c,rowDelimiter:l}=o,m=[];n&&m.push("\ufeff");const u=Fe(r,o),f=Se(r,c,e.schema,!0),y=Se(r,c,e.schema,!1);if(i){const e=[];for(const t of u)e.push(De(t,o));for(const t of f)e.push(De(t,o));for(const t of y)e.push(De(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=xe(e,t,r),n=e.schema.findFieldByName(t)?.type;return De(be(o,{...r,isDateOnly:"date-only"===n}),r)};t.push(...await async function(e,t){let r=await Ne(e,t);t.geometryFormat!==GeometryFormat.XYZ&&t.geometryFormat!==GeometryFormat.XY&&t.geometryFormat!==GeometryFormat.LAT_LON||(r=r.map((e=>void 0===e?"":be(e,t))));return r.map((e=>""===e?"":De(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===ie?"transparent":"native"})}export async function csvToUploadData(e,t){let r;if(b("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=ge(t),n=o.rowDelimiter||function(e){let t=se;return Ae(e,ie,((r,o)=>(0===r&&o===e.length||(t=ie),!1))),t}(r),a=o.delimiter??function(e,t,r){const o=",";if(0===e.length)return o;const n=[];if(Ae(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;Ae(e,t.delimiter,((a,i)=>{if(i!==e.length&&o++,","===t.delimiter){const t=e.charAt(i-1),o=e.charAt(i+1);V(t,r)&&V(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 Ae(e,r,((r,n)=>{const a=e.substring(r,n);return o.push({raw:Re(a,t,o.length)}),!0})),o};if(Ae(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 Pe(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=ge(t);return uploadDataToFeatureSet(await csvToUploadData(e,r))}export async function toXLSX(e,t){b("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:Te(e.source),outSpatialReference:a.WGS84,dateFormat:v.DEFAULT,timeFormat:j.DEFAULT,numberFormat:P.DEFAULT,sheetName:"sheet1"},...t},{outFields:n,includeHeaderRow:i,dateFormat:s,timeFormat:c,numberFormat:l}=o,m=Fe(r,o),u=Se(r,n,e.schema,!0),f=Se(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=>ee(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 Ne(e.geometry,o));for(const r of u){const n=ke(e.attributes.get(r),o);t.push(n)}for(const a of f){const i=xe(e,a,o);if(i instanceof D){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=ke(i,o);t.push(s)}if(!t.every((e=>"string"!=typeof e||e.length<=32767)))return void fe().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=Je(c??j.ROUND_TRIP):n.has(e)?t.z=Be(s??v.ROUND_TRIP):t.z=He(s??v.ROUND_TRIP):"n"===t.t&&(t.z=ze(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){b("xlsxData",e).isNotMissing();const r=we(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 Pe(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){b("xlsxData",e).isNotMissing();const r=we(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){b("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:Te(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=>M(e.geometry)));u.set("POINTZ",f.filter(m)),u.set("POINT",f.filter((e=>!m(e))));const y=n.filter((e=>E(e.geometry)));u.set("MULTIPOINTZ",y.filter(m)),u.set("MULTIPOINT",y.filter((e=>!m(e))));const p=n.filter((e=>R(e.geometry)));u.set("POLYLINEZ",p.filter(m)),u.set("POLYLINE",p.filter((e=>!m(e))));const d=n.filter((e=>A(e.geometry)||I(e.geometry)));u.set("POLYGONZ",d.filter(m)),u.set("POLYGON",d.filter((e=>!m(e))));const g=Se(n,s,e.schema,!0);let w=Se(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=>Oe(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 X(t??a.WGS84.wkid)}(n),m=i.useFormattedValues?Object.assign({},...w.map((e=>({[e]:ue.STRING})))):function(e,t,r,o){const n={};for(const a of t){if(e.some((e=>Me(e,a)))){n[a]=ue.STRING;continue}const t=r?r.fields.find((e=>ee(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]=ue.NUMBER;break;case"date":case"timestamp-offset":n[a]=o?ue.NUMBER:ue.DATE;break;default:n[a]=ue.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?ue.NUMBER:ue.DATE:e.every((e=>"number"==typeof i(e,a)||void 0===i(e,a)))&&e.some((e=>"number"==typeof i(e,a)))?n[a]=ue.NUMBER:e.every((e=>"boolean"==typeof i(e,a)||void 0===i(e,a)))&&e.some((e=>"boolean"==typeof i(e,a)))?n[a]=ue.BOOLEAN:n[a]=ue.STRING}return n}(r,w,e.schema,"timestamp"===i.dateFormat),f=function(e){return e.map((e=>{if(M(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),We(a,e)}if(E(e))return Xe(e.points,e);if(R(e))return qe(e.paths,e);if(A(e))return qe(e.rings,e);if(I(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=xe(a,n,o);if(null==t&&(t=""),o.useFormattedValues)t=t.toString();else{t=Ye(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){b("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(Ze(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:Ke(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:Ke(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 dxfToLayerExtensions(e,t,r){const{inputSpatialReference:o,outputSpatialReference:n}=t;b("options.dxfBlob",e).isNotMissing(),b("options.inputSpatialReference",o).isNotMissing(),b("options.outputSpatialReference",n).isNotMissing();const a=new oe(o,n,r),i=a.getContext(),c=await e.text(),l=new w;await Q();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 shapefileToUploadData(e,t){b("shapefileData",e).isNotMissing();const o=he(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 O;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(me);return r?(t=r[1],e.filter((e=>{const r=e.match(me);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=M(e)?function(e){b("geometry.coordinates",e.type).matches("Point"),b("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 Z(e);if(t){let e;try{const r=await q(t);e=new a({wkid:U(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){b("shapefileData",e).isNotMissing();const r=he(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 de(e){return{escapeFormulaChars:!0,outFields:["*"],generatePrimaryKey:!1,locale:S,detectOid:!e?.primaryKeyField}}function ge(e){return{...{includeHeaderRow:!0,inSpatialReference:a.WGS84,...de(e)},...e}}function we(e){return{...{includeHeaderRow:!0,inSpatialReference:a.WGS84,...de(e)},...e}}function he(e){return{...{...de(e)},...e}}function Fe(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 Se(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 Te(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 Ne(e,t){const r=await Oe(e,t.outSpatialReference);if(t.geometryFormat===GeometryFormat.XYZ){if(!r)return["","",""];if(!M(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(!M(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(!M(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 k(r)]:[""]:t.geometryFormat===GeometryFormat.GEO_JSON?r?[JSON.stringify(await Y(r))]:[""]:[]}async function Oe(e,t){return e?.spatialReference&&!e.spatialReference.equals(t)&&t?(await z([e],t))[0]:e}function De(e,t){const r=[t.delimiter,ae,"\r","\n",t.rowDelimiter];if(t.alwaysQuote||r.some((t=>e.includes(t)))){const t=e.replace(new RegExp(ae,"g"),`${ae}${ae}`);return`${ae}${t}${ae}`}return e}function be(e,t){if(null==e)return"";if(!t.useFormattedValues){if("number"==typeof e){const r=t.numberFormat||P.ROUND_TRIP;return $(r,e)}if(e instanceof Date)return"timestamp"===t.dateFormat?e.getTime().toString():_({format:t.dateFormat,timeZone:"UTC",isDateOnly:t.isDateOnly},e);if(e instanceof D)return B({format:t.timeFormat},e)}let r=e.toString();return t.escapeFormulaChars&&(r=Ee(r)),r}function xe(e,t,r){if(r.useFormattedValues||Me(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 Me(e,t){return!!ee(t,e.schema.typeIdField)||("coded-value"===e.type?.domains?.[t]?.type||"coded-value"===e.schema.findFieldByName(t)?.domain?.type)}function Ee(e){for(const t of ne)if(e.startsWith(t))return`\t${e}`;return e}function Re(e,t,r){const o=e.startsWith(ae),n=e.endsWith(ae);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 Ae(a,ae,((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(`${ae}${ae}`,"g"),ae)}function Ae(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(ae)?(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 Ie(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 Ge(e,t){const r=await Z(JSON.parse(e));return r.spatialReference=t,r}async function _e(e,t){const r=await W(e);return r.spatialReference=t,r}function Ce(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 Le(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 ve(e,t,r){return"inv"===t?"string"==typeof e?parseFloat(e.replaceAll(",","")):e:U({locale:t,format:r},e)}async function Pe(e,t,r){const o=r?e.slice(1):e;if(r){const r=Ce(e[0],GeometryFormat.ARCGIS_JSON);if(void 0!==r)for(const[e,n]of ye){try{await je(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=Ce(e[0],t);if(void 0!==r)return[t,r]}}for(const[e,r]of ye){const n=await Le(o[0],r);if(void 0!==n){try{await je(n,r,t,o)}catch{continue}return[e,[n]]}}return[GeometryFormat.NONE,[]]}async function je(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 Ue(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=V(r.raw,d)||Number.isNaN(r.raw)),a&&(a=r.raw instanceof Date||G(f||C,r.raw)!==L),s&&(s=G(f||ce,r.formatted)!==L),i&&(i=r.raw instanceof D||H(y||J,r.raw).isValid),c&&(c=H({format:y||le,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 $e(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?ve(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 D)return e.toString();if(e instanceof Date)return new D(e).toString();if("number"==typeof e){const t=(await import("xlsx")).SSF.parse_date_code(e);return t?new D(`${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 ne)if(c.length>1&&c.charAt(1)===e)return c.substring(1);return c}function He(e){switch(e){case v.DATE_SHORT:return"dd/MM/yyyy";case v.DATE_LONG:return"MMMM d, yyyy";case v.TIME_SHORT:return"h:mm AM/PM";case v.TIME_LONG:return"h:mm:ss AM/PM";case v.DATE_TIME_SHORT:case v.DEFAULT:return"MMM d yyyy h:mm AM/PM";case v.DATE_TIME_LONG:return"MMMM d yyyy h:mm AM/PM";case v.FULL:return"dddd, MMMM d yyyy h:mm AM/PM";case v.ISO_8601:case v.ROUND_TRIP:return'yyyy-MM-dd"T"HH:mm:ss';default:{const t=e.replace(/tt/g,"AM/PM");return t.includes("z")&&fe().warn("Warning: Excel will not recognize timezone format 'z', 'zz', or 'zzz'"),t.includes("h")&&!t.includes("AM/PM")&&fe().warn("Warning: Excel will interpret 'h' as 'H' if the format does not have an AM/PM designator"),t}}}function Be(e){switch(e){case v.DATE_SHORT:return"dd/MM/yyyy";case v.DATE_LONG:return"MMMM d, yyyy";case v.DATE_TIME_SHORT:case v.DEFAULT:return"MMM d yyyy";case v.DATE_TIME_LONG:return"MMMM d yyyy";case v.FULL:return"dddd, MMMM d yyyy";case v.ISO_8601:case v.ROUND_TRIP:return"yyyy-MM-dd";default:return e.replace(/TtZzHhmSsUua/g,"")}}function Je(e){switch(e){case j.TIME_SHORT:return"h:mm AM/PM";case j.TIME_LONG:return"h:mm:ss AM/PM";case j.ISO_8601:case j.ROUND_TRIP:return"HH:mm:ss";default:{const t=e.replace(/tt/g,"AM/PM");return t.includes("h")&&!t.includes("AM/PM")&&fe().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.ACCOUNTING:return'_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)';case P.CURRENCY:return'"$"#,##0.00';case P.FIXED_POINT:case P.DEFAULT:return"0.0000";case P.NUMBER:return"#,##0.0000";case P.PERCENT:return"0%";case P.ROUND_TRIP:return"0.00000";default:return e}}function ke(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 D)return e.toDate()}let r=e.toString();return t.escapeFormulaChars&&(r=Ee(r)),r}function We(e,t){return 3===e.length&&!t.hasZ&&t.hasM?[e[0],e[1],void 0,e[2]]:e}function Xe(e,t){return e.map((e=>We(e,t)))}function qe(e,t){return e.map((e=>Xe(e,t)))}function Ye(e,t,r){switch(t){case ue.NUMBER:return e instanceof Date?e.getTime():U(e);case ue.STRING:return e instanceof Date?_({format:r.dateFormat??v.ROUND_TRIP,timeZone:"UTC",isDateOnly:r.isDateOnly},e):e instanceof D?B({format:r.timeFormat??j.ROUND_TRIP},e):"number"==typeof e?$(r.numberFormat??P.DEFAULT,e):e.toString();case ue.BOOLEAN:return!!e;case ue.DATE:return G(e);default:return e.toString()}}function Ze(e,t){return JSON.stringify(e.toJSON())===JSON.stringify(t.toJSON())}function Ke(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 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 D}from"../utilities/Time.js";import{checkArg as M,assertNever as x}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 H}from"../utilities/format/number.js";import{parse as B,format as J,DEFAULT_PARSING_FORMATS as z}from"../utilities/format/time.js";import{project as k,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{createFgdbLayer as ae}from"./support/fgdbConverter.js";const ie=["=","-","+","@"],se='"',ce="\r\n",le="\n",me=[...C.map(Je),"M/d/yy"],ue=[...z.map(ke).map((e=>e.replace("AM/PM","tt")))],fe=/(\w+)_(point|multipoint|polyline|polygon)z?/;var ye;function pe(){return V("geocortex.api.data.convert")}!function(e){e.DATE="D",e.NUMBER="N",e.STRING="C",e.BOOLEAN="L"}(ye||(ye={}));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,_e],[GeometryFormat.GEO_JSON,Le],[GeometryFormat.WKT,Ce]],ge=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=>je(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],_e);case GeometryFormat.GEO_JSON:return f(e[0],Le);case GeometryFormat.WKT:return f(e[0],Ce);default:return x(t,new Error(`Unknown geometry format "${t}".`))}};if(n){const e=ve(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 Ue(t,c,o);if(p===GeometryFormat.NONE)return{columnIndices:[]};return d.length>1?u(d,p):f(d[0],ge.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 Be(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){M("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:Oe(e.source),rowDelimiter:navigator.platform?.startsWith("Win")?ce:"\n"},...t},{includeByteOrderMark:n,includeHeaderRow:i,delimiter:s,outFields:c,rowDelimiter:l}=o,m=[];n&&m.push("\ufeff");const u=Te(r,o),f=Ne(r,c,e.schema,!0),y=Ne(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=Ee(e,t,r),n=e.schema.findFieldByName(t)?.type;return Me(xe(o,{...r,isDateOnly:"date-only"===n}),r)};t.push(...await async function(e,t){let r=await be(e,t);t.geometryFormat!==GeometryFormat.XYZ&&t.geometryFormat!==GeometryFormat.XY&&t.geometryFormat!==GeometryFormat.LAT_LON||(r=r.map((e=>void 0===e?"":xe(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===ce?"transparent":"native"})}export async function csvToUploadData(e,t){let r;if(M("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=he(t),n=o.rowDelimiter||function(e){let t=le;return Ge(e,ce,((r,o)=>(0===r&&o===e.length||(t=ce),!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:Ie(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 Ue(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=he(t);return uploadDataToFeatureSet(await csvToUploadData(e,r))}export async function toXLSX(e,t){M("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:Oe(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=Te(r,o),u=Ne(r,n,e.schema,!0),f=Ne(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 be(e.geometry,o));for(const r of u){const n=Xe(e.attributes.get(r),o);t.push(n)}for(const a of f){const i=Ee(e,a,o);if(i instanceof D){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=Xe(i,o);t.push(s)}if(!t.every((e=>"string"!=typeof e||e.length<=32767)))return void pe().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=ke(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=We(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){M("xlsxData",e).isNotMissing();const r=Fe(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 Ue(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){M("xlsxData",e).isNotMissing();const r=Fe(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){M("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:Oe(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)||G(e.geometry)));u.set("POLYGONZ",d.filter(m)),u.set("POLYGON",d.filter((e=>!m(e))));const g=Ne(n,s,e.schema,!0);let w=Ne(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]:ye.STRING})))):function(e,t,r,o){const n={};for(const a of t){if(e.some((e=>Re(e,a)))){n[a]=ye.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]=ye.NUMBER;break;case"date":case"timestamp-offset":n[a]=o?ye.NUMBER:ye.DATE;break;default:n[a]=ye.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?ye.NUMBER:ye.DATE:e.every((e=>"number"==typeof i(e,a)||void 0===i(e,a)))&&e.some((e=>"number"==typeof i(e,a)))?n[a]=ye.NUMBER:e.every((e=>"boolean"==typeof i(e,a)||void 0===i(e,a)))&&e.some((e=>"boolean"==typeof i(e,a)))?n[a]=ye.BOOLEAN:n[a]=ye.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),qe(a,e)}if(R(e))return Ye(e.points,e);if(A(e))return Ze(e.paths,e);if(I(e))return Ze(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),y=function(e,t,r,o){const n=[];for(const a of e){const e={};for(const n of t){let t=Ee(a,n,o);if(null==t&&(t=""),o.useFormattedValues)t=t.toString();else{t=Ke(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){M("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(Ve(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:Qe(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:Qe(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 dxfToLayerExtensions(e,t,r){const{inputSpatialReference:o,outputSpatialReference:n}=t;M("options.dxfBlob",e).isNotMissing(),M("options.inputSpatialReference",o).isNotMissing(),M("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;M("options.fgdbBlob",e).isNotMissing(),M("options.displayServiceUrl",r).isNotMissing(),M("options.geoProcessedFgdbData",o).isNotMissing();const n=await ae(o,e,r);return[new O({layer:n})]}export async function shapefileToUploadData(e,t){M("shapefileData",e).isNotMissing();const o=Se(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(fe);return r?(t=r[1],e.filter((e=>{const r=e.match(fe);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){M("geometry.coordinates",e.type).matches("Point"),M("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){M("shapefileData",e).isNotMissing();const r=Se(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 we(e){return{escapeFormulaChars:!0,outFields:["*"],generatePrimaryKey:!1,locale:S,detectOid:!e?.primaryKeyField}}function he(e){return{...{includeHeaderRow:!0,inSpatialReference:a.WGS84,...we(e)},...e}}function Fe(e){return{...{includeHeaderRow:!0,inSpatialReference:a.WGS84,...we(e)},...e}}function Se(e){return{...{...we(e)},...e}}function Te(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 Ne(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 Oe(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 be(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 k([e],t))[0]:e}function Me(e,t){const r=[t.delimiter,se,"\r","\n",t.rowDelimiter];if(t.alwaysQuote||r.some((t=>e.includes(t)))){const t=e.replace(new RegExp(se,"g"),`${se}${se}`);return`${se}${t}${se}`}return e}function xe(e,t){if(null==e)return"";if(!t.useFormattedValues){if("number"==typeof e){const r=t.numberFormat||j.ROUND_TRIP;return H(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 D)return J({format:t.timeFormat},e)}let r=e.toString();return t.escapeFormulaChars&&(r=Ae(r)),r}function Ee(e,t,r){if(r.useFormattedValues||Re(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=B(e.attributes.get(t));if(r.isValid)return r;break}}return e.attributes.get(t)??e.presentableAttributes.get(t)}function Re(e,t){return!!te(t,e.schema.typeIdField)||("coded-value"===e.type?.domains?.[t]?.type||"coded-value"===e.schema.findFieldByName(t)?.domain?.type)}function Ae(e){for(const t of ie)if(e.startsWith(t))return`\t${e}`;return e}function Ie(e,t,r){const o=e.startsWith(se),n=e.endsWith(se);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,se,((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(`${se}${se}`,"g"),se)}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(se)?(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 _e(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 Le(e,t){const r=await K(JSON.parse(e));return r.spatialReference=t,r}async function Ce(e,t){const r=await X(e);return r.spatialReference=t,r}function ve(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 Pe(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 je(e,t,r){return"inv"===t?"string"==typeof e?parseFloat(e.replaceAll(",","")):e:$({locale:t,format:r},e)}async function Ue(e,t,r){const o=r?e.slice(1):e;if(r){const r=ve(e[0],GeometryFormat.ARCGIS_JSON);if(void 0!==r)for(const[e,n]of de){try{await $e(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=ve(e[0],t);if(void 0!==r)return[t,r]}}for(const[e,r]of de){const n=await Pe(o[0],r);if(void 0!==n){try{await $e(n,r,t,o)}catch{continue}return[e,[n]]}}return[GeometryFormat.NONE,[]]}async function $e(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||_(f||C,r.raw)!==v),s&&(s=_(f||me,r.formatted)!==v),i&&(i=r.raw instanceof D||B(y||z,r.raw).isValid),c&&(c=B({format:y||ue,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 Be(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?je(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 D)return e.toString();if(e instanceof Date)return new D(e).toString();if("number"==typeof e){const t=(await import("xlsx")).SSF.parse_date_code(e);return t?new D(`${t.H.toString().padStart(2,"0")}:${t.M.toString().padStart(2,"0")}:${t.S.toString().padStart(2,"0")}`).toString():void 0}return""===e?null:B({locale:n,format:s},e).toString()}const c=e?.toString()??"";if(o&&c.startsWith("\t"))for(const e of ie)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")&&pe().warn("Warning: Excel will not recognize timezone format 'z', 'zz', or 'zzz'"),t.includes("h")&&!t.includes("AM/PM")&&pe().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 ke(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")&&pe().warn("Warning: Excel will interpret 'h' as 'H' if the format does not have an AM/PM designator"),t}}}function We(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 Xe(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 D)return e.toDate()}let r=e.toString();return t.escapeFormulaChars&&(r=Ae(r)),r}function qe(e,t){return 3===e.length&&!t.hasZ&&t.hasM?[e[0],e[1],void 0,e[2]]:e}function Ye(e,t){return e.map((e=>qe(e,t)))}function Ze(e,t){return e.map((e=>Ye(e,t)))}function Ke(e,t,r){switch(t){case ye.NUMBER:return e instanceof Date?e.getTime():$(e);case ye.STRING:return e instanceof Date?L({format:r.dateFormat??P.ROUND_TRIP,timeZone:"UTC",isDateOnly:r.isDateOnly},e):e instanceof D?J({format:r.timeFormat??U.ROUND_TRIP},e):"number"==typeof e?H(r.numberFormat??j.DEFAULT,e):e.toString();case ye.BOOLEAN:return!!e;case ye.DATE:return _(e);default:return e.toString()}}function Ve(e,t){return JSON.stringify(e.toJSON())===JSON.stringify(t.toJSON())}function Qe(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,61 @@
|
|
|
1
|
+
import MapImageLayer from "@arcgis/core/layers/MapImageLayer";
|
|
2
|
+
import { type GeometryJsonType } from "../../json/GeometryJson.js";
|
|
3
|
+
import type { GeometryType } from "../../support/esri.js";
|
|
4
|
+
/**
|
|
5
|
+
* The response from the dynamic layer metadata request.
|
|
6
|
+
*/
|
|
7
|
+
export interface DynamicLayerMetadataResponse {
|
|
8
|
+
/**
|
|
9
|
+
* The geometry type of the layer.
|
|
10
|
+
*/
|
|
11
|
+
geometryType: GeometryJsonType;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Data structure holding results from the FGDB geoprocessing task.
|
|
15
|
+
*/
|
|
16
|
+
export interface GeoProcessedFgdbData {
|
|
17
|
+
/**
|
|
18
|
+
* The data source result.
|
|
19
|
+
*/
|
|
20
|
+
createdFeatureClasses: string;
|
|
21
|
+
/**
|
|
22
|
+
* The workspace result.
|
|
23
|
+
*/
|
|
24
|
+
workspaceId: string;
|
|
25
|
+
/**
|
|
26
|
+
* The bounding box result.
|
|
27
|
+
*/
|
|
28
|
+
bbox: number[];
|
|
29
|
+
/**
|
|
30
|
+
* The output CRS result.
|
|
31
|
+
*/
|
|
32
|
+
outCrs?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Creates a new MapImageLayer from geoprocessed file geodatabase data.
|
|
36
|
+
*
|
|
37
|
+
* @param processedFgdbData The geoprocessing result data for the file
|
|
38
|
+
* geodatabase.
|
|
39
|
+
* @param uploadedFile The original uploaded file, used to derive the layer
|
|
40
|
+
* title.
|
|
41
|
+
* @param displayServiceUrl The URL of the map service to use for the dynamic
|
|
42
|
+
* layer.
|
|
43
|
+
* @returns A promise that resolves to a new MapImageLayer.
|
|
44
|
+
*/
|
|
45
|
+
export declare function createFgdbLayer(processedFgdbData: GeoProcessedFgdbData, uploadedFile: Blob, displayServiceUrl: string): Promise<MapImageLayer>;
|
|
46
|
+
/**
|
|
47
|
+
* Extracts the layer title from the feature class name.
|
|
48
|
+
*
|
|
49
|
+
* @param featureClassName The name of the feature class.
|
|
50
|
+
* @returns The extracted layer title.
|
|
51
|
+
*/
|
|
52
|
+
export declare function extractLayerTitle(featureClassName: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Gets the draw priority for a given geometry type. This follows the standard
|
|
55
|
+
* GIS rendering order (polygons → lines → points) to ensure proper visual
|
|
56
|
+
* stacking.
|
|
57
|
+
*
|
|
58
|
+
* @param geometryType The geometry type.
|
|
59
|
+
* @returns The draw priority, where a higher number is drawn on top.
|
|
60
|
+
*/
|
|
61
|
+
export declare function getGeometryDrawPriority(geometryType: GeometryType | undefined): number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e from"@arcgis/core/geometry/Extent.js";import r from"@arcgis/core/geometry/SpatialReference.js";import t from"@arcgis/core/layers/MapImageLayer";import a from"@arcgis/core/renderers/SimpleRenderer.js";import{jsonToGeometryType as o}from"../../json/GeometryJson.js";import{DefaultArcGISRequestHelper as s}from"../../support/ArcGISRequestHelper.js";import{getDefaultSymbol as i}from"../convert.js";const n=new s;export async function createFgdbLayer(o,s,n){const c=o.createdFeatureClasses.split(";"),{workspaceId:y}=o,m=await Promise.all(c.map((async e=>({featureClassName:e,layerTitle:extractLayerTitle(e),geometryType:await _fetchGeometryType(n,y,e)}))));m.sort(((e,r)=>getGeometryDrawPriority(e.geometryType)-getGeometryDrawPriority(r.geometryType)));const p=m.map(((e,r)=>({id:r,title:e.layerTitle,source:{type:"data-layer",dataSource:{type:"table",workspaceId:y,dataSourceName:e.featureClassName,gdbVersion:""}},renderer:new a({symbol:i(r,e.geometryType)}),labelsVisible:!0}))),l=(s instanceof File?s.name:"fgdb-layer").replace(/[^a-zA-Z0-9_.-]/g,"_"),u=o.bbox||[],d=new e({xmin:u[0],ymin:u[1],xmax:u[2],ymax:u[3],spatialReference:new r({wkid:Number(o.outCrs||r.WebMercator)})});return new t({title:l,url:n,sublayers:p,visible:!0,fullExtent:d})}export async function _fetchGeometryType(e,r,t){const a={id:0,source:{type:"dataLayer",dataSource:{type:"table",workspaceId:r,dataSourceName:t}}},s=`${e}/dynamicLayer?f=json&layer=${encodeURIComponent(JSON.stringify(a))}`,i=await n.request(s,{method:"auto",responseType:"json"}),{geometryType:c}=i.data;return o(c)}export function extractLayerTitle(e){return e.replace(/^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}}
|
|
@@ -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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"
|