leiting-bim 2.1.97 → 2.1.99
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/leiting-bim.es.js +1 -1
- package/leiting-bim.umd.js +8 -8
- package/leitingbim.css +1 -1
- package/package.json +1 -1
- package/plugins/cesium-core/dist/cesium-core.mjs +281 -275
- package/plugins/cesium-core/dist/cesium-core.mjs.map +1 -1
- package/plugins/cesium-core/dist/cesium-core.umd.js +12 -12
- package/plugins/cesium-core/dist/cesium-core.umd.js.map +1 -1
- package/plugins/cesium-core/dist/components/BufferedHierarchicalAggregator.d.ts +2 -0
- package/plugins/cesium-vue/dist/components/marker-manage.js +387 -381
- package/plugins/cesium-vue/dist/components/marker-manage.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cesium-core.mjs","sources":["../src/components/BufferedHierarchicalAggregator.ts","../src/components/MarkerEvent.ts","../src/components/HtmlOverlayLabelPool.ts","../src/components/TooltipManager.ts","../src/components/draw/handlers/PointDrawer.ts","../src/components/draw/handlers/LineDrawer.ts","../src/components/draw/handlers/RectangleDrawer.ts","../src/components/draw/handlers/CircleDrawer.ts","../src/components/draw/handlers/PolygonDrawer.ts","../src/components/draw/DrawTool.ts","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_freeGlobal.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_root.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Symbol.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getRawTag.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_objectToString.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseGetTag.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isObjectLike.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isArray.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isObject.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isFunction.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_coreJsData.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_isMasked.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_toSource.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsNative.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getValue.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getNative.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_WeakMap.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseCreate.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_defineProperty.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_arrayEach.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_isIndex.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseAssignValue.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/eq.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_assignValue.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isLength.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isArrayLike.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_isPrototype.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseTimes.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsArguments.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isArguments.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/stubFalse.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isBuffer.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsTypedArray.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseUnary.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_nodeUtil.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isTypedArray.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_arrayLikeKeys.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_overArg.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_nativeKeys.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseKeys.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/keys.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_nativeCreate.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_hashClear.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_hashDelete.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_hashGet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_hashHas.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_hashSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Hash.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_listCacheClear.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_assocIndexOf.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_listCacheDelete.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_listCacheGet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_listCacheHas.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_listCacheSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_ListCache.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Map.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_mapCacheClear.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_isKeyable.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getMapData.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_mapCacheDelete.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_mapCacheGet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_mapCacheHas.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_mapCacheSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_MapCache.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_arrayPush.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getPrototype.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_stackClear.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_stackDelete.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_stackGet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_stackHas.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_stackSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Stack.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_cloneBuffer.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_arrayFilter.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/stubArray.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getSymbols.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseGetAllKeys.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getAllKeys.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_DataView.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Promise.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Set.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getTag.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_initCloneArray.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Uint8Array.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_cloneArrayBuffer.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_cloneDataView.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_cloneRegExp.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_cloneSymbol.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_cloneTypedArray.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_initCloneByTag.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_initCloneObject.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsMap.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isMap.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseClone.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/cloneDeep.js","../src/components/gltf/GLTFManage.ts","../src/components/Material/help/dynamicImgMaterial.ts","../src/components/Material/help/PolylineFlowMaterialProperty.ts","../src/components/Material/MaterialManager.ts","../src/components/entity/EntityLayer.ts","../src/components/utils/convertGeoJsonToEntityData.ts","../src/components/primitive/PrimitiveManager.ts","../src/components/measurement/handlers/HorizontalMeasure.ts","../src/components/measurement/handlers/VerticalMeasure.ts","../src/components/measurement/handlers/TriangleMeasure.ts","../src/components/measurement/handlers/SpaceMeasure.ts","../src/components/measurement/handlers/AreaMeasure.ts","../src/components/measurement/handlers/CircleMeasure.ts","../src/components/measurement/handlers/PolylineDistanceMeasure.ts","../src/components/measurement/handlers/TerrainHeightMeasure.ts","../src/components/measurement/handlers/CoordinateMeasure.ts","../src/components/measurement/handlers/RectangleMeasure.ts","../src/components/measurement/handlers/RegularPolygonMeasure.ts","../src/components/measurement/MeasurementTool.ts","../src/components/roaming/CameraRoamTool.ts","../src/components/roaming/PathRoamTool.ts"],"sourcesContent":["import { HtmlOverlayLabelPool } from './HtmlOverlayLabelPool';\r\n\r\ninterface PointData {\r\n id: string;\r\n lon: number;\r\n lat: number;\r\n height: number;\r\n name: string;\r\n data: {\r\n [key: string]: any;\r\n };\r\n [key: string]: any;\r\n}\r\n\r\ninterface GridCell {\r\n allPoints: PointData[];\r\n groups: Map<string, PointData[]>;\r\n skipPoints: PointData[];\r\n}\r\n\r\ninterface AggregatorOptions {\r\n labelPool: HtmlOverlayLabelPool;\r\n threshold?: number;\r\n displayLimit?: number;\r\n maxLevel?: number;\r\n debugCurrentGrids?: boolean;\r\n clusterTheme?: string;\r\n pointTheme?: string;\r\n centralPointMode?: string;\r\n minGlobalPointCount?: number;\r\n groupByTheme?: boolean;\r\n}\r\n\r\ninterface GridLevel {\r\n level: number;\r\n size: number;\r\n minViewWidth: number;\r\n}\r\n\r\nexport { PointData, GridLevel, AggregatorOptions };\r\n\r\nexport class BufferedHierarchicalAggregator {\r\n private Cesium: any;\r\n private viewer: any;\r\n labelPool: HtmlOverlayLabelPool;\r\n private threshold: number;\r\n private displayLimit: number;\r\n private maxLevel: number;\r\n private debugCurrentGrids: boolean;\r\n private levels: GridLevel[];\r\n private points: PointData[] = [];\r\n private gridLayers: Map<number, Map<string, GridCell>> = new Map();\r\n private debugGrids: any[] = [];\r\n private _updateFn: () => void;\r\n private clusterTheme: string;\r\n private pointTheme: string;\r\n private centralPointMode: string;\r\n private minGlobalPointCount: number;\r\n private groupByTheme: boolean;\r\n private tilingScheme: any;\r\n private levelIndexByTileLevel: Map<number, number> = new Map();\r\n private _updateTimer: number | null = null;\r\n private _updateDelay: number = 100;\r\n private _tilesRetryCount: number = 0;\r\n private _tilesRetryMax: number = 100;\r\n private _cameraDirty: boolean = false;\r\n private _tileLoadListener: ((pending: number) => void) | null = null;\r\n private _cameraChangedHandler: (() => void) | null = null;\r\n\r\n constructor(Cesium: any, viewer: any, options: AggregatorOptions) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n\r\n this.labelPool = options.labelPool;\r\n this.threshold = options.threshold ?? 10;\r\n this.displayLimit = options.displayLimit ?? 100;\r\n this.maxLevel = options.maxLevel ?? 5;\r\n this.debugCurrentGrids = options.debugCurrentGrids ?? false;\r\n\r\n this.clusterTheme = options.clusterTheme ?? 'cluster-label';\r\n this.pointTheme = options.pointTheme ?? 'point-label';\r\n this.centralPointMode = options.centralPointMode ?? 'central';\r\n this.minGlobalPointCount = options.minGlobalPointCount ?? 0;\r\n this.groupByTheme = options.groupByTheme ?? false;\r\n\r\n const globe = this.viewer.scene && this.viewer.scene.globe;\r\n const surface = globe && (globe as any)._surface;\r\n const provider = surface && (surface as any)._tileProvider;\r\n this.tilingScheme =\r\n provider?.tilingScheme || new this.Cesium.GeographicTilingScheme();\r\n this.levels = this._createLevels();\r\n this._buildLevels();\r\n\r\n this._updateFn = this._update.bind(this);\r\n\r\n if (globe) {\r\n this._tileLoadListener = (pending: number) => {\r\n if (pending === 0 && this._cameraDirty) {\r\n this._cameraDirty = false;\r\n this._scheduleUpdate();\r\n }\r\n };\r\n (globe as any).tileLoadProgressEvent.addEventListener(this._tileLoadListener);\r\n }\r\n\r\n this._cameraChangedHandler = () => {\r\n const currentScene = this.viewer.scene;\r\n const currentGlobe = currentScene && currentScene.globe;\r\n if (!currentGlobe) {\r\n this._scheduleUpdate();\r\n return;\r\n }\r\n\r\n this._cameraDirty = true;\r\n\r\n if ((currentGlobe as any).tilesLoaded) {\r\n this._cameraDirty = false;\r\n this._scheduleUpdate();\r\n }\r\n };\r\n\r\n this.viewer.camera.changed.addEventListener(this._cameraChangedHandler);\r\n }\r\n\r\n public setGroupByTheme(groupByTheme: boolean, rebuild: boolean = true, update: boolean = true) {\r\n if (this.groupByTheme === groupByTheme) {\r\n if (update) this._update();\r\n return;\r\n }\r\n this.groupByTheme = groupByTheme;\r\n if (rebuild) {\r\n this._buildLevels();\r\n }\r\n if (update) {\r\n this._update();\r\n }\r\n }\r\n\r\n public setMinGlobalPointCount(count: number, update: boolean = true) {\r\n this.minGlobalPointCount = count;\r\n if (update) {\r\n this._update();\r\n }\r\n }\r\n\r\n public setThreshold(threshold: number, update: boolean = true) {\r\n this.threshold = threshold;\r\n if (update) {\r\n this._update();\r\n }\r\n }\r\n\r\n public setDebugCurrentGrids(debug: boolean, update: boolean = true) {\r\n this.debugCurrentGrids = debug;\r\n if (!debug) {\r\n this._clearDebugGrids();\r\n }\r\n if (update) {\r\n this._update();\r\n }\r\n }\r\n\r\n private _createLevels(): GridLevel[] {\r\n const levels: GridLevel[] = [];\r\n this.levelIndexByTileLevel = new Map();\r\n\r\n const minLevel = 0;\r\n const maxLevel = this.maxLevel;\r\n\r\n let index = 0;\r\n for (let tileLevel = minLevel; tileLevel <= maxLevel; tileLevel++, index++) {\r\n const size = 360 / Math.pow(2, tileLevel);\r\n levels.push({\r\n level: tileLevel,\r\n size,\r\n minViewWidth: size * 4,\r\n });\r\n this.levelIndexByTileLevel.set(tileLevel, index);\r\n }\r\n return levels;\r\n }\r\n\r\n public addPoints(points: PointData[]) {\r\n this.points = points;\r\n this._buildLevels();\r\n }\r\n\r\n public appendPoints(newPoints: PointData[], isUpdate: boolean = true) {\r\n for (const pt of newPoints) {\r\n this.points.push(pt);\r\n }\r\n for (const pt of newPoints) {\r\n this._addPointToGrid(pt);\r\n }\r\n if (isUpdate) {\r\n this._scheduleUpdate();\r\n }\r\n }\r\n\r\n private _scheduleUpdate() {\r\n if (this._updateTimer !== null) {\r\n clearTimeout(this._updateTimer);\r\n }\r\n this._updateTimer = window.setTimeout(() => {\r\n this._update();\r\n this._updateTimer = null;\r\n }, this._updateDelay);\r\n }\r\n\r\n public updatePoint(newData: Partial<PointData>) {\r\n const idx = this.points.findIndex((p: PointData) => p.id === newData.id);\r\n if (idx === -1) return;\r\n\r\n const oldPt = this.points[idx];\r\n\r\n for (const level of this.levels) {\r\n const tileLevel = level.level;\r\n const grid = this.gridLayers.get(tileLevel);\r\n if (!grid) continue;\r\n\r\n const carto = this.Cesium.Cartographic.fromDegrees(oldPt.lon, oldPt.lat);\r\n const tileXY = this.tilingScheme.positionToTileXY(\r\n carto,\r\n tileLevel,\r\n new this.Cesium.Cartesian2(),\r\n );\r\n if (!tileXY) continue;\r\n const key = `${tileXY.x}_${tileXY.y}`;\r\n const cell = grid.get(key);\r\n if (cell) {\r\n // 1. remove from allPoints\r\n const iAll = cell.allPoints.findIndex((p: PointData) => p.id === newData.id);\r\n if (iAll !== -1) cell.allPoints.splice(iAll, 1);\r\n\r\n // 2. remove from skipPoints or groups\r\n if (oldPt.data?.skipAggregation) {\r\n const iSkip = cell.skipPoints.findIndex((p: PointData) => p.id === newData.id);\r\n if (iSkip !== -1) cell.skipPoints.splice(iSkip, 1);\r\n } else {\r\n const theme = this.groupByTheme ? oldPt.data?.theme : this.clusterTheme;\r\n const group = cell.groups.get(theme);\r\n if (group) {\r\n const iGroup = group.findIndex((p: PointData) => p.id === newData.id);\r\n if (iGroup !== -1) group.splice(iGroup, 1);\r\n if (group.length === 0) cell.groups.delete(theme);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 替换数据\r\n const updated = { ...oldPt, ...newData };\r\n this.points[idx] = updated;\r\n\r\n // 加入新 grid\r\n this._addPointToGrid(updated);\r\n this._update();\r\n }\r\n\r\n public removePointsById(ids: string[]) {\r\n const idSet = new Set(ids);\r\n this.points = this.points.filter((p: PointData) => !idSet.has(p.id));\r\n\r\n for (const level of this.levels) {\r\n const grid = this.gridLayers.get(level.level);\r\n if (!grid) continue;\r\n for (const [key, cell] of grid.entries()) {\r\n // Filter allPoints\r\n cell.allPoints = cell.allPoints.filter((p: PointData) => !idSet.has(p.id));\r\n\r\n // Filter skipPoints\r\n cell.skipPoints = cell.skipPoints.filter((p: PointData) => !idSet.has(p.id));\r\n\r\n // Filter groups\r\n for (const [groupKey, groupPoints] of cell.groups.entries()) {\r\n const filteredGroup = groupPoints.filter((p: PointData) => !idSet.has(p.id));\r\n if (filteredGroup.length === 0) {\r\n cell.groups.delete(groupKey);\r\n } else {\r\n cell.groups.set(groupKey, filteredGroup);\r\n }\r\n }\r\n\r\n // Cleanup empty cell if needed (optional)\r\n if (cell.allPoints.length === 0) {\r\n grid.delete(key);\r\n }\r\n }\r\n }\r\n this._update();\r\n }\r\n\r\n private _buildLevels() {\r\n this.gridLayers.clear();\r\n for (const level of this.levels) {\r\n this.gridLayers.set(level.level, new Map<string, GridCell>());\r\n }\r\n for (const pt of this.points) {\r\n this._addPointToGrid(pt);\r\n }\r\n }\r\n\r\n private _addPointToGrid(pt: PointData) {\r\n for (const level of this.levels) {\r\n const tileLevel = level.level;\r\n const grid = this.gridLayers.get(tileLevel);\r\n if (!grid) continue;\r\n\r\n const carto = this.Cesium.Cartographic.fromDegrees(pt.lon, pt.lat);\r\n const tileXY = this.tilingScheme.positionToTileXY(\r\n carto,\r\n tileLevel,\r\n new this.Cesium.Cartesian2(),\r\n );\r\n if (!tileXY) continue;\r\n const key = `${tileXY.x}_${tileXY.y}`;\r\n\r\n let cell = grid.get(key);\r\n if (!cell) {\r\n cell = {\r\n allPoints: [],\r\n groups: new Map(),\r\n skipPoints: [],\r\n };\r\n grid.set(key, cell);\r\n }\r\n\r\n cell.allPoints.push(pt);\r\n\r\n if (pt.data?.billboard?.[0]?.skipAggregation) {\r\n cell.skipPoints.push(pt);\r\n } else {\r\n const theme = this.groupByTheme ? pt.data?.billboard?.[0]?.theme : this.clusterTheme;\r\n if (!cell.groups.has(theme)) {\r\n cell.groups.set(theme, []);\r\n }\r\n cell.groups.get(theme)!.push(pt);\r\n }\r\n }\r\n }\r\n\r\n private _update() {\r\n if (!this.labelPool) return;\r\n this.labelPool.reset();\r\n\r\n if (this.debugCurrentGrids) this._clearDebugGrids();\r\n\r\n const effectiveThreshold =\r\n this.points.length < this.minGlobalPointCount ? Infinity : this.threshold;\r\n\r\n let labelCount = 0;\r\n\r\n const processCell = (levelIdx: number, lonIdx: number, latIdx: number) => {\r\n if (labelCount >= this.displayLimit) return;\r\n if (levelIdx < 0) return;\r\n // 当超过最大层级时,强制使用最大层级\r\n if (levelIdx >= this.levels.length) {\r\n levelIdx = this.levels.length - 1;\r\n }\r\n const level = this.levels[levelIdx];\r\n const isLastLevel = levelIdx === this.levels.length - 1;\r\n const tileLevel = level.level;\r\n const grid = this.gridLayers.get(tileLevel);\r\n if (!grid) return;\r\n const key = `${lonIdx}_${latIdx}`;\r\n const cell = grid.get(key);\r\n if (!cell) return;\r\n\r\n const rect = this.tilingScheme.tileXYToRectangle(lonIdx, latIdx, tileLevel);\r\n const west = this.Cesium.Math.toDegrees(rect.west);\r\n const south = this.Cesium.Math.toDegrees(rect.south);\r\n const east = this.Cesium.Math.toDegrees(rect.east);\r\n const north = this.Cesium.Math.toDegrees(rect.north);\r\n const centerLon = (west + east) / 2;\r\n const centerLat = (south + north) / 2;\r\n\r\n for (const p of cell.skipPoints) {\r\n if (p.data?.show === false) continue;\r\n if (labelCount >= this.displayLimit) break;\r\n this.labelPool.add(p.data, {\r\n id: `point-${p.id}`,\r\n lon: p.lon,\r\n lat: p.lat,\r\n height: p.height,\r\n theme: p.data?.billboard?.[0]?.theme || this.pointTheme,\r\n style: p.style,\r\n });\r\n labelCount++;\r\n }\r\n\r\n if (labelCount >= this.displayLimit) {\r\n if (this.debugCurrentGrids) {\r\n this._drawDebugGrid(west, south, east, north, key);\r\n }\r\n return;\r\n }\r\n\r\n for (const [groupKey, rawGroupPoints] of cell.groups) {\r\n const groupPoints = rawGroupPoints.filter((p: PointData) => p.data?.show !== false);\r\n if (groupPoints.length === 0) continue;\r\n\r\n let clusterLon = centerLon;\r\n let clusterLat = centerLat;\r\n if (this.centralPointMode == 'firstPoint') {\r\n clusterLon = groupPoints[0]?.lon || 0;\r\n clusterLat = groupPoints[0]?.lat || 0;\r\n }\r\n\r\n if (isLastLevel || groupPoints.length < effectiveThreshold) {\r\n for (const p of groupPoints) {\r\n if (labelCount >= this.displayLimit) break;\r\n this.labelPool.add(p.data, {\r\n id: `point-${p.id}`,\r\n lon: p.lon,\r\n lat: p.lat,\r\n height: p.height,\r\n theme: p.data?.billboard?.[0]?.theme || this.pointTheme,\r\n style: p.style,\r\n });\r\n labelCount++;\r\n }\r\n } else {\r\n if (labelCount >= this.displayLimit) break;\r\n const customClusterTheme = groupPoints[0]?.data?.billboard?.[0]?.theme;\r\n const finalTheme = customClusterTheme || this.clusterTheme;\r\n const clusterId = this.groupByTheme\r\n ? `cluster-${levelIdx}-${lonIdx}-${latIdx}-${groupKey}`\r\n : `cluster-${levelIdx}-${lonIdx}-${latIdx}`;\r\n this.labelPool.add(\r\n {\r\n id: clusterId,\r\n billboard: groupPoints[0]?.data?.billboard || [],\r\n count: groupPoints.length,\r\n gridKey: key,\r\n points: groupPoints,\r\n aggregationGroup: groupKey,\r\n },\r\n {\r\n id: clusterId,\r\n lon: clusterLon,\r\n lat: clusterLat,\r\n theme: finalTheme,\r\n },\r\n );\r\n labelCount++;\r\n }\r\n }\r\n\r\n if (this.debugCurrentGrids) {\r\n const tileLevelForDebug = this.levels[levelIdx].level;\r\n this._drawDebugGrid(\r\n west,\r\n south,\r\n east,\r\n north,\r\n `L:${tileLevelForDebug} X:${lonIdx} Y:${latIdx}`,\r\n );\r\n }\r\n };\r\n\r\n try {\r\n const globe = this.viewer.scene && this.viewer.scene.globe;\r\n const surface = globe && (globe as any)._surface;\r\n let tiles: any[] | undefined;\r\n if (surface) {\r\n tiles =\r\n (surface as any)._tilesToRender || (surface as any)._tilesToRenderByTextureCount;\r\n }\r\n if (!tiles || tiles.length === 0) {\r\n for (const p of this.points) {\r\n if (labelCount >= this.displayLimit) break;\r\n if (p.data?.show === false) continue;\r\n this.labelPool.add(p.data, {\r\n id: `point-${p.id}`,\r\n lon: p.lon,\r\n lat: p.lat,\r\n height: p.height,\r\n theme: p.data?.billboard?.[0]?.theme || this.pointTheme,\r\n style: (p as any).style,\r\n });\r\n labelCount++;\r\n }\r\n this.labelPool.cleanup();\r\n if (this.points.length > 0 && this._tilesRetryCount < this._tilesRetryMax) {\r\n this._tilesRetryCount++;\r\n this._scheduleUpdate();\r\n }\r\n return;\r\n }\r\n this._tilesRetryCount = 0;\r\n\r\n const visited = new Set<string>();\r\n for (const t of tiles) {\r\n const rect = t.rectangle;\r\n const tileLevel = t._level ?? t.level;\r\n if (!rect || typeof tileLevel !== 'number') continue;\r\n\r\n let levelIdx = this.levelIndexByTileLevel.get(tileLevel);\r\n if (levelIdx === undefined) {\r\n if (this.levels.length === 0) continue;\r\n const minDefinedLevel = this.levels[0].level;\r\n const maxDefinedLevel = this.levels[this.levels.length - 1].level;\r\n if (tileLevel > maxDefinedLevel) {\r\n levelIdx = this.levels.length - 1;\r\n } else if (tileLevel < minDefinedLevel) {\r\n levelIdx = 0;\r\n } else {\r\n let nearestIndex = 0;\r\n let minDiff = Infinity;\r\n for (let i = 0; i < this.levels.length; i++) {\r\n const diff = Math.abs(this.levels[i].level - tileLevel);\r\n if (diff < minDiff) {\r\n minDiff = diff;\r\n nearestIndex = i;\r\n }\r\n }\r\n levelIdx = nearestIndex;\r\n }\r\n }\r\n if (levelIdx === undefined) continue;\r\n const targetTileLevel = this.levels[levelIdx].level;\r\n\r\n const tileX = (t as any)._x ?? (t as any).x;\r\n const tileY = (t as any)._y ?? (t as any).y;\r\n\r\n if (typeof tileX === 'number' && typeof tileY === 'number') {\r\n let lonIdx = tileX;\r\n let latIdx = tileY;\r\n\r\n const diff = tileLevel - targetTileLevel;\r\n if (diff > 0) {\r\n const factor = 1 << diff;\r\n lonIdx = Math.floor(tileX / factor);\r\n latIdx = Math.floor(tileY / factor);\r\n } else if (diff < 0) {\r\n const factor = 1 << -diff;\r\n lonIdx = tileX * factor;\r\n latIdx = tileY * factor;\r\n }\r\n\r\n const key = `${targetTileLevel}_${lonIdx}_${latIdx}`;\r\n if (visited.has(key)) continue;\r\n visited.add(key);\r\n processCell(levelIdx, lonIdx, latIdx);\r\n continue;\r\n }\r\n\r\n const level = this.levels[levelIdx];\r\n const size = level.size;\r\n const tileWestDeg = this.Cesium.Math.toDegrees(rect.west);\r\n const tileEastDeg = this.Cesium.Math.toDegrees(rect.east);\r\n const tileSouthDeg = this.Cesium.Math.toDegrees(rect.south);\r\n const tileNorthDeg = this.Cesium.Math.toDegrees(rect.north);\r\n\r\n const westIdx = Math.floor((tileWestDeg - -180) / size);\r\n const eastIdx = Math.floor((tileEastDeg - -180) / size);\r\n const southIdx = Math.floor((tileSouthDeg - -90) / size);\r\n const northIdx = Math.floor((tileNorthDeg - -90) / size);\r\n\r\n for (let lonIdx = westIdx; lonIdx <= eastIdx; lonIdx++) {\r\n for (let latIdx = southIdx; latIdx <= northIdx; latIdx++) {\r\n const key = `${targetTileLevel}_${lonIdx}_${latIdx}`;\r\n if (visited.has(key)) continue;\r\n visited.add(key);\r\n processCell(levelIdx, lonIdx, latIdx);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n this.labelPool.cleanup();\r\n return;\r\n }\r\n this.labelPool.cleanup();\r\n }\r\n\r\n refresh() {\r\n this._update();\r\n }\r\n\r\n private _drawDebugGrid(\r\n west: number,\r\n south: number,\r\n east: number,\r\n north: number,\r\n text: string,\r\n ) {\r\n const rect = this.Cesium.Rectangle.fromDegrees(west, south, east, north);\r\n const entity = this.viewer.entities.add({\r\n rectangle: {\r\n coordinates: rect,\r\n material: this.Cesium.Color.YELLOW.withAlpha(0.2),\r\n outline: true,\r\n outlineColor: this.Cesium.Color.RED,\r\n height: 0,\r\n },\r\n label: {\r\n text,\r\n font: '14px sans-serif',\r\n fillColor: this.Cesium.Color.BLACK,\r\n outlineColor: this.Cesium.Color.WHITE,\r\n outlineWidth: 2,\r\n style: this.Cesium.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: this.Cesium.VerticalOrigin.CENTER,\r\n horizontalOrigin: this.Cesium.HorizontalOrigin.CENTER,\r\n },\r\n });\r\n this.debugGrids.push(entity);\r\n }\r\n\r\n private _clearDebugGrids() {\r\n for (const e of this.debugGrids) {\r\n this.viewer.entities.remove(e);\r\n }\r\n this.debugGrids = [];\r\n }\r\n\r\n public destroy() {\r\n if (this._cameraChangedHandler) {\r\n this.viewer.camera.changed.removeEventListener(this._cameraChangedHandler);\r\n this._cameraChangedHandler = null;\r\n }\r\n const scene = this.viewer.scene;\r\n const globe = scene && scene.globe;\r\n if (globe && this._tileLoadListener) {\r\n (globe as any).tileLoadProgressEvent.removeEventListener(this._tileLoadListener);\r\n this._tileLoadListener = null;\r\n }\r\n if (this._updateTimer !== null) {\r\n clearTimeout(this._updateTimer);\r\n this._updateTimer = null;\r\n }\r\n this.labelPool.reset();\r\n this._clearDebugGrids();\r\n }\r\n}\r\n","export enum MarkerEventKey {\r\n Click = 'marker:click',\r\n DoubleClick = 'marker:dblclick',\r\n RightClick = 'marker:rightclick',\r\n MouseEnter = 'marker:mouseenter',\r\n MouseLeave = 'marker:mouseleave',\r\n MouseDown = 'marker:mousedown',\r\n MouseUp = 'marker:mouseup',\r\n}\r\n\r\ninterface ListenerItem<T = any> {\r\n name: string;\r\n fn: (data: T, event: Event) => void;\r\n once?: boolean;\r\n}\r\n\r\nexport { ListenerItem };\r\n\r\nexport class MarkerEventBus {\r\n private listenerMap = new Map<MarkerEventKey, Map<string, ListenerItem>>();\r\n\r\n /**\r\n * 添加监听器\r\n * @param key 事件 key\r\n * @param listener 监听器项\r\n * @param overwrite 是否覆盖同名监听器\r\n * @returns 是否成功添加\r\n */\r\n addListener(key: MarkerEventKey, listener: ListenerItem, overwrite: boolean = false): boolean {\r\n let map = this.listenerMap.get(key);\r\n if (!map) {\r\n map = new Map();\r\n this.listenerMap.set(key, map);\r\n }\r\n\r\n if (map.has(listener.name)) {\r\n if (overwrite) {\r\n console.warn(\r\n `[MarkerEventBus] Overwriting listener \"${listener.name}\" for event \"${key}\".`,\r\n );\r\n map.set(listener.name, listener);\r\n return true;\r\n } else {\r\n console.warn(\r\n `[MarkerEventBus] Listener \"${listener.name}\" for event \"${key}\" already exists. Use overwrite=true to replace it.`,\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n map.set(listener.name, listener);\r\n return true;\r\n }\r\n\r\n /**\r\n * 移除某个 key 的所有监听器\r\n */\r\n removeListenerByKey(key: MarkerEventKey): boolean {\r\n const existed = this.listenerMap.has(key);\r\n this.listenerMap.set(key, new Map());\r\n return existed;\r\n }\r\n\r\n /**\r\n * 移除某个 key 下的指定名字的监听器\r\n */\r\n removeListenerByKeyAndName(key: MarkerEventKey, name: string): boolean {\r\n const map = this.listenerMap.get(key);\r\n if (!map) return false;\r\n return map.delete(name);\r\n }\r\n\r\n /**\r\n * 运行监听器\r\n */\r\n runListener<T = any>(key: MarkerEventKey, data: T, e: Event) {\r\n const map = this.listenerMap.get(key);\r\n if (!map) return;\r\n\r\n for (const [name, listener] of map.entries()) {\r\n try {\r\n listener.fn(data, e);\r\n } catch (err) {\r\n console.error(`Error in listener \"${name}\" for event \"${key}\":`, err);\r\n }\r\n\r\n if (listener.once) {\r\n map.delete(name);\r\n }\r\n }\r\n }\r\n}\r\n","import { MarkerEventKey, MarkerEventBus } from './MarkerEvent';\r\n\r\n/**\r\n * 单个标签实例\r\n */\r\ninterface LabelInstance {\r\n id: string;\r\n el: HTMLDivElement;\r\n theme: string;\r\n data?: any;\r\n notCreateElement?: boolean;\r\n unload?: any;\r\n}\r\n\r\n/**\r\n * 主题配置项\r\n */\r\ninterface ThemeOptions {\r\n /**\r\n * 创建标签 DOM 内容的方法\r\n */\r\n createElement: (\r\n el: HTMLDivElement,\r\n context: { id: string; theme: string; data: any },\r\n options: ThemeOptions,\r\n ) => any;\r\n\r\n /**\r\n * 可选配置,如偏移量\r\n */\r\n options?: {\r\n offset?: { x?: number; y?: number };\r\n };\r\n}\r\n\r\n/**\r\n * 标签添加时的参数\r\n */\r\ninterface LabelOptions {\r\n id: string;\r\n lon: number;\r\n lat: number;\r\n height?: number;\r\n theme: string;\r\n show?: boolean;\r\n notCreateElement?: boolean;\r\n style?: {\r\n [key: string]: string;\r\n };\r\n}\r\n\r\nexport { LabelOptions, LabelInstance, ThemeOptions };\r\n\r\n/**\r\n * 自定义事件与 DOM 事件的映射\r\n */\r\nexport const DOM_EVENT_MAP: Record<MarkerEventKey, keyof HTMLElementEventMap> = {\r\n [MarkerEventKey.Click]: 'click',\r\n [MarkerEventKey.DoubleClick]: 'dblclick',\r\n [MarkerEventKey.RightClick]: 'contextmenu',\r\n [MarkerEventKey.MouseEnter]: 'mouseenter',\r\n [MarkerEventKey.MouseLeave]: 'mouseleave',\r\n [MarkerEventKey.MouseDown]: 'mousedown',\r\n [MarkerEventKey.MouseUp]: 'mouseup',\r\n};\r\n\r\n/**\r\n * 用于管理 Cesium HTML 标签的池,支持主题渲染、事件分发、动态更新等功能\r\n */\r\nexport class HtmlOverlayLabelPool {\r\n private viewer: any;\r\n private Cesium: any;\r\n private container: HTMLDivElement;\r\n private labels: Map<string, LabelInstance> = new Map();\r\n private activeIds: Set<string> = new Set();\r\n private _updateFn: () => void;\r\n private themes: Record<string, ThemeOptions> = {};\r\n public eventBus: MarkerEventBus;\r\n public openWheel = true;\r\n /**\r\n * 构造函数\r\n * @param Cesium Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param containerId HTML 容器 ID(默认:\"html-label-container\")\r\n * @param eventBus 可选:自定义事件总线\r\n */\r\n constructor(\r\n Cesium: any,\r\n viewer: any,\r\n containerId: string = 'html-label-container',\r\n eventBus?: MarkerEventBus,\r\n openWheel: boolean = true,\r\n ) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n this.container = this._createContainer(containerId);\r\n this._updateFn = this._update.bind(this);\r\n this.viewer.scene.postRender.addEventListener(this._updateFn);\r\n this.eventBus = eventBus || new MarkerEventBus();\r\n this.openWheel = openWheel;\r\n }\r\n\r\n /**\r\n * 创建标签容器\r\n */\r\n private _createContainer(id: string): HTMLDivElement {\r\n let container = document.getElementById(id) as HTMLDivElement;\r\n if (!container) {\r\n container = document.createElement('div');\r\n container.id = id;\r\n Object.assign(container.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n pointerEvents: 'none',\r\n width: '100%',\r\n height: '100%',\r\n zIndex: '100',\r\n overflow: 'hidden',\r\n });\r\n document.body.appendChild(container);\r\n }\r\n return container;\r\n }\r\n\r\n /**\r\n * 注册标签主题\r\n */\r\n registerTheme(themeName: string, options: ThemeOptions) {\r\n this.themes[themeName] = options;\r\n }\r\n\r\n /**\r\n * 添加单个标签\r\n */\r\n add(data: any, options: LabelOptions) {\r\n const {\r\n id,\r\n lon,\r\n lat,\r\n height = 0,\r\n theme,\r\n show = true,\r\n notCreateElement = false,\r\n style,\r\n } = options;\r\n\r\n const themeOptions = this.themes[theme];\r\n if (!themeOptions) {\r\n console.warn(`Theme \"${theme}\" not registered`);\r\n return;\r\n }\r\n\r\n let label = this.labels.get(id);\r\n if (!label) {\r\n const el = document.createElement('div');\r\n Object.assign(el.style, {\r\n position: 'absolute',\r\n transform: 'translate(0, 0)',\r\n pointerEvents: 'auto',\r\n ...(options.style || {}),\r\n });\r\n\r\n // 绑定 DOM 事件到事件总线\r\n for (const [key, domEvent] of Object.entries(DOM_EVENT_MAP)) {\r\n el.addEventListener(domEvent, (e: Event) => {\r\n e.stopPropagation();\r\n const labelData = this.labels.get(id);\r\n this.eventBus.runListener(key as MarkerEventKey, labelData, e);\r\n });\r\n\r\n // 滚轮期间禁止点击\r\n let lastTime = 0;\r\n el.addEventListener('wheel', (event) => {\r\n if (!this.openWheel) return;\r\n const dom = event.currentTarget as HTMLElement;\r\n lastTime = Date.now();\r\n const currTime = lastTime;\r\n dom.style.pointerEvents = 'none';\r\n setTimeout(() => {\r\n if (lastTime === currTime) {\r\n dom.style.pointerEvents = 'auto';\r\n }\r\n }, 2000);\r\n });\r\n }\r\n\r\n let unload = null;\r\n if (!notCreateElement || show) {\r\n try {\r\n unload = themeOptions.createElement(el, { id, theme, data }, themeOptions) || {};\r\n } catch (err) {\r\n console.error(`Error updating label element for id \"${id}\":`, err);\r\n }\r\n this.container.appendChild(el);\r\n }\r\n label = { id, el, theme, data, notCreateElement, unload: unload };\r\n this.labels.set(id, label);\r\n } else {\r\n label.theme = theme;\r\n label.data = data;\r\n label.notCreateElement = notCreateElement;\r\n\r\n // 若已存在,则更新 DOM 内容\r\n try {\r\n label.unload = themeOptions.createElement(label.el, { id, theme, data }, themeOptions);\r\n if (!notCreateElement || show) {\r\n this.container.appendChild(label.el);\r\n }\r\n } catch (err) {\r\n console.error(`Error updating label element for id \"${id}\":`, err);\r\n }\r\n }\r\n\r\n // 存储坐标用于后续位置更新\r\n label.el.dataset.lon = String(lon);\r\n label.el.dataset.lat = String(lat);\r\n label.el.dataset.height = String(height);\r\n\r\n label.el.style.zIndex = style?.zIndex || '1';\r\n label.el.style.display = show ? 'block' : 'none';\r\n if (show) {\r\n this.activeIds.add(id);\r\n }\r\n }\r\n\r\n /**\r\n * 批量添加标签\r\n */\r\n addBatch(items: Array<{ data: any; options: LabelOptions }>) {\r\n for (const { data, options } of items) {\r\n this.add(data, options);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 批量移除标签\r\n */\r\n removeByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n this.unloadByLabel(label);\r\n this.labels.delete(id);\r\n this.activeIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n unloadByLabel(label: LabelInstance) {\r\n label.el.remove();\r\n if (label?.unload && typeof label.unload === 'function') label?.unload();\r\n label.unload = null;\r\n }\r\n\r\n /**\r\n * 移除所有标签\r\n */\r\n removeAll() {\r\n for (const label of this.labels.values()) {\r\n this.unloadByLabel(label);\r\n }\r\n this.labels.clear();\r\n this.activeIds.clear();\r\n }\r\n\r\n /**\r\n * 更新标签的数据并刷新内容\r\n */\r\n update(id: string, newData: any) {\r\n const label = this.labels.get(id);\r\n if (!label) {\r\n console.warn(`Label with id \"${id}\" not found for update.`);\r\n return;\r\n }\r\n\r\n const theme = this.themes[label.theme];\r\n if (!theme) {\r\n console.warn(`Theme \"${label.theme}\" not registered.`);\r\n return;\r\n }\r\n\r\n try {\r\n theme.createElement(label.el, { id, theme: label.theme, data: newData }, theme);\r\n } catch (err) {\r\n console.error(`Failed to update label \"${id}\":`, err);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 批量隐藏标签\r\n */\r\n hideByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏所有标签\r\n */\r\n hideAll() {\r\n for (const label of this.labels.values()) {\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(label.id);\r\n }\r\n }\r\n\r\n /**\r\n * 条件过滤隐藏标签\r\n */\r\n hideFilter(filter: (data: any) => boolean) {\r\n for (const label of this.labels.values()) {\r\n if (!filter(label.data)) continue;\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(label.id);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 显示标签\r\n */\r\n showByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n if (label.notCreateElement || !label.el.parentNode) {\r\n this.container.appendChild(label.el);\r\n }\r\n if (!label.unload) {\r\n try {\r\n const themeOptions = this.themes[label.theme];\r\n if (!themeOptions) {\r\n console.warn(`Theme \"${label.theme}\" not registered`);\r\n return;\r\n }\r\n label.unload =\r\n themeOptions.createElement(\r\n label.el,\r\n { id, theme: label.theme, data: label.data },\r\n themeOptions,\r\n ) || {};\r\n } catch (err) {\r\n console.error(`Error creating label element for theme \"${label.theme}\":`, err);\r\n return;\r\n }\r\n }\r\n\r\n label.el.style.display = 'block';\r\n this.activeIds.add(id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 检查标签是否存在\r\n */\r\n has(id: string): boolean {\r\n return this.labels.has(id);\r\n }\r\n\r\n /**\r\n * 清空活跃 ID 列表(不影响 DOM)\r\n */\r\n reset() {\r\n for (const id of this.activeIds.values()) {\r\n let label = this.labels.get(id);\r\n label && this.unloadByLabel(label);\r\n }\r\n this.activeIds.clear();\r\n }\r\n\r\n /**\r\n * 清理当前未活跃的标签(隐藏而不移除 DOM)\r\n */\r\n cleanup() {\r\n for (const [id, label] of this.labels.entries()) {\r\n if (!this.activeIds.has(id)) {\r\n label.el.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 经纬度 -> 自动地形高度修正 -> Cartesian3 -> 屏幕坐标\r\n */\r\n async toWindowPositionByLonLat(lon: number, lat: number): Promise<any> {\r\n const Cesium = this.Cesium;\r\n const scene = this.viewer.scene;\r\n\r\n // 1. 经纬度列表\r\n const positions = [Cesium.Cartographic.fromDegrees(lon, lat)];\r\n\r\n // 2. 使用 clampToHeightMostDetailed 获取真实地形高度\r\n let heightResult;\r\n try {\r\n heightResult = await scene.clampToHeightMostDetailed(positions);\r\n } catch (e) {\r\n console.warn('clampToHeightMostDetailed failed, fallback to ellipsoid height.');\r\n }\r\n\r\n let finalHeight = 0;\r\n if (heightResult && heightResult[0] && heightResult[0].height != null) {\r\n finalHeight = heightResult[0].height; // 用户偏好:height[0].height\r\n } else {\r\n // 如果地形未开启,则 fallback 椭球高度\r\n finalHeight = 0;\r\n }\r\n\r\n // 3. 生成真实位置 Cartesian3\r\n const worldPos = Cesium.Cartesian3.fromDegrees(lon, lat, finalHeight);\r\n\r\n // 4. 转屏幕像素坐标\r\n return this.toWindowCoordinates(worldPos);\r\n }\r\n\r\n /**\r\n * 坐标转换:经纬度 -> 屏幕像素坐标\r\n */\r\n toWindowCoordinates(position: any): any {\r\n const scene = this.viewer.scene;\r\n const st = this.Cesium.SceneTransforms;\r\n if (typeof st?.wgs84ToWindowCoordinates === 'function') {\r\n return st.wgs84ToWindowCoordinates(scene, position);\r\n }\r\n if (typeof st?.worldToWindowCoordinates === 'function') {\r\n return st.worldToWindowCoordinates(scene, position);\r\n }\r\n\r\n console.warn('No compatible window coordinate transform function found.');\r\n return undefined;\r\n }\r\n\r\n /**\r\n * 每帧刷新所有活跃标签的位置\r\n */\r\n private async _update() {\r\n const scene = this.viewer.scene;\r\n\r\n for (const id of this.activeIds) {\r\n const label = this.labels.get(id);\r\n if (!label) continue;\r\n\r\n const lon = parseFloat(label.el.dataset.lon!);\r\n const lat = parseFloat(label.el.dataset.lat!);\r\n const height = parseFloat(label.el.dataset.height || '0');\r\n\r\n const position = this.Cesium.Cartesian3.fromDegrees(lon, lat, height);\r\n const screenPosition = this.toWindowCoordinates(position);\r\n\r\n if (this.Cesium.defined(screenPosition)) {\r\n const theme = this.themes[label.theme];\r\n const offset = theme.options?.offset || {};\r\n const offsetX = offset.x || 0;\r\n const offsetY = offset.y || 0;\r\n\r\n label.el.style.left = `${screenPosition.x}px`;\r\n label.el.style.top = `${screenPosition.y}px`;\r\n label.el.style.transform = `translate(${offsetX}px, ${offsetY}px)`;\r\n label.el.style.display = 'block';\r\n } else {\r\n label.el.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 销毁标签池,清理监听器和 DOM\r\n */\r\n destroy() {\r\n this.viewer.scene.postRender.removeEventListener(this._updateFn);\r\n // this.container.remove();\r\n this.labels.clear();\r\n this.activeIds.clear();\r\n }\r\n}\r\n","export class TooltipManager {\r\n private tooltipEl: HTMLDivElement;\r\n private visible: boolean = false;\r\n private offsetX = 10;\r\n private offsetY = -20;\r\n private onMouseMove: ((e: MouseEvent) => void) | null = null;\r\n\r\n constructor() {\r\n this.tooltipEl = document.createElement(\"div\");\r\n this.tooltipEl.style.position = \"fixed\";\r\n this.tooltipEl.style.pointerEvents = \"none\";\r\n this.tooltipEl.style.zIndex = \"10000\";\r\n this.tooltipEl.style.padding = \"4px 8px\";\r\n this.tooltipEl.style.borderRadius = \"4px\";\r\n this.tooltipEl.style.background = \"rgba(0, 0, 0, 0.7)\";\r\n this.tooltipEl.style.color = \"#fff\";\r\n this.tooltipEl.style.fontSize = \"13px\";\r\n this.tooltipEl.style.transition = \"opacity 0.1s ease\";\r\n this.tooltipEl.style.opacity = \"0\";\r\n\r\n document.body.appendChild(this.tooltipEl);\r\n\r\n this.onMouseMove = (e: MouseEvent) => {\r\n if (!this.visible) return;\r\n this.tooltipEl.style.left = `${e.clientX + this.offsetX}px`;\r\n this.tooltipEl.style.top = `${e.clientY + this.offsetY}px`;\r\n };\r\n\r\n window.addEventListener(\"mousemove\", this.onMouseMove);\r\n }\r\n\r\n show(text: string) {\r\n this.tooltipEl.innerText = text;\r\n this.tooltipEl.style.opacity = \"1\";\r\n this.visible = true;\r\n }\r\n\r\n hide() {\r\n this.tooltipEl.style.opacity = \"0\";\r\n this.visible = false;\r\n }\r\n\r\n destroy() {\r\n if (this.onMouseMove) {\r\n window.removeEventListener(\"mousemove\", this.onMouseMove);\r\n this.onMouseMove = null;\r\n }\r\n if (this.tooltipEl.parentElement) {\r\n this.tooltipEl.parentElement.removeChild(this.tooltipEl);\r\n }\r\n }\r\n}\r\n","import { TooltipManager } from '../../TooltipManager';\r\nimport { DrawOptions, IDrawer, DrawResult } from '../types';\r\n\r\nexport default class PointDrawer implements IDrawer {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private tooltip: TooltipManager | null = null;\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n startDrawing(options: DrawOptions) {\r\n const { Cesium, viewer } = this;\r\n this.tooltip = new TooltipManager();\r\n this.tooltip.show('左键添加点');\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n\r\n this.handler.setInputAction((movement: any) => {\r\n const position = viewer.scene.pickPosition(movement.position);\r\n if (!position) return;\r\n\r\n const cartographic = Cesium.Cartographic.fromCartesian(position);\r\n const lng = Cesium.Math.toDegrees(cartographic.longitude);\r\n const lat = Cesium.Math.toDegrees(cartographic.latitude);\r\n const height = cartographic.height;\r\n\r\n const entity = viewer.entities.add({\r\n position,\r\n point: {\r\n pixelSize: 10,\r\n color: options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n\r\n this.entity = entity;\r\n\r\n const result: DrawResult = {\r\n entity,\r\n position,\r\n lnglat: { lng, lat, height },\r\n clear: () => {\r\n this.clear();\r\n },\r\n };\r\n\r\n options.onComplete?.(result);\r\n\r\n this.stopDrawing();\r\n this.tooltip?.hide();\r\n this.tooltip = null;\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n }\r\n\r\n stopDrawing() {\r\n this.handler?.destroy();\r\n this.handler = null;\r\n }\r\n\r\n clear() {\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n this.stopDrawing();\r\n }\r\n}\r\n","import { DrawOptions, DrawResult, IDrawer } from '../types';\r\nimport { TooltipManager } from '../../TooltipManager';\r\n\r\nexport default class LineDrawer implements IDrawer {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private positions: any[] = [];\r\n private entity: any = null;\r\n private tooltip: TooltipManager | null = null;\r\n private tempPoints: any[] = [];\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n startDrawing(options: DrawOptions) {\r\n const { Cesium, viewer } = this;\r\n this.positions = [];\r\n this.tempPoints = [];\r\n this.tooltip = new TooltipManager();\r\n this.tooltip.show('单击左键添加点,双击左键结束');\r\n\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n\r\n // 左键点击添加点\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n\r\n this.positions.push(pos);\r\n\r\n // 添加点标记\r\n const point = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(point);\r\n\r\n // 第一次点击时初始化线段 entity\r\n if (!this.entity) {\r\n this.entity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => this.positions, false),\r\n width: 3,\r\n material: options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n depthFailMaterial:\r\n options.color?.withAlpha?.(0.5) || Cesium.Color.YELLOW.withAlpha(0.5),\r\n },\r\n });\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n\r\n // 右键完成绘制\r\n this.handler.setInputAction(() => {\r\n this.stopDrawing();\r\n\r\n this.tooltip?.hide();\r\n this.tooltip = null;\r\n\r\n if (this.positions.length < 2) return;\r\n this.positions.length = this.positions.length - 1;\r\n const lnglats = this.positions.map((p) => {\r\n const carto = Cesium.Cartographic.fromCartesian(p);\r\n return {\r\n lng: Cesium.Math.toDegrees(carto.longitude),\r\n lat: Cesium.Math.toDegrees(carto.latitude),\r\n height: carto.height,\r\n };\r\n });\r\n\r\n const result: DrawResult = {\r\n entity: this.entity,\r\n positions: this.positions,\r\n lnglats,\r\n clear: () => {\r\n this.clear();\r\n },\r\n };\r\n\r\n options.onComplete?.(result);\r\n }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\r\n }\r\n\r\n stopDrawing() {\r\n this.handler?.destroy();\r\n this.handler = null;\r\n }\r\n\r\n clear() {\r\n const { viewer } = this;\r\n\r\n if (this.entity) {\r\n viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n\r\n this.tempPoints.forEach((p) => viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n\r\n this.tooltip?.hide();\r\n this.tooltip = null;\r\n\r\n this.positions = [];\r\n this.stopDrawing();\r\n }\r\n}\r\n","import { DrawOptions, DrawResult, IDrawer } from '../types';\r\n\r\nexport default class RectangleDrawer implements IDrawer {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private startPoint: any = null;\r\n private endPoint: any = null;\r\n private entity: any = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n startDrawing(options: DrawOptions) {\r\n const { Cesium, viewer } = this;\r\n\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n\r\n if (!this.startPoint) {\r\n this.startPoint = pos;\r\n\r\n // 初始化实体,使用 CallbackProperty 安全包装\r\n this.entity = viewer.entities.add({\r\n rectangle: {\r\n coordinates: new Cesium.CallbackProperty(() => {\r\n if (!this.startPoint || !this.endPoint) return undefined;\r\n\r\n try {\r\n const c1 = Cesium.Cartographic.fromCartesian(this.startPoint);\r\n const c2 = Cesium.Cartographic.fromCartesian(this.endPoint);\r\n\r\n const west = Math.min(c1.longitude, c2.longitude);\r\n const east = Math.max(c1.longitude, c2.longitude);\r\n const south = Math.min(c1.latitude, c2.latitude);\r\n const north = Math.max(c1.latitude, c2.latitude);\r\n\r\n return new Cesium.Rectangle(west, south, east, north);\r\n } catch (e) {\r\n console.warn('Rectangle calculation error:', e);\r\n return undefined;\r\n }\r\n }, false),\r\n material: options.color || Cesium.Color.YELLOW.withAlpha(0.5),\r\n outline: true,\r\n outlineColor: Cesium.Color.BLACK,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n } else {\r\n this.stopDrawing();\r\n\r\n const c1 = Cesium.Cartographic.fromCartesian(this.startPoint);\r\n const c2 = Cesium.Cartographic.fromCartesian(this.endPoint);\r\n\r\n const sw = {\r\n lng: Cesium.Math.toDegrees(Math.min(c1.longitude, c2.longitude)),\r\n lat: Cesium.Math.toDegrees(Math.min(c1.latitude, c2.latitude)),\r\n height: 0,\r\n };\r\n const ne = {\r\n lng: Cesium.Math.toDegrees(Math.max(c1.longitude, c2.longitude)),\r\n lat: Cesium.Math.toDegrees(Math.max(c1.latitude, c2.latitude)),\r\n height: 0,\r\n };\r\n\r\n const result: DrawResult = {\r\n entity: this.entity,\r\n position: this.startPoint,\r\n lnglat: {\r\n lng: Cesium.Math.toDegrees(c1.longitude),\r\n lat: Cesium.Math.toDegrees(c1.latitude),\r\n height: c1.height,\r\n },\r\n positions: [this.startPoint, this.endPoint],\r\n lnglats: [sw, ne],\r\n clear: () => {\r\n this.clear();\r\n },\r\n };\r\n\r\n options.onComplete?.(result);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n\r\n this.handler.setInputAction((movement: any) => {\r\n if (!this.startPoint) return;\r\n\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (pos) {\r\n this.endPoint = pos;\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stopDrawing() {\r\n this.handler?.destroy();\r\n this.handler = null;\r\n }\r\n\r\n clear() {\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n this.startPoint = null;\r\n this.endPoint = null;\r\n this.stopDrawing();\r\n }\r\n}\r\n","import { DrawOptions, IDrawer } from '../types';\r\n\r\nexport default class CircleDrawer implements IDrawer {\r\n private viewer: any;\r\n private Cesium: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private positions: any[] = [];\r\n private _isDrawing: boolean = false;\r\n private currentRadius: number = 0;\r\n\r\n constructor(CesiumInstance: any, viewerInstance: any) {\r\n this.Cesium = CesiumInstance;\r\n this.viewer = viewerInstance;\r\n }\r\n\r\n public startDrawing(options: DrawOptions): void {\r\n this.clear();\r\n this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.canvas);\r\n this._isDrawing = true;\r\n\r\n // 第一次点击:确定圆心\r\n this.handler.setInputAction((click: any) => {\r\n const position = this.viewer.scene.pickPosition(click.position);\r\n if (!position) return;\r\n\r\n this.positions.push(position);\r\n\r\n // 如果已经有两个点,则绘制最终图形\r\n if (this.positions.length === 2) {\r\n this.stopDrawing();\r\n this.drawFinalCircle(options);\r\n }\r\n }, this.Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n\r\n // 鼠标移动:实时预览圆\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length !== 1) return;\r\n\r\n const center = this.positions[0];\r\n const ray = this.viewer.camera.getPickRay(movement.endPosition);\r\n const edge = this.viewer.scene.globe.pick(ray, this.viewer.scene);\r\n\r\n if (edge) {\r\n this.drawPreviewCircle(center, edge, options);\r\n }\r\n }, this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n private drawPreviewCircle(center: any, edge: any, options: DrawOptions): void {\r\n const radius = this.Cesium.Cartesian3.distance(center, edge);\r\n\r\n // 若未添加 entity,先添加并使用 CallbackProperty\r\n if (!this.entity) {\r\n this.currentRadius = radius;\r\n const dynamicRadius = new this.Cesium.CallbackProperty(() => this.currentRadius, false);\r\n\r\n this.entity = this.viewer.entities.add({\r\n position: center,\r\n ellipse: {\r\n semiMajorAxis: dynamicRadius,\r\n semiMinorAxis: dynamicRadius,\r\n material: options.color || this.Cesium.Color.YELLOW.withAlpha(0.5),\r\n outline: true,\r\n outlineColor: options.color || this.Cesium.Color.YELLOW,\r\n heightReference: this.Cesium.HeightReference.NONE,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n } else {\r\n // 控制最小变动阈值,避免频繁更新\r\n if (Math.abs(this.currentRadius - radius) > 0.5) {\r\n this.currentRadius = radius;\r\n }\r\n }\r\n }\r\n\r\n private drawFinalCircle(options: DrawOptions): void {\r\n const [center, edge] = this.positions;\r\n const radius = this.Cesium.Cartesian3.distance(center, edge);\r\n const centerCarto = this.Cesium.Cartographic.fromCartesian(center);\r\n\r\n const centerLngLat = {\r\n lng: this.Cesium.Math.toDegrees(centerCarto.longitude),\r\n lat: this.Cesium.Math.toDegrees(centerCarto.latitude),\r\n height: centerCarto.height,\r\n };\r\n\r\n const step = options?.step || 1;\r\n const circlePoints: any[] = [];\r\n const circleLnglats: { lng: number; lat: number; height: number }[] = [];\r\n\r\n for (let angle = 0; angle < 360; angle += step) {\r\n const angleRad = this.Cesium.Math.toRadians(angle);\r\n const geodesic = new this.Cesium.EllipsoidGeodesic();\r\n\r\n geodesic.setEndPoints(\r\n centerCarto,\r\n new this.Cesium.Cartographic(\r\n centerCarto.longitude + 0.0001 * Math.cos(angleRad),\r\n centerCarto.latitude + 0.0001 * Math.sin(angleRad),\r\n ),\r\n );\r\n\r\n const interpolated = geodesic.interpolateUsingSurfaceDistance(radius);\r\n const destCartesian = this.Cesium.Ellipsoid.WGS84.cartographicToCartesian(interpolated);\r\n circlePoints.push(destCartesian);\r\n\r\n const carto = this.Cesium.Cartographic.fromCartesian(destCartesian);\r\n circleLnglats.push({\r\n lng: this.Cesium.Math.toDegrees(carto.longitude),\r\n lat: this.Cesium.Math.toDegrees(carto.latitude),\r\n height: carto.height,\r\n });\r\n }\r\n circleLnglats.push(circleLnglats[0]);\r\n const lnglats = this.positions.map((p) => {\r\n const carto = this.Cesium.Cartographic.fromCartesian(p);\r\n return {\r\n lng: this.Cesium.Math.toDegrees(carto.longitude),\r\n lat: this.Cesium.Math.toDegrees(carto.latitude),\r\n height: carto.height,\r\n };\r\n });\r\n\r\n options.onComplete?.({\r\n entity: this.entity,\r\n positions: this.positions,\r\n lnglats,\r\n circlePoints,\r\n circleLnglats,\r\n center: centerLngLat,\r\n radius,\r\n clear: () => {\r\n this.clear();\r\n },\r\n });\r\n }\r\n\r\n public stopDrawing(): void {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n this._isDrawing = false;\r\n }\r\n\r\n public clear(): void {\r\n this.stopDrawing();\r\n\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n\r\n this.positions = [];\r\n this.currentRadius = 0;\r\n }\r\n}\r\n","import { DrawOptions, DrawResult, IDrawer } from '../types';\r\nimport { TooltipManager } from '../../TooltipManager';\r\n\r\nexport default class PolygonDrawer implements IDrawer {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private positions: any[] = [];\r\n private entity: any = null;\r\n private tooltip: TooltipManager | null = null;\r\n private tempPoints: any[] = [];\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n startDrawing(options: DrawOptions) {\r\n const { Cesium, viewer } = this;\r\n this.positions = [];\r\n this.tempPoints = [];\r\n this.tooltip = new TooltipManager();\r\n this.tooltip.show('单击左键添加点,双击左键结束');\r\n\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n\r\n // 左键点击添加点\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n\r\n this.positions.push(pos);\r\n\r\n const point = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n });\r\n this.tempPoints.push(point);\r\n\r\n if (!this.entity) {\r\n this.entity = viewer.entities.add({\r\n polygon: {\r\n hierarchy: new Cesium.CallbackProperty(\r\n () => ({\r\n positions: this.positions,\r\n }),\r\n false,\r\n ),\r\n material: options.color || Cesium.Color.YELLOW.withAlpha(0.5),\r\n },\r\n });\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n\r\n // 右键完成绘制\r\n this.handler.setInputAction(() => {\r\n this.stopDrawing();\r\n this.tooltip?.hide();\r\n this.tooltip = null;\r\n\r\n if (this.positions.length < 3) return;\r\n this.positions.length = this.positions.length - 1;\r\n const lnglats = this.positions.map((p) => {\r\n const carto = Cesium.Cartographic.fromCartesian(p);\r\n return {\r\n lng: Cesium.Math.toDegrees(carto.longitude),\r\n lat: Cesium.Math.toDegrees(carto.latitude),\r\n height: carto.height,\r\n };\r\n });\r\n\r\n const result: DrawResult = {\r\n entity: this.entity,\r\n positions: this.positions,\r\n lnglats,\r\n clear: () => {\r\n this.clear();\r\n },\r\n };\r\n\r\n options.onComplete?.(result);\r\n }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\r\n }\r\n\r\n stopDrawing() {\r\n this.handler?.destroy();\r\n this.handler = null;\r\n }\r\n\r\n clear() {\r\n const { viewer } = this;\r\n\r\n if (this.entity) {\r\n viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n\r\n this.tempPoints.forEach((p) => viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n\r\n this.tooltip?.hide();\r\n this.tooltip = null;\r\n\r\n this.positions = [];\r\n this.stopDrawing();\r\n }\r\n}\r\n","import { DrawType, DrawOptions, IDrawer } from './types';\r\nimport PointDrawer from './handlers/PointDrawer';\r\nimport LineDrawer from './handlers/LineDrawer';\r\nimport RectangleDrawer from './handlers/RectangleDrawer';\r\nimport CircleDrawer from './handlers/CircleDrawer';\r\nimport PolygonDrawer from './handlers/PolygonDrawer';\r\n\r\nexport class DrawTool {\r\n private viewer;\r\n private Cesium;\r\n private activeDrawer: IDrawer | null = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.viewer = viewer;\r\n this.Cesium = Cesium;\r\n }\r\n\r\n draw(type: DrawType, options: DrawOptions) {\r\n this.clear();\r\n\r\n switch (type) {\r\n case 'point':\r\n this.activeDrawer = new PointDrawer(this.Cesium, this.viewer);\r\n break;\r\n case 'line':\r\n this.activeDrawer = new LineDrawer(this.Cesium, this.viewer);\r\n break;\r\n case 'rectangle':\r\n this.activeDrawer = new RectangleDrawer(this.Cesium, this.viewer);\r\n break;\r\n case 'circle':\r\n this.activeDrawer = new CircleDrawer(this.Cesium, this.viewer);\r\n break;\r\n case 'polygon':\r\n this.activeDrawer = new PolygonDrawer(this.Cesium, this.viewer);\r\n break;\r\n default:\r\n throw new Error(`Unsupported draw type: ${type}`);\r\n }\r\n\r\n this.activeDrawer?.startDrawing(options);\r\n }\r\n\r\n clear() {\r\n if (this.activeDrawer) {\r\n this.activeDrawer.stopDrawing();\r\n this.activeDrawer.clear();\r\n this.activeDrawer = null;\r\n }\r\n }\r\n\r\n cancel() {\r\n this.clear();\r\n }\r\n}\r\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nexport default arrayEach;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n","import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n","import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeys;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeys from './_baseKeys.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nexport default keys;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nexport default arrayPush;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nexport default arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nexport default stubArray;\n","import arrayFilter from './_arrayFilter.js';\nimport stubArray from './stubArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nexport default getSymbols;\n","import arrayPush from './_arrayPush.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nexport default baseGetAllKeys;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbols from './_getSymbols.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nexport default getAllKeys;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n","import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nexport default getTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nexport default initCloneArray;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nexport default cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nexport default cloneRegExp;\n","import Symbol from './_Symbol.js';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nexport default cloneSymbol;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\nimport cloneDataView from './_cloneDataView.js';\nimport cloneRegExp from './_cloneRegExp.js';\nimport cloneSymbol from './_cloneSymbol.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nexport default initCloneByTag;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nexport default baseIsMap;\n","import baseIsMap from './_baseIsMap.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nexport default isMap;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nexport default baseIsSet;\n","import baseIsSet from './_baseIsSet.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nexport default isSet;\n","import Stack from './_Stack.js';\nimport arrayEach from './_arrayEach.js';\nimport assignValue from './_assignValue.js';\nimport baseAssign from './_baseAssign.js';\nimport baseAssignIn from './_baseAssignIn.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport copyArray from './_copyArray.js';\nimport copySymbols from './_copySymbols.js';\nimport copySymbolsIn from './_copySymbolsIn.js';\nimport getAllKeys from './_getAllKeys.js';\nimport getAllKeysIn from './_getAllKeysIn.js';\nimport getTag from './_getTag.js';\nimport initCloneArray from './_initCloneArray.js';\nimport initCloneByTag from './_initCloneByTag.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isMap from './isMap.js';\nimport isObject from './isObject.js';\nimport isSet from './isSet.js';\nimport keys from './keys.js';\nimport keysIn from './keysIn.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nexport default baseClone;\n","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nexport default cloneDeep;\n","import { isArray } from 'lodash-es';\r\n\r\nexport enum EditMode {\r\n Rotate = 'rotate',\r\n Move = 'move',\r\n Scale = 'scale',\r\n MoveHeight = 'moveHeight',\r\n Empty = '',\r\n}\r\n\r\nexport enum GLTFManageEventKey {\r\n Scale = 'addScale',\r\n Rotate = 'rotate',\r\n Translation = 'translation',\r\n Remove = 'removeById',\r\n Add = 'add',\r\n}\r\nexport class GLTFManage {\r\n primitives = new Map<string, any>();\r\n eventListener = new Map<string, Array<Object>>();\r\n Cesium: any;\r\n viewer: any;\r\n handler: any;\r\n rotationRing: any;\r\n translationSquare: any;\r\n heightArrow: any;\r\n editMode: EditMode = EditMode.Empty; // 默认是移动模式\r\n dragEndCallbackMap = new Map<string, any>();\r\n\r\n constructor(options: { Cesium: any; viewer: any }) {\r\n this.Cesium = options.Cesium;\r\n this.viewer = options.viewer;\r\n this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);\r\n }\r\n\r\n /**\r\n * @description: 初始化模型\r\n * @param {Array<any>} models 模型数据列表\r\n * @return {*}\r\n */\r\n init(models: Array<any>, show = false) {\r\n const viewer = this.viewer;\r\n // 移除现有的所有模型\r\n this.primitives.forEach((gltf) => {\r\n viewer.scene.primitives.remove(gltf);\r\n });\r\n\r\n // 遍历传入的模型数据并添加到场景中\r\n models.forEach((model: any) => {\r\n if (!this.primitives.has(model.id)) {\r\n this.add(model, show); // 调用 add 方法添加模型\r\n }\r\n });\r\n }\r\n get(id: string) {\r\n return this.primitives.get(id);\r\n }\r\n\r\n /**\r\n * @description: 添加模型\r\n * @param {*} info 模型信息\r\n * @return {*}\r\n */\r\n add(info: any, show = true) {\r\n const viewer = this.viewer;\r\n const Cesium = this.Cesium;\r\n // 转换 Heading, Pitch, Roll 为弧度\r\n const newHeading = Cesium.Math.toRadians(info.headingPitchRoll?.heading || 0);\r\n const newPitch = Cesium.Math.toRadians(info.headingPitchRoll?.pitch || 0);\r\n const newRoll = Cesium.Math.toRadians(info.headingPitchRoll?.roll || 0);\r\n const headingPitchRoll = new Cesium.HeadingPitchRoll(newHeading, newPitch, newRoll);\r\n\r\n // 计算模型的模型矩阵\r\n const modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(\r\n info.position,\r\n headingPitchRoll,\r\n viewer.scene.globe.ellipsoid,\r\n Cesium.Transforms.eastNorthUpToFixedFrame,\r\n new Cesium.Matrix4(),\r\n );\r\n\r\n // 创建模型并添加到场景\r\n let gltf = viewer.scene.primitives.add(\r\n Cesium.Model.fromGltf({\r\n id: info.id,\r\n ...info.model, // 模型的地址\r\n modelMatrix,\r\n }),\r\n );\r\n gltf.scale = info.scale || 1; // 设置缩放\r\n this.primitives.set(info.id, gltf); // 存储在 primitives 中\r\n gltf.show = show;\r\n // 触发 add 事件监听\r\n this.runEventListener(GLTFManageEventKey.Add, { info: info, gltf: gltf });\r\n }\r\n\r\n flyTo(id: string) {\r\n const viewer = this.viewer;\r\n const Cesium = this.Cesium;\r\n let model = this.primitives.get(id);\r\n const boundingSphere = model.boundingSphere;\r\n\r\n // 如果模型有模型矩阵,转换到世界坐标\r\n const center = Cesium.Matrix4.multiplyByPoint(\r\n model.modelMatrix,\r\n boundingSphere.center,\r\n new Cesium.Cartesian3(),\r\n );\r\n\r\n // 创建世界坐标下的包围球\r\n const worldBoundingSphere = new Cesium.BoundingSphere(center, boundingSphere.radius);\r\n\r\n // 摄像机飞到模型位置\r\n viewer.camera.flyToBoundingSphere(worldBoundingSphere, {\r\n duration: 1.5, // 飞行时间\r\n offset: new Cesium.HeadingPitchRange(0, -0.5, boundingSphere.radius * 2.0), // 调整视角\r\n });\r\n }\r\n\r\n /**\r\n * @description: 根据模型的 ID 移除模型\r\n * @param {string} id 模型的 ID\r\n * @return {*}\r\n */\r\n removeById(id: string) {\r\n const viewer = this.viewer;\r\n let g = this.primitives.get(id); // 获取对应 ID 的模型\r\n\r\n if (!g) {\r\n console.error(`No model found with id: ${id}`);\r\n return;\r\n }\r\n\r\n // 从场景中移除模型\r\n viewer.scene.primitives.remove(g);\r\n this.primitives.delete(id); // 从 primitives 中删除模型\r\n if (!this.rotationRing?._instanceIds.includes(`rotationRing_${id}`) || !this.rotationRing) {\r\n this.removeTool();\r\n }\r\n // 触发 removeById 事件监听\r\n this.runEventListener(GLTFManageEventKey.Remove, { id: id, gltf: g });\r\n }\r\n\r\n // 显示模型\r\n show(id: string) {\r\n let g = this.primitives.get(id); // 获取对应 ID 的模型\r\n if (g) g.show = true;\r\n }\r\n // 隐藏模型\r\n hide(id: string) {\r\n let g = this.primitives.get(id); // 获取对应 ID 的模型\r\n if (g) g.show = false;\r\n }\r\n\r\n /**\r\n * @description: 修改模型的缩放因子\r\n * @param {*} info 模型信息\r\n * @param {number} num 缩放因子\r\n * @return {*}\r\n */\r\n addScale(info: any, num = 0.1) {\r\n let curModel = this.primitives.get(info.id); // 获取对应 ID 的模型\r\n\r\n if (curModel) {\r\n curModel.scale = curModel.scale + num; // 增加或减少模型的缩放因子\r\n this.updatedTool(curModel.modelMatrix);\r\n this.runEventListener(GLTFManageEventKey.Scale, { id: info.id, scale: curModel.scale }); // 触发 addScale 事件监听\r\n }\r\n }\r\n /**\r\n * @description: 修改模型的缩放因子\r\n * @param {*} info 模型信息\r\n * @param {number} num 缩放因子\r\n * @return {*}\r\n */\r\n setScale(id: any, scale = 0.1) {\r\n let curModel = this.primitives.get(id); // 获取对应 ID 的模型\r\n if (curModel) {\r\n curModel.scale = scale; // 增加或减少模型的缩放因子\r\n this.updatedTool(curModel.modelMatrix);\r\n this.runEventListener(GLTFManageEventKey.Scale, { id: id, scale: curModel.scale }); // 触发 addScale 事件监听\r\n }\r\n }\r\n\r\n setEditMode(mode: EditMode) {\r\n this.editMode = mode;\r\n }\r\n // 公共锁定/解锁视角函数\r\n lockCamera() {\r\n const cameraController = this.viewer.scene.screenSpaceCameraController;\r\n cameraController.enableRotate = false;\r\n cameraController.enableTranslate = false;\r\n cameraController.enableZoom = false;\r\n }\r\n\r\n unlockCamera() {\r\n const cameraController = this.viewer.scene.screenSpaceCameraController;\r\n cameraController.enableRotate = true;\r\n cameraController.enableTranslate = true;\r\n cameraController.enableZoom = true;\r\n }\r\n\r\n // 公共函数:将世界坐标转换为经纬度(忽略高度)\r\n toCartographic(cartesian: any) {\r\n const cartographic = this.Cesium.Cartographic.fromCartesian(cartesian);\r\n return { longitude: cartographic.longitude, latitude: cartographic.latitude };\r\n }\r\n\r\n // 公共函数:计算两点之间的方向角\r\n calculateHeading(from: any, to: any): number {\r\n const deltaLongitude = to.longitude - from.longitude;\r\n const deltaLatitude = to.latitude - from.latitude;\r\n return Math.atan2(deltaLatitude, deltaLongitude);\r\n }\r\n\r\n /**\r\n * @description: 获取模型的 Heading, Pitch, Roll\r\n * @param {any} modelMatrix 模型的变换矩阵\r\n * @return {*}\r\n */\r\n getModelHeadingPitchRoll(modelMatrix: any) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n\r\n const m1 = Cesium.Transforms.eastNorthUpToFixedFrame(\r\n Cesium.Matrix4.getTranslation(modelMatrix, new Cesium.Cartesian3()),\r\n viewer.scene.globe.ellipsoid,\r\n new Cesium.Matrix4(),\r\n );\r\n\r\n const m2 = Cesium.Matrix4.multiply(\r\n Cesium.Matrix4.inverse(m1, new Cesium.Matrix4()),\r\n modelMatrix,\r\n new Cesium.Matrix4(),\r\n );\r\n\r\n const mat3 = Cesium.Matrix4.getRotation(m2, new Cesium.Matrix3());\r\n const q = Cesium.Quaternion.fromRotationMatrix(mat3);\r\n return Cesium.HeadingPitchRoll.fromQuaternion(q); // 返回 HeadingPitchRoll\r\n }\r\n\r\n /**\r\n * @description: 添加事件监听\r\n * @param {string} key\r\n * @param {Function} f\r\n * @param {any} options\r\n * @return {*}\r\n */\r\n addEventListener(key: string, f: Function, options?: any): { f: Function; options: any } {\r\n let instantiation = { f: f, options: options };\r\n if (this.eventListener.get(key)) {\r\n (this.eventListener.get(key) || []).push(instantiation);\r\n } else {\r\n this.eventListener.set(key, [instantiation]);\r\n }\r\n return instantiation;\r\n }\r\n\r\n /**\r\n * @description: 移除事件监听\r\n * @param {string} key\r\n * @param {any} instantiation\r\n * @return {*}\r\n */\r\n removeEventListener(key: string, instantiation: any) {\r\n let list = this.eventListener.get(key);\r\n if (!list) return console.error('key不存在');\r\n let index = list.findIndex((n) => n == instantiation);\r\n if (index >= 0) {\r\n list.splice(index, 1);\r\n } else {\r\n console.error('instantiation不存在');\r\n }\r\n }\r\n\r\n /**\r\n * @description: 执行监听\r\n * @param {*} key\r\n * @param {any} parameter\r\n * @return {*}\r\n */\r\n runEventListener(key: string, parameter: any): boolean {\r\n let list = this.eventListener.get(key);\r\n if (!list) return false;\r\n list.forEach((item: any) => {\r\n if (typeof item.f === 'function') {\r\n item.f(parameter);\r\n }\r\n });\r\n return true; // 返回事件是否成功执行\r\n }\r\n\r\n // ... (Add, remove, scale functions here remain the same)\r\n\r\n /**\r\n * @description: 初始化拖拽模型编辑功能(平移)\r\n * @return {*}\r\n */\r\n initEditBox(getEditState: Function) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const scene = viewer.scene;\r\n\r\n let draggedModel: any = null;\r\n let startModelMatrix: any = null;\r\n let startModelCartographic: any = null;\r\n let startMouseCartographic: any = null;\r\n let startMousePosition: any = null;\r\n\r\n // 清除拖拽状态\r\n const clearStatus = () => {\r\n draggedModel = null;\r\n startModelMatrix = null;\r\n startModelCartographic = null;\r\n startMousePosition = null;\r\n startMouseCartographic = null;\r\n this.setEditMode(EditMode.Empty);\r\n this.unlockCamera();\r\n };\r\n\r\n //初始化拖拽状态\r\n const initDragged = (modelId: any, movement: any) => {\r\n draggedModel = this.primitives.get(modelId);\r\n if (draggedModel) {\r\n startModelMatrix = Cesium.Matrix4.clone(draggedModel.modelMatrix);\r\n const modelPosition = Cesium.Matrix4.getTranslation(\r\n startModelMatrix,\r\n new Cesium.Cartesian3(),\r\n );\r\n startModelCartographic = this.toCartographic(modelPosition);\r\n startMousePosition = movement.position;\r\n const rayHit: any = scene.globe.pick(viewer.camera.getPickRay(movement.position), scene);\r\n startMouseCartographic = this.toCartographic(rayHit);\r\n\r\n this.lockCamera();\r\n }\r\n };\r\n\r\n // 点击事件处理,获取被点击的模型对象\r\n this.handler.setInputAction((movement: any) => {\r\n let isEdit = getEditState();\r\n if (!isEdit) return;\r\n const hit: any = scene.pick(movement.position);\r\n if (hit && hit.id && hit.id?.includes('rotationRing')) {\r\n let modelId = hit.id.split('rotationRing_')[1];\r\n this.setEditMode(EditMode.Rotate);\r\n initDragged(modelId, movement);\r\n } else if (hit && hit.id && hit.id?.includes('translationSquare_')) {\r\n let modelId = hit.id.split('translationSquare_')[1];\r\n this.setEditMode(EditMode.Move);\r\n initDragged(modelId, movement);\r\n } else if (hit && hit.id && hit.id?.includes('heightArrow-line_')) {\r\n let modelId = hit.id.split('heightArrow-line_')[1];\r\n this.setEditMode(EditMode.MoveHeight);\r\n initDragged(modelId, movement);\r\n } else if (hit && hit.id && hit.id?.includes('heightArrow-arrow_')) {\r\n let modelId = hit.id.split('heightArrow-arrow_')[1];\r\n this.setEditMode(EditMode.MoveHeight);\r\n initDragged(modelId, movement);\r\n } else if (hit && hit.id) {\r\n draggedModel = this.primitives.get(hit.id);\r\n if (!draggedModel) return;\r\n // 创建旋转环\r\n if (\r\n !this.rotationRing ||\r\n !this.rotationRing?._instanceIds?.includes(`rotationRing_${draggedModel.id}`)\r\n ) {\r\n this.createRotationRing(draggedModel);\r\n }\r\n //创建平移方块\r\n if (\r\n !this.translationSquare ||\r\n !this.translationSquare?._instanceIds?.includes(`translationSquare_${draggedModel.id}`)\r\n ) {\r\n this.createTranslationSquare(draggedModel);\r\n }\r\n //创建平移方块\r\n if (\r\n !this.heightArrow ||\r\n !this.heightArrow?._instanceIds?.includes(`heightArrow_${draggedModel.id}`)\r\n ) {\r\n this.createHeightArrow(draggedModel);\r\n }\r\n } else {\r\n clearStatus();\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_DOWN);\r\n\r\n // 拖拽过程中更新模型位置或旋转\r\n this.handler.setInputAction((movement: any) => {\r\n let isEdit = getEditState();\r\n if (!isEdit) return;\r\n if (this.editMode != EditMode.Empty && draggedModel) {\r\n const rayHit: any = scene.globe.pick(viewer.camera.getPickRay(movement.endPosition), scene);\r\n const currentMouseCartographic = this.toCartographic(rayHit);\r\n let angleDelta = 0;\r\n\r\n // 更新模型的位置或者旋转\r\n if (this.editMode === EditMode.Rotate) {\r\n let currAngle = this.calculateHeading(startModelCartographic, currentMouseCartographic);\r\n let startAngle = this.calculateHeading(startModelCartographic, startMouseCartographic);\r\n angleDelta = startAngle - currAngle;\r\n this.rotateModel(draggedModel, startModelMatrix, angleDelta);\r\n } else if (this.editMode === EditMode.Move) {\r\n this.moveModel(draggedModel, startModelMatrix, movement);\r\n } else if (this.editMode === EditMode.MoveHeight) {\r\n this.moveModelHeight(draggedModel, startModelMatrix, movement, startMousePosition);\r\n }\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n\r\n // 拖拽结束\r\n this.handler.setInputAction(() => {\r\n let isEdit = getEditState();\r\n if (!isEdit) return;\r\n let map = this.dragEndCallbackMap.get(draggedModel?.id);\r\n if (map && (this.editMode === EditMode.Move || this.editMode === EditMode.MoveHeight)) {\r\n let callbackInfo = map.get(GLTFManageEventKey.Translation);\r\n if (callbackInfo) {\r\n this.runEventListener(GLTFManageEventKey.Translation, callbackInfo);\r\n map.delete(GLTFManageEventKey.Translation);\r\n }\r\n } else if (map && this.editMode === EditMode.Rotate) {\r\n let callbackInfo = map.get(GLTFManageEventKey.Rotate);\r\n if (callbackInfo) {\r\n this.runEventListener(GLTFManageEventKey.Rotate, callbackInfo);\r\n map.delete(GLTFManageEventKey.Rotate);\r\n }\r\n }\r\n clearStatus();\r\n }, Cesium.ScreenSpaceEventType.LEFT_UP);\r\n this.handler.setInputAction(() => {\r\n this.removeTool();\r\n }, Cesium.ScreenSpaceEventType.RIGHT_UP);\r\n }\r\n\r\n // 创建圆环表示旋转区域\r\n createRotationRing(model: any) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (this.rotationRing) {\r\n viewer.scene.primitives.remove(this.rotationRing); // 如果已存在,先移除\r\n }\r\n //创建圆\r\n const position = [] as any;\r\n for (let i = 0; i <= 360; i += 3) {\r\n const sin = Math.sin(Cesium.Math.toRadians(i));\r\n const cos = Math.cos(Cesium.Math.toRadians(i));\r\n const x = model.boundingSphere.radius * cos;\r\n const y = model.boundingSphere.radius * sin;\r\n position.push(new Cesium.Cartesian3(x, y, 0));\r\n }\r\n const geometry = new Cesium.PolylineGeometry({\r\n positions: position,\r\n width: Math.max(model.boundingSphere.radius * 0.05, 1),\r\n });\r\n const instnce = new Cesium.GeometryInstance({\r\n id: `rotationRing_${model.id}`,\r\n geometry: geometry,\r\n attributes: {\r\n color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED),\r\n },\r\n });\r\n this.rotationRing = new Cesium.Primitive({\r\n geometryInstances: instnce,\r\n appearance: new Cesium.PolylineColorAppearance({\r\n translucent: true,\r\n }),\r\n depthFailAppearance: new Cesium.PolylineMaterialAppearance({\r\n material: Cesium.Material.fromType('Color', {\r\n color: Cesium.Color.RED.withAlpha(0.3),\r\n }),\r\n translucent: true,\r\n }),\r\n modelMatrix: model.modelMatrix,\r\n cull: false,\r\n });\r\n viewer.scene.primitives.add(this.rotationRing);\r\n }\r\n\r\n // 创建平移方块\r\n createTranslationSquare(model: any) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (this.translationSquare) {\r\n viewer.scene.primitives.remove(this.translationSquare); // 如果已存在,先移除\r\n }\r\n\r\n // 创建正方形\r\n const sideLength = Math.max(model.boundingSphere.radius * 0.2, 1); // 正方形的边长,根据模型的半径确定\r\n const halfSide = sideLength / 2;\r\n // 创建正方体的几何体\r\n const boxGeometry = new Cesium.BoxGeometry({\r\n maximum: new Cesium.Cartesian3(halfSide, halfSide, halfSide),\r\n minimum: new Cesium.Cartesian3(-halfSide, -halfSide, -halfSide),\r\n });\r\n\r\n const instnce = new Cesium.GeometryInstance({\r\n id: `translationSquare_${model.id}`,\r\n geometry: boxGeometry,\r\n attributes: {\r\n color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE),\r\n },\r\n });\r\n\r\n this.translationSquare = new Cesium.Primitive({\r\n geometryInstances: instnce,\r\n appearance: new Cesium.PolylineColorAppearance({\r\n translucent: true,\r\n }),\r\n depthFailAppearance: new Cesium.PolylineMaterialAppearance({\r\n material: Cesium.Material.fromType('Color', {\r\n color: Cesium.Color.BLUE.withAlpha(0.3),\r\n }),\r\n translucent: true,\r\n }),\r\n cull: false,\r\n modelMatrix: model.modelMatrix,\r\n });\r\n\r\n viewer.scene.primitives.add(this.translationSquare);\r\n }\r\n\r\n // 创建高度调整箭头\r\n createHeightArrow(model: any) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n\r\n if (this.heightArrow) {\r\n viewer.scene.primitives.remove(this.heightArrow); // 如果已存在,先移除\r\n }\r\n let color = Cesium.Color.GREEN;\r\n let width = Math.max(model.boundingSphere.radius * 0.025, 1);\r\n let headWidth = 2 * width;\r\n let length = model.boundingSphere.radius + 50;\r\n let headLength = length * 0.1;\r\n const sideLength = Math.max(model.boundingSphere.radius * 0.2, 1);\r\n let inverse = false;\r\n\r\n //这里用的是圆锥几何对象,当topRadius和bottomRadius相同时,它就是一个圆柱\r\n const line = Cesium.CylinderGeometry.createGeometry(\r\n new Cesium.CylinderGeometry({\r\n length: length,\r\n topRadius: width,\r\n bottomRadius: width,\r\n }),\r\n );\r\n const arrow = Cesium.CylinderGeometry.createGeometry(\r\n new Cesium.CylinderGeometry({\r\n length: headLength,\r\n topRadius: 0,\r\n bottomRadius: headWidth,\r\n }),\r\n );\r\n let arrowOffset = length + sideLength;\r\n let lineOffset = (length + sideLength) / 2;\r\n if (inverse) {\r\n lineOffset = -lineOffset;\r\n arrowOffset = -arrowOffset;\r\n }\r\n\r\n this.translate(line, [0, 0, lineOffset]);\r\n this.translate(arrow, [0, 0, arrowOffset]);\r\n\r\n // 创建箭头的组合(圆柱 + 圆锥)\r\n this.heightArrow = new Cesium.Primitive({\r\n modelMatrix: model.modelMatrix,\r\n geometryInstances: [\r\n new Cesium.GeometryInstance({\r\n id: `heightArrow-line_${model.id}`,\r\n geometry: line,\r\n }),\r\n new Cesium.GeometryInstance({\r\n id: `heightArrow-arrow_${model.id}`,\r\n geometry: arrow,\r\n }),\r\n ],\r\n appearance: new Cesium.PolylineMaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color: color }),\r\n translucent: true,\r\n }),\r\n depthFailAppearance: new Cesium.PolylineMaterialAppearance({\r\n material: Cesium.Material.fromType('Color', {\r\n color: color.withAlpha(0.3),\r\n }),\r\n translucent: true,\r\n }),\r\n cull: false,\r\n });\r\n\r\n viewer.scene.primitives.add(this.heightArrow);\r\n }\r\n\r\n translate(geometry: any, offset: any) {\r\n let Cesium = this.Cesium;\r\n const scratchOffset = new Cesium.Cartesian3();\r\n if (isArray(offset)) {\r\n scratchOffset.x = offset[0];\r\n scratchOffset.y = offset[1];\r\n scratchOffset.z = offset[2];\r\n } else {\r\n Cesium.Cartesian3.clone(offset, scratchOffset);\r\n }\r\n\r\n for (let i = 0; i < geometry.attributes.position.values.length; i += 3) {\r\n geometry.attributes.position.values[i] += scratchOffset.x;\r\n geometry.attributes.position.values[i + 1] += scratchOffset.y;\r\n geometry.attributes.position.values[i + 2] += scratchOffset.z;\r\n }\r\n }\r\n\r\n //移除工具\r\n removeTool() {\r\n if (this.rotationRing) {\r\n this.viewer.scene.primitives.remove(this.rotationRing);\r\n }\r\n if (this.translationSquare) {\r\n this.viewer.scene.primitives.remove(this.translationSquare);\r\n }\r\n if (this.heightArrow) {\r\n this.viewer.scene.primitives.remove(this.heightArrow);\r\n }\r\n }\r\n\r\n //更新工具矩阵\r\n updatedTool(newModelMatrix: any) {\r\n if (this.rotationRing) {\r\n this.rotationRing.modelMatrix = newModelMatrix;\r\n }\r\n if (this.translationSquare) {\r\n this.translationSquare.modelMatrix = newModelMatrix;\r\n }\r\n if (this.heightArrow) {\r\n this.heightArrow.modelMatrix = newModelMatrix;\r\n }\r\n }\r\n /**\r\n * @description: 平移模型\r\n * @param {*} draggedModel\r\n * @param {*} startModelMatrix\r\n * @param {*} movement\r\n * @return {*}\r\n */\r\n moveModel(draggedModel: any, startModelMatrix: any, movement: any) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const scene = viewer.scene;\r\n const rayHit: any = scene.globe.pick(viewer.camera.getPickRay(movement.endPosition), scene);\r\n\r\n if (rayHit) {\r\n const startPosition: any = Cesium.Matrix4.getTranslation(\r\n startModelMatrix,\r\n new Cesium.Cartesian3(),\r\n );\r\n const startCartographic = Cesium.Cartographic.fromCartesian(startPosition);\r\n const cartographic = Cesium.Cartographic.fromCartesian(rayHit);\r\n\r\n const newCartographic = new Cesium.Cartographic(\r\n cartographic.longitude,\r\n cartographic.latitude,\r\n startCartographic.height,\r\n );\r\n\r\n const newPosition = Cesium.Cartographic.toCartesian(newCartographic);\r\n const rotationMatrix = Cesium.Matrix4.getRotation(startModelMatrix, new Cesium.Matrix3());\r\n const newModelMatrix = Cesium.Matrix4.fromRotationTranslation(rotationMatrix, newPosition);\r\n\r\n draggedModel.modelMatrix = newModelMatrix;\r\n\r\n this.updatedTool(newModelMatrix);\r\n let position = new Cesium.Cartesian3(\r\n newModelMatrix[12],\r\n newModelMatrix[13],\r\n newModelMatrix[14],\r\n );\r\n let dragEndCallback = this.dragEndCallbackMap.get(draggedModel.id);\r\n if (!dragEndCallback) {\r\n dragEndCallback = new Map();\r\n this.dragEndCallbackMap.set(draggedModel.id, dragEndCallback);\r\n }\r\n dragEndCallback.set(GLTFManageEventKey.Translation, {\r\n id: draggedModel.id,\r\n position: position,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @description: 平移模型高度\r\n * @param {*} draggedModel\r\n * @param {*} startModelMatrix\r\n * @param {*} movement\r\n * @return {*}\r\n */\r\n moveModelHeight(\r\n draggedModel: any,\r\n startModelMatrix: any,\r\n movement: any,\r\n startMousePosition: any,\r\n ) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const scene = viewer.scene;\r\n const deltaY = startMousePosition.y - movement.endPosition.y; // 竖直方向的移动量\r\n\r\n const rayHit: any = scene.globe.pick(viewer.camera.getPickRay(movement.endPosition), scene);\r\n\r\n if (rayHit) {\r\n const startPosition: any = Cesium.Matrix4.getTranslation(\r\n startModelMatrix,\r\n new Cesium.Cartesian3(),\r\n );\r\n const startCartographic = Cesium.Cartographic.fromCartesian(startPosition);\r\n\r\n const newCartographic = new Cesium.Cartographic(\r\n startCartographic.longitude,\r\n startCartographic.latitude,\r\n startCartographic.height +\r\n deltaY * 0.001 * Math.max(viewer.camera.positionCartographic.height, 1),\r\n );\r\n\r\n const newPosition = Cesium.Cartographic.toCartesian(newCartographic);\r\n const rotationMatrix = Cesium.Matrix4.getRotation(startModelMatrix, new Cesium.Matrix3());\r\n const newModelMatrix = Cesium.Matrix4.fromRotationTranslation(rotationMatrix, newPosition);\r\n\r\n draggedModel.modelMatrix = newModelMatrix;\r\n\r\n this.updatedTool(newModelMatrix);\r\n let position = new Cesium.Cartesian3(\r\n newModelMatrix[12],\r\n newModelMatrix[13],\r\n newModelMatrix[14],\r\n );\r\n let dragEndCallback = this.dragEndCallbackMap.get(draggedModel.id);\r\n if (!dragEndCallback) {\r\n dragEndCallback = new Map();\r\n this.dragEndCallbackMap.set(draggedModel.id, dragEndCallback);\r\n }\r\n dragEndCallback.set(GLTFManageEventKey.Translation, {\r\n id: draggedModel.id,\r\n position: position,\r\n });\r\n // this.runEventListener(GLTFManageEventKey.Translation, {\r\n // id: draggedModel.id,\r\n // position: position,\r\n // });\r\n }\r\n }\r\n\r\n /**\r\n * @description: 旋转模型\r\n * @param {*} draggedModel\r\n * @param {*} startModelMatrix\r\n * @param {*} angleDelta\r\n * @return {*}\r\n */\r\n rotateModel(draggedModel: any, startModelMatrix: any, angleDelta: number) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const modelHeadingPitchRoll = this.getModelHeadingPitchRoll(startModelMatrix);\r\n const newHeading = modelHeadingPitchRoll.heading + angleDelta;\r\n\r\n const headingPitchRoll = new Cesium.HeadingPitchRoll(\r\n newHeading,\r\n modelHeadingPitchRoll.pitch,\r\n modelHeadingPitchRoll.roll,\r\n );\r\n\r\n const modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(\r\n Cesium.Matrix4.getTranslation(draggedModel.modelMatrix, new Cesium.Cartesian3()),\r\n headingPitchRoll,\r\n viewer.scene.globe.ellipsoid,\r\n Cesium.Transforms.eastNorthUpToFixedFrame,\r\n new Cesium.Matrix4(),\r\n );\r\n\r\n draggedModel.modelMatrix = modelMatrix;\r\n let dragEndCallback = this.dragEndCallbackMap.get(draggedModel.id);\r\n if (!dragEndCallback) {\r\n dragEndCallback = new Map();\r\n this.dragEndCallbackMap.set(draggedModel.id, dragEndCallback);\r\n }\r\n dragEndCallback.set(GLTFManageEventKey.Rotate, {\r\n id: draggedModel.id,\r\n headingPitchRoll: {\r\n heading: Cesium.Math.toDegrees(newHeading),\r\n pitch: Cesium.Math.toDegrees(modelHeadingPitchRoll.pitch),\r\n roll: Cesium.Math.toDegrees(modelHeadingPitchRoll.roll),\r\n },\r\n });\r\n }\r\n\r\n cleanup() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n}\r\n","interface DynamicImgMaterialOptions {\r\n color?: any; // 通常是 Cesium.Color | Cesium.Property\r\n duration?: number;\r\n image: string;\r\n count: number;\r\n freely?: 'vertical' | 'horizontal';\r\n direction: string; // 例如 '+' 或 '-',传给 GLSL\r\n isCustomColor?: boolean;\r\n materialType?: string;\r\n}\r\n\r\n/**\r\n * 注册动态图片材质并返回 TrailLineMaterialProperty 实例\r\n */\r\nexport function getDynamicImgMaterial(Cesium: any, options: DynamicImgMaterialOptions): any {\r\n const MaterialType =\r\n options.materialType || 'DynamicImgMaterial' + Date.now() + Math.floor(Math.random() * 1000);\r\n\r\n // 构造材质属性的构造函数 —— 保留 function + prototype 形式\r\n function TrailLineMaterialProperty(this: any, opts: DynamicImgMaterialOptions) {\r\n this._definitionChanged = new Cesium.Event();\r\n this._color = opts.color;\r\n this._colorSubscription = undefined;\r\n this.color = opts.color;\r\n this.duration = opts.duration;\r\n this._time = Date.now();\r\n }\r\n\r\n Object.defineProperties(TrailLineMaterialProperty.prototype, {\r\n isConstant: {\r\n get(): boolean {\r\n return false;\r\n },\r\n },\r\n definitionChanged: {\r\n get(): any {\r\n return this._definitionChanged;\r\n },\r\n },\r\n color: Cesium.createPropertyDescriptor('color'),\r\n });\r\n\r\n TrailLineMaterialProperty.prototype.getType = function (): string {\r\n return MaterialType;\r\n };\r\n\r\n TrailLineMaterialProperty.prototype.getValue = function (time: any, result?: any): any {\r\n if (!Cesium.defined(result)) {\r\n result = {};\r\n }\r\n result.color = Cesium.Property.getValueOrClonedDefault(\r\n this._color,\r\n time,\r\n Cesium.Color.WHITE,\r\n result.color,\r\n );\r\n result.image = options.image;\r\n // if (this.duration) {\r\n // result.time = ((Date.now() - this._time) % this.duration) / this.duration;\r\n // }\r\n return result;\r\n };\r\n\r\n TrailLineMaterialProperty.prototype.equals = function (other: any): boolean {\r\n return (\r\n this === other ||\r\n (other instanceof TrailLineMaterialProperty &&\r\n Cesium.Property.equals(this._color, (other as any)._color))\r\n );\r\n };\r\n\r\n // 着色器源码生成\r\n const _getWallShader = function (opts: {\r\n count: number;\r\n freely: string;\r\n direction: string;\r\n duration: number;\r\n isCustomColor?: boolean;\r\n }): string {\r\n let material = `\r\n czm_material czm_getMaterial(czm_materialInput materialInput)\r\n {\r\n czm_material material = czm_getDefaultMaterial(materialInput);\r\n vec2 st = materialInput.st;\r\n float time = fract(mod(float(czm_frameNumber * 33.0) , float(${opts.duration})) / float(${opts.duration}));\r\n ${\r\n opts.freely === 'vertical'\r\n ? `vec4 colorImage = texture(image, vec2(fract(float(${opts.count}) *st.t ${opts.direction} time), fract(st.s)));`\r\n : `vec4 colorImage = texture(image, vec2(fract(float(${opts.count}) *st.s ${opts.direction} time), fract(st.t)));`\r\n }\r\n ${opts.isCustomColor ? 'material.diffuse = color.rgb;' : 'material.diffuse = colorImage.rgb;'}\r\n material.alpha = colorImage.a;\\n\\\r\n return material;\\n\\\r\n }`;\r\n return material;\r\n };\r\n\r\n Cesium.Material._materialCache.addMaterial(MaterialType, {\r\n fabric: {\r\n type: MaterialType,\r\n uniforms: {\r\n color: options.color,\r\n image: options.image,\r\n time: 1000,\r\n },\r\n source: _getWallShader({\r\n count: options.count,\r\n freely: options.freely || '',\r\n direction: options.direction,\r\n duration: options.duration || 100,\r\n isCustomColor: options.isCustomColor,\r\n }),\r\n },\r\n translucent(): boolean {\r\n return true;\r\n },\r\n });\r\n\r\n return new (TrailLineMaterialProperty as any)(options);\r\n}\r\n\r\nexport function getWallMaterial(Cesium: any, options: any) {\r\n const MaterialType =\r\n options.MaterialType || 'wallType' + new Date().getTime() + parseInt(Math.random() * 1000 + '');\r\n function TrailLineMaterialProperty(this: any, options: any) {\r\n // 默认参数设置\r\n this._definitionChanged = new Cesium.Event();\r\n this._color = undefined;\r\n this._colorSubscription = undefined;\r\n this.color = options.color;\r\n this.duration = options.duration;\r\n this._time = new Date().getTime();\r\n }\r\n Object.defineProperties(TrailLineMaterialProperty.prototype, {\r\n isConstant: {\r\n get: function () {\r\n return false;\r\n },\r\n },\r\n definitionChanged: {\r\n get: function (this: any) {\r\n return this._definitionChanged;\r\n },\r\n },\r\n color: Cesium.createPropertyDescriptor('color'),\r\n });\r\n TrailLineMaterialProperty.prototype.getType = function () {\r\n return MaterialType;\r\n };\r\n TrailLineMaterialProperty.prototype.getValue = function (this: any, time: any, result: any) {\r\n if (!Cesium.defined(result)) {\r\n result = {};\r\n }\r\n // result.color = Cesium.Property.getValueOrClonedDefault(\r\n // this._color,\r\n // time,\r\n // Cesium.Color.WHITE,\r\n // result.color,\r\n // );\r\n result.image = options.image;\r\n if (this.duration) {\r\n result.time = ((new Date().getTime() - this._time) % this.duration) / this.duration;\r\n }\r\n return result;\r\n };\r\n TrailLineMaterialProperty.prototype.equals = function (this: any, other: any) {\r\n return (\r\n this === other ||\r\n (other instanceof TrailLineMaterialProperty &&\r\n Cesium.Property.equals(this._color, (other as any)._color))\r\n );\r\n };\r\n\r\n const _getWallShader = function (options: any) {\r\n let materail =\r\n 'czm_material czm_getMaterial(czm_materialInput materialInput)\\n\\\r\n {\\n\\\r\n czm_material material = czm_getDefaultMaterial(materialInput);\\n\\\r\n vec2 st = materialInput.st;\\n\\\r\n \\n ';\r\n if (options.freely == 'vertical') {\r\n //(由下到上)\r\n\r\n materail +=\r\n 'vec4 colorImage = texture(image, vec2(fract(float(' +\r\n options.count +\r\n ')*st.t ' +\r\n options.direction +\r\n ' time), fract(st.s)));\\n ';\r\n } else {\r\n //(逆时针)\r\n\r\n materail +=\r\n 'vec4 colorImage = texture(image, vec2(fract(float(' +\r\n options.count +\r\n ')*st.s ' +\r\n options.direction +\r\n ' time), fract(st.t)));\\n ';\r\n }\r\n //泛光\r\n materail +=\r\n 'vec4 fragColor;\\n\\\r\n fragColor.rgb = (colorImage.rgb) / 1.0;\\n\\\r\n fragColor = czm_gammaCorrect(fragColor);\\n ';\r\n\r\n materail +=\r\n ' material.diffuse = colorImage.rgb;\\n\\\r\n material.alpha = colorImage.a;\\n\\\r\n material.emission = fragColor.rgb;\\n\\\r\n \\n\\\r\n return material;\\n\\\r\n }\\n\\\r\n ';\r\n return materail;\r\n };\r\n\r\n Cesium.Material._materialCache.addMaterial(MaterialType, {\r\n fabric: {\r\n type: MaterialType,\r\n uniforms: {\r\n color: new Cesium.Color(1.0, 0.0, 0.0, 0.5),\r\n image: options.image,\r\n time: 0,\r\n },\r\n source: _getWallShader({\r\n count: options.count,\r\n freely: options.freely,\r\n direction: options.direction,\r\n }),\r\n },\r\n translucent: function () {\r\n return true;\r\n },\r\n });\r\n return new (TrailLineMaterialProperty as any)(options);\r\n}\r\n","interface PolylineFlowMaterialOptions {\r\n color?: any; // 一般是 Cesium.Color | Cesium.Property\r\n duration?: number; // 流动持续时间\r\n materialType?: string;\r\n}\r\n\r\n/**\r\n * 注册 polyline 流动材质并返回对应的 MaterialProperty\r\n */\r\nexport function getPolylineFlowMaterialProperty(\r\n Cesium: any,\r\n options: PolylineFlowMaterialOptions,\r\n): any {\r\n const Color = Cesium.Color;\r\n const defineProperties = Object.defineProperties;\r\n const Event = Cesium.Event;\r\n const createPropertyDescriptor = Cesium.createPropertyDescriptor;\r\n const Property = Cesium.Property;\r\n const defaultValue = <T>(value: T | undefined, defaultVal: T): T =>\r\n value === undefined ? defaultVal : value;\r\n const DEFAULT_EMPTY_OBJECT: any = {};\r\n \r\n let _materialType =\r\n options.materialType || 'PolylineFlow' + Date.now() + Math.floor(Math.random() * 1000);\r\n\r\n // 构造函数保持 function + prototype 形式\r\n function PolylineFlowMaterialProperty(this: any, opts: PolylineFlowMaterialOptions) {\r\n opts = defaultValue(opts, DEFAULT_EMPTY_OBJECT);\r\n this._definitionChanged = new Event();\r\n this._color = undefined;\r\n this._colorSubscription = undefined;\r\n this.color = opts.color || Color.fromBytes(0, 255, 255, 255);\r\n this._duration = undefined;\r\n this._durationSubscription = undefined;\r\n this.duration = defaultValue(opts.duration, 45);\r\n }\r\n\r\n defineProperties(PolylineFlowMaterialProperty.prototype, {\r\n isConstant: {\r\n get(): boolean {\r\n return false;\r\n },\r\n },\r\n definitionChanged: {\r\n get(): any {\r\n return this._definitionChanged;\r\n },\r\n },\r\n });\r\n\r\n PolylineFlowMaterialProperty.prototype.getType = function (_time: any): string {\r\n return _materialType;\r\n };\r\n\r\n PolylineFlowMaterialProperty.prototype.getValue = function (time: any, result?: any): any {\r\n if (!result) {\r\n result = {};\r\n }\r\n result.color = Property.getValueOrClonedDefault(\r\n this._color,\r\n time,\r\n Cesium.Color.WHITE,\r\n result.color,\r\n );\r\n result.duration = this._duration;\r\n return result;\r\n };\r\n\r\n PolylineFlowMaterialProperty.prototype.equals = function (other?: any): boolean {\r\n return (\r\n this === other ||\r\n (other instanceof PolylineFlowMaterialProperty &&\r\n Property.equals(this._color, (other as any)._color))\r\n );\r\n };\r\n\r\n defineProperties(PolylineFlowMaterialProperty.prototype, {\r\n color: createPropertyDescriptor('color'),\r\n duration: createPropertyDescriptor('duration'),\r\n });\r\n\r\n // 挂到 Cesium 方便外部直接使用\r\n Cesium.PolylineFlowMaterialProperty = PolylineFlowMaterialProperty;\r\n\r\n Cesium.Material._materialCache.addMaterial(_materialType, {\r\n fabric: {\r\n type: _materialType,\r\n uniforms: {\r\n color: new Color(1.0, 1.0, 1.0, 1),\r\n duration: 45,\r\n },\r\n source: (function () {\r\n return `uniform vec4 color;\r\n uniform float duration;\r\n czm_material czm_getMaterial(czm_materialInput materialInput){\r\n czm_material material = czm_getDefaultMaterial(materialInput);\r\n vec2 st = materialInput.st;\r\n float t = fract(czm_frameNumber / duration);\r\n t *= 1.03;\r\n float alpha = smoothstep(t - 0.03, t, st.s) * step(-t, -st.s);\r\n alpha += 0.2;\r\n vec4 fragColor;\r\n fragColor.rgb = color.rgb;\r\n fragColor = czm_gammaCorrect(fragColor);\r\n material.diffuse = fragColor.rgb;\r\n material.alpha = alpha;\r\n material.emission = fragColor.rgb;\r\n return material;\r\n }`;\r\n })(),\r\n },\r\n translucent(): boolean {\r\n return true;\r\n },\r\n });\r\n\r\n return new (PolylineFlowMaterialProperty as any)(options);\r\n}\r\n","interface RegisterOptions {\r\n themeKey: string;\r\n material: any;\r\n force?: boolean; // 可选,默认 false\r\n category?: string; // 可选,默认 'default'\r\n}\r\n\r\nexport class MaterialManager {\r\n private categoryMap: Map<string, Map<string, any>> = new Map();\r\n\r\n private CategoryGet = {} as { [key: string]: Function };\r\n constructor() {}\r\n\r\n registerCategoryGet(category: string, fn: Function): void {\r\n if (!category) return console.warn('分类不能为空');\r\n this.CategoryGet[category] = fn;\r\n }\r\n /**\r\n * 注册材质\r\n */\r\n register(options: RegisterOptions): void {\r\n const { themeKey, material, force = false, category = 'default' } = options;\r\n\r\n if (!this.categoryMap.has(category)) {\r\n this.categoryMap.set(category, new Map());\r\n }\r\n const materialMap = this.categoryMap.get(category)!;\r\n\r\n if (materialMap.has(themeKey)) {\r\n if (!force) {\r\n console.warn(\r\n `[MaterialManager] 已存在 themeKey '${themeKey}' 在分类 '${category}',如需覆盖请设置 force = true`,\r\n );\r\n return;\r\n } else {\r\n console.info(`[MaterialManager] themeKey '${themeKey}' 在分类 '${category}' 已被覆盖`);\r\n }\r\n }\r\n materialMap.set(themeKey, material);\r\n }\r\n\r\n /**\r\n * 获取材质\r\n */\r\n get({\r\n themeKey,\r\n category,\r\n options,\r\n }: {\r\n themeKey: string;\r\n category?: string;\r\n options?: any;\r\n }): any | undefined {\r\n category = category || 'default';\r\n if (this.CategoryGet[category]) {\r\n return this.CategoryGet[category]({\r\n themeKey,\r\n materialMap: this.categoryMap,\r\n options: options || {},\r\n });\r\n }\r\n return this.categoryMap.get(category)?.get(themeKey);\r\n }\r\n\r\n /**\r\n * 是否存在\r\n */\r\n has(themeKey: string, category: string = 'default'): boolean {\r\n return this.categoryMap.get(category)?.has(themeKey) ?? false;\r\n }\r\n\r\n /**\r\n * 移除材质\r\n */\r\n remove(themeKey: string, category: string = 'default'): void {\r\n const materialMap = this.categoryMap.get(category);\r\n if (!materialMap) return;\r\n\r\n const material = materialMap.get(themeKey);\r\n if (material?.destroy) {\r\n material.destroy();\r\n }\r\n materialMap.delete(themeKey);\r\n\r\n if (materialMap.size === 0) {\r\n this.categoryMap.delete(category);\r\n }\r\n }\r\n\r\n /**\r\n * 获取某分类下的所有 keys\r\n */\r\n keys(category: string = 'default'): string[] {\r\n return [...(this.categoryMap.get(category)?.keys() || [])];\r\n }\r\n\r\n /**\r\n * 清空某个分类\r\n */\r\n clearCategory(category: string = 'default'): void {\r\n const materialMap = this.categoryMap.get(category);\r\n if (!materialMap) return;\r\n\r\n for (const material of materialMap.values()) {\r\n material?.destroy?.();\r\n }\r\n materialMap.clear();\r\n this.categoryMap.delete(category);\r\n }\r\n\r\n /**\r\n * 清空所有\r\n */\r\n clearAll(): void {\r\n for (const materialMap of this.categoryMap.values()) {\r\n for (const material of materialMap.values()) {\r\n material?.destroy?.();\r\n }\r\n }\r\n this.categoryMap.clear();\r\n }\r\n\r\n /**\r\n * 获取所有分类\r\n */\r\n categories(): string[] {\r\n return [...this.categoryMap.keys()];\r\n }\r\n}\r\n","import { BufferedHierarchicalAggregator } from '../BufferedHierarchicalAggregator';\r\nimport { HtmlOverlayLabelPool } from '../HtmlOverlayLabelPool';\r\nimport { MarkerEventKey } from '../MarkerEvent';\r\nimport { MaterialManager } from '../Material/MaterialManager';\r\n\r\ninterface EntityGroupOptions {\r\n id: string;\r\n entities?: any[]; // 默认值为空数组\r\n primitives?: any[]; // 默认值为空数组\r\n dataItem?: any; // 默认值为空对象\r\n aggregator?: BufferedHierarchicalAggregator;\r\n cardPool: HtmlOverlayLabelPool;\r\n}\r\n\r\nexport class EntityGroup {\r\n id: string;\r\n entities: any[] = [];\r\n primitives: any[] = [];\r\n dataItem: any = {};\r\n aggregator?: BufferedHierarchicalAggregator;\r\n cardPool: HtmlOverlayLabelPool;\r\n\r\n constructor(options: EntityGroupOptions) {\r\n // 从 options 中解构参数并设置默认值\r\n const { id, entities = [], primitives = [], dataItem = {}, aggregator, cardPool } = options;\r\n\r\n this.id = id;\r\n this.entities = entities;\r\n this.primitives = primitives;\r\n this.dataItem = dataItem;\r\n this.aggregator = aggregator;\r\n this.cardPool = cardPool;\r\n }\r\n\r\n // 改造 setVisible 方法,支持 Entity 和 Primitive 的可见性控制\r\n setVisible(visible: boolean) {\r\n // 控制 Cesium 原生实体\r\n this.entities.forEach((entity) => {\r\n if (entity) {\r\n entity.show = visible;\r\n }\r\n });\r\n\r\n // 控制 Cesium 原生 Primitive\r\n this.primitives.forEach((primitive) => {\r\n if (primitive) {\r\n primitive.show = visible;\r\n }\r\n });\r\n\r\n // 控制 billboard 聚合点(通过 aggregator)\r\n if (this.aggregator && Array.isArray(this.dataItem.billboard)) {\r\n const updated = this.dataItem.billboard.map((bill: any, index: number) => {\r\n const id = this.dataItem.id;\r\n return {\r\n id,\r\n data: {\r\n ...this.dataItem,\r\n show: visible && (bill.data?.show ?? true),\r\n },\r\n };\r\n });\r\n updated.forEach((p: any) => {\r\n this.aggregator?.updatePoint(p);\r\n });\r\n }\r\n\r\n // 控制 HTML 标签池\r\n if (this.cardPool && this.dataItem.card) {\r\n visible\r\n ? this.cardPool.showByIds([this.dataItem.id])\r\n : this.cardPool.hideByIds([this.dataItem.id]);\r\n }\r\n }\r\n\r\n // 改造 removeAll 方法,支持 Entity 和 Primitive 的移除\r\n removeAll(viewer: any, immediately = true) {\r\n // 移除 Entity\r\n this.entities.forEach((entity) => {\r\n if (entity) viewer.entities.remove(entity);\r\n });\r\n this.entities = [];\r\n\r\n // 移除 Primitive\r\n this.primitives.forEach((primitive) => {\r\n if (primitive) viewer.scene.primitives.remove(primitive);\r\n });\r\n this.primitives = [];\r\n\r\n // 移除 billboard 聚合点\r\n if (immediately && this.aggregator && Array.isArray(this.dataItem.billboard)) {\r\n this.aggregator.removePointsById([this.dataItem.id]);\r\n }\r\n\r\n // 移除 HTML 标签池中的卡片\r\n if (immediately && this.cardPool && this.dataItem.card) {\r\n this.cardPool.removeByIds([this.dataItem.id]);\r\n }\r\n\r\n return this.dataItem.id;\r\n }\r\n}\r\n\r\nexport class EntityLayer {\r\n id: string;\r\n groupMap: Map<string, EntityGroup> = new Map();\r\n Cesium: any;\r\n viewer: any;\r\n materialManager: MaterialManager;\r\n aggregator: BufferedHierarchicalAggregator;\r\n cardPool: HtmlOverlayLabelPool;\r\n constructor(\r\n id: string,\r\n Cesium: any,\r\n viewer: any,\r\n materialManager: MaterialManager,\r\n aggregator: BufferedHierarchicalAggregator,\r\n cardPool: HtmlOverlayLabelPool,\r\n ) {\r\n this.id = id;\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n this.materialManager = materialManager;\r\n this.aggregator = aggregator;\r\n this.cardPool = cardPool;\r\n\r\n this.aggregator.labelPool.eventBus.addListener(MarkerEventKey.Click, {\r\n name: 'BufferedHierarchicalAggregator_maker_click',\r\n fn: (info, e) => {\r\n this.cardPool.showByIds([info.data.id]);\r\n },\r\n });\r\n\r\n const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);\r\n\r\n handler.setInputAction(() => {\r\n this.cardPool.hideFilter((data) => {\r\n if (data.initShow) return false;\r\n return true;\r\n });\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n }\r\n\r\n /** ====== 下面是抽出的创建函数 ====== */\r\n private createPolyline(line: any, show: boolean) {\r\n if (!line.positions || line.positions.length < 1) return null;\r\n const material = this.materialManager.get({\r\n themeKey: line.theme,\r\n category: 'polyline',\r\n options: line,\r\n });\r\n const positions = Array.isArray(line.positions[0]) ? line.positions.flat() : line.positions;\r\n let opt = {\r\n ...line,\r\n };\r\n if (material) opt.material = material;\r\n return this.viewer.entities.add({\r\n polyline: {\r\n ...opt,\r\n positions: this.Cesium.Cartesian3.fromDegreesArrayHeights(positions),\r\n },\r\n show: (line.show ?? true) && show,\r\n });\r\n }\r\n\r\n private createWall(wall: any, show: boolean) {\r\n if (!wall.positions || wall.positions.length < 1) return null;\r\n const material = this.materialManager.get({\r\n themeKey: wall.theme,\r\n category: 'wall',\r\n options: wall,\r\n });\r\n\r\n const minHeights =\r\n wall.positions.length === wall.minimumHeights?.length\r\n ? wall.minimumHeights.map((n: any) => n - Number(wall.minHeight || 0))\r\n : wall.positions.map((n: any) => (n[2] || 0) - Number(wall.minHeight || 0));\r\n\r\n const maxHeights =\r\n wall.positions.length === wall.maximumHeights?.length\r\n ? wall.maximumHeights.map((n: any) => n + Number(wall.maxHeight || 0))\r\n : wall.positions.map((n: any) => (n[2] || 0) + Number(wall.maxHeight || 0));\r\n\r\n const pos = wall.positions.map((p: any) =>\r\n this.Cesium.Cartesian3.fromDegrees(p[0], p[1], p[2] || 0),\r\n );\r\n let opt = {\r\n ...wall,\r\n };\r\n if (material) opt.material = material;\r\n return this.viewer.entities.add({\r\n wall: {\r\n ...opt,\r\n positions: pos,\r\n minimumHeights: minHeights,\r\n maximumHeights: maxHeights,\r\n },\r\n show: (wall.show ?? true) && show,\r\n });\r\n }\r\n\r\n private createPolygon(poly: any, show: boolean) {\r\n // 确保多边形数据有效\r\n if (!poly.hierarchy || poly.hierarchy.length < 1) return null;\r\n\r\n // 获取材质\r\n const material = this.materialManager.get({\r\n themeKey: poly.theme,\r\n category: 'polygon',\r\n options: poly,\r\n });\r\n\r\n // 处理外环(外环是第一个元素)\r\n const outerRing = Array.isArray(poly.hierarchy[0]) ? poly.hierarchy.flat() : poly.hierarchy;\r\n const outerCartesian = this.Cesium.Cartesian3.fromDegreesArrayHeights(outerRing);\r\n\r\n // 处理孔数据(如果有孔数据)\r\n const holes =\r\n poly.holes?.map((hole: any) => {\r\n let _hole = Array.isArray(hole[0]) ? poly.hierarchy.flat() : poly.hole;\r\n return this.Cesium.Cartesian3.fromDegreesArrayHeights(_hole.flat());\r\n }) || [];\r\n\r\n // 使用 PolygonHierarchy 来构建多边形\r\n const polygonHierarchy = new this.Cesium.PolygonHierarchy(outerCartesian, holes);\r\n let opt = {\r\n ...poly,\r\n };\r\n if (material) opt.material = material;\r\n // 创建并返回实体\r\n return this.viewer.entities.add({\r\n polygon: {\r\n ...opt,\r\n hierarchy: polygonHierarchy, // 使用构建好的 PolygonHierarchy\r\n },\r\n show: (poly.show ?? true) && show,\r\n });\r\n }\r\n\r\n private createBillboardPoints(dataItem: any) {\r\n if (!dataItem.billboard?.length || !this.aggregator) return [];\r\n return dataItem.billboard.map((bill: any) => {\r\n const [lon, lat, height = 0] = bill.position || [0, 0, 0];\r\n return {\r\n id: dataItem.id,\r\n lon,\r\n lat,\r\n height,\r\n name: bill.options?.text || '',\r\n data: dataItem,\r\n style: { zIndex: dataItem.zIndex || '1' },\r\n };\r\n });\r\n }\r\n\r\n private createCard(dataItem: any) {\r\n if (!dataItem.card?.data?.length) return;\r\n this.cardPool.add(dataItem.card, {\r\n id: dataItem.id,\r\n lon: dataItem.card.position[0],\r\n lat: dataItem.card.position[1],\r\n height: dataItem.card.position[3] || 0,\r\n theme: dataItem.card.theme,\r\n show: dataItem.show ? (dataItem.card.initShow ?? false) : false,\r\n notCreateElement: true,\r\n style: { width: '0', height: '0', zIndex: dataItem?.card?.zIndex || '110' },\r\n });\r\n }\r\n\r\n /** ====== 主入口:仅保留循环,内部调用独立函数 ====== */\r\n addGroup(dataItem: any, isAppendPoints = true) {\r\n const groupId = dataItem.id || `${Date.now()}`;\r\n this.removeGroup(groupId);\r\n const entities: any[] = [];\r\n const show = dataItem.show !== false;\r\n\r\n (dataItem.polyline || []).forEach((l: any) => {\r\n const e = this.createPolyline(l, show);\r\n if (e) entities.push(e);\r\n });\r\n\r\n (dataItem.wall || []).forEach((w: any) => {\r\n const e = this.createWall(w, show);\r\n if (e) entities.push(e);\r\n });\r\n\r\n (dataItem.polygon || []).forEach((p: any) => {\r\n const e = this.createPolygon(p, show);\r\n if (e) entities.push(e);\r\n });\r\n\r\n const pointList = this.createBillboardPoints(dataItem);\r\n if (pointList.length && isAppendPoints) this.aggregator.appendPoints(pointList, false);\r\n\r\n this.createCard(dataItem);\r\n\r\n const group = new EntityGroup({\r\n id: groupId,\r\n entities,\r\n primitives: [],\r\n dataItem,\r\n aggregator: this.aggregator,\r\n cardPool: this.cardPool,\r\n });\r\n this.groupMap.set(groupId, group);\r\n return pointList;\r\n }\r\n\r\n async addGroups(dataItemList: any) {\r\n let dataLists = dataItemList.map((dataItem: any) => {\r\n return this.addGroup(dataItem, false);\r\n });\r\n\r\n // 拉平二维数组\r\n const allPoints = dataLists.flat();\r\n if (allPoints.length > 0 && this.aggregator) {\r\n this.aggregator.appendPoints(allPoints, false);\r\n }\r\n }\r\n\r\n removeGroup(groupId: string) {\r\n const group = this.groupMap.get(groupId);\r\n if (group) {\r\n group.removeAll(this.viewer);\r\n this.groupMap.delete(groupId);\r\n }\r\n }\r\n removeGroups(groupIds: string[]) {\r\n let ids = [];\r\n for (const groupId of groupIds) {\r\n const group = this.groupMap.get(groupId);\r\n if (group) {\r\n let id = group.removeAll(this.viewer, false);\r\n this.groupMap.delete(groupId);\r\n ids.push(id);\r\n }\r\n }\r\n this.aggregator.removePointsById(ids);\r\n this.cardPool.removeByIds(ids);\r\n }\r\n updateGroup(dataItem: any) {\r\n const group = this.groupMap.get(dataItem.id);\r\n if (group) {\r\n group.removeAll(this.viewer);\r\n this.groupMap.delete(dataItem.id);\r\n }\r\n this.addGroup(dataItem);\r\n }\r\n\r\n async updateGroups(dataItemList: Array<any>) {\r\n this.aggregator.removePointsById(dataItemList.map((n: any) => n.id));\r\n this.cardPool.removeByIds(dataItemList.map((n: any) => n.id));\r\n let dataLists = dataItemList.map((dataItem: any) => {\r\n const group = this.groupMap.get(dataItem.id);\r\n if (group) {\r\n group.removeAll(this.viewer, false);\r\n this.groupMap.delete(dataItem.id);\r\n }\r\n return this.addGroup(dataItem, false);\r\n });\r\n\r\n // 拉平二维数组\r\n const allPoints = dataLists.flat();\r\n if (allPoints.length > 0 && this.aggregator) {\r\n this.aggregator.appendPoints(allPoints, false);\r\n }\r\n }\r\n\r\n setGroupVisible(groupId: string, visible: boolean) {\r\n this.groupMap.get(groupId)?.setVisible(visible);\r\n }\r\n\r\n clearAllGroups() {\r\n this.groupMap.forEach((group) => group.removeAll(this.viewer));\r\n this.groupMap.clear();\r\n }\r\n}\r\n\r\nexport class EntityLayerManager {\r\n Cesium: any;\r\n viewer: any;\r\n layerMap: Map<string, EntityLayer> = new Map();\r\n materialManager: MaterialManager;\r\n aggregator: BufferedHierarchicalAggregator;\r\n cardPool: HtmlOverlayLabelPool;\r\n constructor(\r\n Cesium: any,\r\n viewer: any,\r\n materialManager: MaterialManager,\r\n aggregator: BufferedHierarchicalAggregator,\r\n cardPool: HtmlOverlayLabelPool,\r\n ) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n this.materialManager = materialManager;\r\n this.aggregator = aggregator;\r\n this.cardPool = cardPool;\r\n }\r\n\r\n addLayer(layerId: string) {\r\n if (!this.layerMap.has(layerId)) {\r\n this.layerMap.set(\r\n layerId,\r\n new EntityLayer(\r\n layerId,\r\n this.Cesium,\r\n this.viewer,\r\n this.materialManager,\r\n this.aggregator,\r\n this.cardPool,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n removeLayer(layerId: string) {\r\n const layer = this.layerMap.get(layerId);\r\n if (layer) {\r\n layer.clearAllGroups();\r\n this.layerMap.delete(layerId);\r\n }\r\n }\r\n\r\n getLayer(layerId: string): EntityLayer | undefined {\r\n return this.layerMap.get(layerId);\r\n }\r\n\r\n async addGroupsToLayer(layerId: string, dataList: any[]) {\r\n const layer = this.layerMap.get(layerId);\r\n if (!layer) return;\r\n // dataList.forEach((data) => layer.addGroup(data));\r\n layer.addGroups(dataList);\r\n this.aggregator.refresh();\r\n }\r\n updateGroupToLayer(layerId: string, dataList: any[]) {\r\n const layer = this.layerMap.get(layerId);\r\n if (!layer) return;\r\n\r\n layer.updateGroups(dataList);\r\n this.aggregator.refresh();\r\n }\r\n\r\n setGroupVisible(layerId: string, groupId: string, visible: boolean) {\r\n this.layerMap.get(layerId)?.setGroupVisible(groupId, visible);\r\n }\r\n\r\n removeGroup(layerId: string, groupId: string) {\r\n this.layerMap.get(layerId)?.removeGroup(groupId);\r\n }\r\n removeGroups(layerId: string, groupIds: string[]) {\r\n this.layerMap.get(layerId)?.removeGroups(groupIds);\r\n }\r\n}\r\n","export function convertGeoJsonToEntityData(geoJson: any): any[] {\r\n const dataList: any[] = [];\r\n\r\n // 遍历 GeoJSON 中的所有特性\r\n geoJson.features.forEach((feature: any, index: number) => {\r\n if (feature.geometry && feature.properties) {\r\n const geometry = feature.geometry;\r\n const properties = feature.properties;\r\n\r\n // 初始化数据项\r\n const dataItem: any = {\r\n id: properties.id || `${Date.now()}`,\r\n show: true, // 默认为显示\r\n zIndex: properties.zIndex || 1, // 默认为 1\r\n name: `${properties.layer}_${index}` || '',\r\n billboard: [],\r\n polyline: [],\r\n wall: [],\r\n polygon: [],\r\n card: properties.card || null, // 如果存在 card 数据则加入\r\n };\r\n\r\n // 根据几何类型转换数据\r\n switch (geometry.type) {\r\n case 'Point':\r\n // 处理 Point 类型\r\n dataItem.billboard.push({\r\n position: geometry.coordinates, // GeoJSON 的坐标格式 [lon, lat]\r\n options: properties, // 可以传递一些附加属性\r\n name: `${properties.layer}_${index}`,\r\n });\r\n break;\r\n\r\n case 'LineString':\r\n // 处理 LineString 类型\r\n dataItem.polyline.push({\r\n positions: geometry.coordinates, // GeoJSON 的坐标数组\r\n theme: properties.theme || 'default', // 传递 theme 信息\r\n });\r\n break;\r\n\r\n case 'Polygon':\r\n // 处理 Polygon 类型\r\n dataItem.polygon.push({\r\n hierarchy: geometry.coordinates[0], // GeoJSON 的多边形坐标数组\r\n theme: properties.theme || 'default',\r\n });\r\n break;\r\n\r\n case 'MultiLineString':\r\n // 处理 MultiLineString 类型\r\n geometry.coordinates.forEach((line: any[]) => {\r\n dataItem.polyline.push({\r\n positions: line,\r\n });\r\n });\r\n break;\r\n\r\n case 'MultiPolygon':\r\n // 处理 MultiPolygon 类型\r\n geometry.coordinates.forEach((polygon: any[]) => {\r\n dataItem.polygon.push({\r\n hierarchy: polygon[0], // 多个多边形时,取第一个\r\n });\r\n });\r\n break;\r\n\r\n case 'GeometryCollection':\r\n // 处理 GeometryCollection 类型(多种几何类型组合)\r\n geometry.geometries.forEach((geom: any) => {\r\n if (geom.type === 'Point') {\r\n dataItem.billboard.push({\r\n position: geom.coordinates,\r\n });\r\n } else if (geom.type === 'LineString') {\r\n dataItem.polyline.push({\r\n positions: geom.coordinates,\r\n });\r\n } else if (geom.type === 'Polygon') {\r\n dataItem.polygon.push({\r\n hierarchy: geom.coordinates[0],\r\n });\r\n }\r\n });\r\n break;\r\n\r\n default:\r\n console.warn(`Unsupported geometry type: ${geometry.type}`);\r\n break;\r\n }\r\n\r\n // 将转换后的数据项添加到数据列表\r\n dataList.push(dataItem);\r\n }\r\n });\r\n\r\n return dataList;\r\n}\r\n","import { EntityLayerManager } from '../entity/EntityLayer';\r\nimport { MaterialManager } from '../Material/MaterialManager';\r\nimport { cloneDeep } from 'lodash-es';\r\nexport class PrimitiveManager {\r\n private Cesium: any;\r\n private viewer: any; // Cesium.Viewer\r\n private layerMap: Map<string, Map<string, any>>;\r\n private hideLayerMap: Map<string, Set<string>>;\r\n entityLayerManager: EntityLayerManager;\r\n private PrimitiveThemeMap: Map<\r\n string,\r\n {\r\n Primitive: any;\r\n ids: Map<string, any>;\r\n geometryInstances: Map<string, any>;\r\n appearance: any;\r\n }\r\n >; // theme -> 合并后的 Primitive 和图元 ID 的映射\r\n materialManager: MaterialManager;\r\n\r\n constructor(options: {\r\n Cesium: any;\r\n viewer: any;\r\n materialManager: MaterialManager;\r\n entityLayerManager: EntityLayerManager;\r\n }) {\r\n let { Cesium, viewer, materialManager, entityLayerManager } = options;\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n this.layerMap = new Map();\r\n this.PrimitiveThemeMap = new Map(); // 存储 theme -> { Primitive, ids, geometryInstances }\r\n this.hideLayerMap = new Map();\r\n this.materialManager = materialManager;\r\n this.entityLayerManager = entityLayerManager;\r\n }\r\n\r\n //创建图元\r\n private createGeometryInstance(item: any): any {\r\n let geometryInstance: any;\r\n if (item.category === 'polyline' && item.positions) {\r\n geometryInstance = this.createPolyline(item);\r\n } else if (item.category === 'polygon' && item.hierarchy) {\r\n geometryInstance = this.createPolygon(item);\r\n }\r\n return geometryInstance;\r\n }\r\n\r\n // 创建或获取 材质图元组\r\n private carateThemePrimitive(_item: any) {\r\n let item = cloneDeep(_item);\r\n let themePrimitive = this.PrimitiveThemeMap.get(item.theme);\r\n if (!themePrimitive) {\r\n this.initTheme(item);\r\n // 如果没有,则初始化一个新的 entry\r\n let appearance = this.createAppearance(item);\r\n themePrimitive = {\r\n Primitive: null,\r\n ids: new Map(),\r\n appearance: appearance,\r\n geometryInstances: new Map(),\r\n };\r\n this.PrimitiveThemeMap.set(item.theme, themePrimitive);\r\n }\r\n return themePrimitive;\r\n }\r\n\r\n //注册主题\r\n initTheme(item: any) {\r\n let materialManager = this.materialManager;\r\n let Cesium = this.Cesium;\r\n if (item.category == 'polyline') {\r\n const isDashed =\r\n item.properties?.lineType?.pattern && item.properties?.lineType?.patternLength;\r\n let lineMaterialKey = '';\r\n if (isDashed) {\r\n const dashPattern = item.properties?.lineType?.pattern || [0.25, -0.125];\r\n const dashLength = item.properties?.lineType?.patternLength || 0.375;\r\n let cesiumDash = this.convertCadPatternToCesiumDash(dashPattern, dashLength);\r\n lineMaterialKey = `DashedLineMaterial_pattern_${cesiumDash.dashPattern}_dashLength_${cesiumDash.dashLength}_color_${item.properties?.color}`;\r\n if (!materialManager.has(lineMaterialKey)) {\r\n materialManager.register({\r\n themeKey: lineMaterialKey,\r\n material: Cesium.Material.fromType('PolylineDash', {\r\n color: Cesium.Color.fromCssColorString(item.properties.color || '#FFFFFF').withAlpha(\r\n 0.8,\r\n ),\r\n dashLength: cesiumDash.dashLength, // ← 注意,这里填总长度\r\n dashPattern: cesiumDash.dashPattern, // ← 这里才是 16-bit 掩码\r\n }),\r\n });\r\n }\r\n } else {\r\n lineMaterialKey = `LineMaterial_color_${item.properties?.color}`;\r\n if (!materialManager.has(lineMaterialKey)) {\r\n materialManager.register({\r\n themeKey: lineMaterialKey,\r\n material: Cesium.Material.fromType('Color', {\r\n color: Cesium.Color.fromCssColorString(item.properties.color || '#FFFFFF').withAlpha(\r\n 0.8,\r\n ),\r\n }),\r\n });\r\n }\r\n }\r\n } else if (item.category == 'polygon') {\r\n let polygonMaterialKey = `polygonMaterial_color_${item.properties?.color}`;\r\n if (!materialManager.has(polygonMaterialKey)) {\r\n materialManager.register({\r\n themeKey: polygonMaterialKey,\r\n material: Cesium.Material.fromType('Color', {\r\n color: Cesium.Color.fromCssColorString(item.properties?.color || '#FFFFFF').withAlpha(\r\n 0.8,\r\n ),\r\n }),\r\n });\r\n }\r\n }\r\n }\r\n\r\n convertCadPatternToCesiumDash(pattern: Array<number>, patternLength: number) {\r\n const segmentCount = 16;\r\n const unitLength = patternLength / segmentCount;\r\n\r\n // 第一步:先用 floor 分配位数,统计已经分配的位数\r\n let dashBits = [] as Array<number>;\r\n let assigned = 0;\r\n for (let len of pattern) {\r\n const count = Math.floor(Math.abs(len) / unitLength);\r\n const bit = len >= 0 ? 1 : 0;\r\n for (let i = 0; i < count; i++) {\r\n dashBits.push(bit);\r\n assigned++;\r\n if (assigned >= segmentCount) break;\r\n }\r\n if (assigned >= segmentCount) break;\r\n }\r\n\r\n // 如果分配不到 16 位,用 “空” 填满;如果多了,则截断\r\n while (dashBits.length < segmentCount) {\r\n dashBits.push(0);\r\n }\r\n if (dashBits.length > segmentCount) {\r\n dashBits.length = segmentCount;\r\n }\r\n\r\n // 第二步:把 16 位数组变成一个整数\r\n let dashPattern = 0;\r\n for (let i = 0; i < segmentCount; i++) {\r\n dashPattern = (dashPattern << 1) | dashBits[i];\r\n }\r\n\r\n return {\r\n dashPattern: dashPattern,\r\n dashLength: patternLength,\r\n };\r\n }\r\n\r\n // 创建或更新图层并添加几何体\r\n public async processBatch(data: Array<{ layerId: string; dataList: any[] }>): Promise<void> {\r\n const materialThemes = new Map(); // 用于记录所有出现的材质 theme\r\n data.forEach((item) => {\r\n let { layerId, dataList } = item;\r\n let batch = cloneDeep(dataList);\r\n batch.forEach((item) => {\r\n let geometryInstance = this.createGeometryInstance(item);\r\n\r\n if (geometryInstance) {\r\n // 检查是否已有相同 theme 的 Primitive\r\n let themePrimitive = this.carateThemePrimitive(item);\r\n\r\n // 将当前 item 的 id 添加到 themePrimitive.ids 中\r\n themePrimitive.ids.set(item.id, item);\r\n themePrimitive.geometryInstances.set(item.id, geometryInstance); // 添加到几何实例集合中\r\n\r\n const layer = this.layerMap.get(layerId);\r\n if (layer) {\r\n layer.set(item.id, item);\r\n } else {\r\n let map = new Map();\r\n this.layerMap.set(layerId, map);\r\n map.set(item.id, item);\r\n }\r\n\r\n // 记录 materialTheme\r\n materialThemes.set(item.theme, item);\r\n }\r\n });\r\n });\r\n // 循环结束后,统一调用 updatePrimitive\r\n materialThemes.forEach((item) => {\r\n this.updatePrimitive(item);\r\n });\r\n }\r\n\r\n // 创建折线几何体(不再获取材质)\r\n private createPolyline(item: any): any {\r\n const positions = Array.isArray(item.positions[0]) ? item.positions.flat() : item.positions;\r\n return new this.Cesium.GeometryInstance({\r\n id: item.id,\r\n geometry: new this.Cesium.GroundPolylineGeometry({\r\n positions: this.Cesium.Cartesian3.fromDegreesArrayHeights(positions),\r\n // width: 10,\r\n width: Math.max(item.width || 2, 2),\r\n }),\r\n });\r\n }\r\n\r\n // 创建多边形几何体(不再获取材质)\r\n private createPolygon(item: any): any {\r\n const outerRing = Array.isArray(item.hierarchy[0]) ? item.hierarchy.flat() : item.hierarchy;\r\n const outerCartesian = this.Cesium.Cartesian3.fromDegreesArrayHeights(outerRing);\r\n const holes =\r\n item.holes?.map((hole: any) => {\r\n let _hole = Array.isArray(hole[0]) ? hole.flat() : hole;\r\n let _holeDegrees = this.Cesium.Cartesian3.fromDegreesArrayHeights(_hole.flat());\r\n return new this.Cesium.PolygonHierarchy(_holeDegrees);\r\n }) || [];\r\n\r\n const polygonHierarchy = new this.Cesium.PolygonHierarchy(outerCartesian, holes);\r\n\r\n return new this.Cesium.GeometryInstance({\r\n id: item.id,\r\n geometry: new this.Cesium.PolygonGeometry({\r\n polygonHierarchy: polygonHierarchy,\r\n }),\r\n });\r\n }\r\n\r\n // 获取材质(在 updatePrimitive 中处理)\r\n private getMaterial(item: any): any {\r\n let material = this.materialManager.get({\r\n themeKey: item.theme,\r\n options: item,\r\n });\r\n\r\n if (!material) {\r\n material = this.Cesium.Material.fromType('Color', {\r\n color: new this.Cesium.Color(1.0, 0.0, 0.0, 1.0), // 默认红色\r\n });\r\n }\r\n\r\n return material;\r\n }\r\n\r\n // 更新图元\r\n public updateGeometryInstance(_item: any): void {\r\n let item = cloneDeep(_item);\r\n\r\n const layer = this.layerMap.get(item.layerId);\r\n if (!layer) {\r\n console.warn(`没有找到图层 ${item.layerId}`);\r\n return;\r\n }\r\n\r\n let geometryInstanceInfo = layer.get(item.id);\r\n layer.set(item.id, item);\r\n if (!geometryInstanceInfo) {\r\n console.warn(`没有找到图元 ${item.id} 在图层 ${item.layerId} 中`);\r\n return;\r\n }\r\n if (geometryInstanceInfo.theme !== item.theme) {\r\n //更新旧的主题\r\n let oldThemePrimitive = this.PrimitiveThemeMap.get(geometryInstanceInfo.theme);\r\n oldThemePrimitive?.geometryInstances.delete(item.id);\r\n oldThemePrimitive?.ids.delete(item.id);\r\n this.updatePrimitive(geometryInstanceInfo);\r\n }\r\n //更新新的主题\r\n let themePrimitive = this.carateThemePrimitive(item);\r\n if (themePrimitive) {\r\n const geometryInstance = this.createGeometryInstance(item);\r\n themePrimitive.geometryInstances.set(item.id, geometryInstance);\r\n themePrimitive.ids.set(item.id, item);\r\n // 调用更新图元的方法\r\n this.updatePrimitive(item);\r\n }\r\n }\r\n\r\n // 删除图元\r\n public deleteGeometryInstance(data: Array<{ layerId: string; ids: string[] }>): void {\r\n let themeMap = new Set();\r\n data.forEach((item) => {\r\n let { layerId, ids } = item;\r\n const layer = this.layerMap.get(layerId);\r\n if (!layer) {\r\n console.warn(`没有找到图层 ${layerId}`);\r\n return;\r\n }\r\n ids.forEach((id) => {\r\n let geometryInstanceInfo = layer.get(id);\r\n\r\n if (!geometryInstanceInfo) {\r\n console.warn(`没有找到图元 ${id} 在图层 ${layerId} 中`);\r\n return;\r\n }\r\n\r\n //更新新的主题\r\n let themePrimitive = this.PrimitiveThemeMap.get(geometryInstanceInfo.theme);\r\n if (themePrimitive) {\r\n themePrimitive.geometryInstances.delete(geometryInstanceInfo.id);\r\n themePrimitive.ids.delete(geometryInstanceInfo.id);\r\n // 调用更新图元的方法\r\n themeMap.add(geometryInstanceInfo);\r\n }\r\n });\r\n });\r\n Array.from(themeMap.values()).forEach((item) => {\r\n this.updatePrimitive(item);\r\n });\r\n }\r\n // 添加图元\r\n public addGeometryInstance(_item: any): void {\r\n let item = cloneDeep(_item);\r\n\r\n const layer = this.layerMap.get(item.layerId);\r\n if (!layer) {\r\n console.warn(`没有找到图层 ${item.layerId}`);\r\n return;\r\n }\r\n\r\n let geometryInstanceInfo = layer.get(item.id);\r\n\r\n if (geometryInstanceInfo) {\r\n console.warn(`图元 ${item.id} 已经存在图层 ${item.layerId} 中`);\r\n return;\r\n }\r\n layer.set(item.id, item);\r\n //更新新的主题\r\n let themePrimitive = this.carateThemePrimitive(item);\r\n if (themePrimitive) {\r\n const geometryInstance = this.createGeometryInstance(item);\r\n themePrimitive.geometryInstances.set(item.id, geometryInstance);\r\n themePrimitive.ids.set(item.id, item);\r\n // 调用更新图元的方法\r\n this.updatePrimitive(item);\r\n }\r\n }\r\n\r\n // 创建外观\r\n private createAppearance(item: any) {\r\n let material = this.getMaterial({ theme: item.theme });\r\n let appearance;\r\n if (item.category === 'polyline') {\r\n appearance = new this.Cesium.PolylineMaterialAppearance({\r\n material: material, // 传入材质\r\n translucent: true,\r\n });\r\n } else if (item.category === 'polygon') {\r\n appearance = new this.Cesium.MaterialAppearance({\r\n material: material,\r\n translucent: true,\r\n });\r\n }\r\n return appearance;\r\n }\r\n\r\n // 根据 theme 更新对应的 Primitive\r\n private updatePrimitive(item: any): void {\r\n const themePrimitive = this.PrimitiveThemeMap.get(item.theme);\r\n if (!themePrimitive) {\r\n return;\r\n }\r\n\r\n // 如果当前没有创建 Primitive,则创建新的\r\n if (themePrimitive.Primitive) {\r\n this.viewer.scene.primitives.remove(themePrimitive.Primitive);\r\n themePrimitive.Primitive = null;\r\n }\r\n // 更新已存在的 Primitive\r\n let arrayFromMap = Array.from(themePrimitive.geometryInstances, ([key, value]) => ({\r\n key,\r\n value,\r\n }));\r\n // let layer = this.hideLayerMap.get(item.layerId);\r\n let geometryInstances = arrayFromMap\r\n .filter((n) => {\r\n return !Array.from(this.hideLayerMap.values()).some((layer) => layer.has(n.key));\r\n })\r\n .map((n) => {\r\n return n.value;\r\n });\r\n if (geometryInstances.length <= 0) return;\r\n if (item.category === 'polyline') {\r\n themePrimitive.Primitive = new this.Cesium.GroundPolylinePrimitive({\r\n geometryInstances: geometryInstances, // 使用所有的 GeometryInstance\r\n appearance: themePrimitive.appearance,\r\n });\r\n this.viewer.scene.primitives.add(themePrimitive.Primitive); // 添加到场景\r\n } else {\r\n themePrimitive.Primitive = new this.Cesium.GroundPrimitive({\r\n geometryInstances: geometryInstances, // 使用所有的 GeometryInstance\r\n appearance: themePrimitive.appearance,\r\n });\r\n\r\n this.viewer.scene.primitives.add(themePrimitive.Primitive); // 添加到场景\r\n }\r\n }\r\n\r\n //隐藏\r\n public hideByLayerAndId(data: Array<{ layerId: string; ids: string[] }>) {\r\n let themeMap = new Map();\r\n\r\n data.forEach((item) => {\r\n let { layerId, ids } = item;\r\n let layer = this.hideLayerMap.get(layerId);\r\n if (!layer) {\r\n layer = new Set();\r\n this.hideLayerMap.set(layerId, layer);\r\n }\r\n ids.forEach((value) => {\r\n layer.add(value);\r\n let info = this.getGeometryInstanceInfo(layerId, value);\r\n if (info) themeMap.set(info.theme, info);\r\n });\r\n });\r\n Array.from(themeMap.values()).forEach((item) => {\r\n this.updatePrimitive(item);\r\n });\r\n }\r\n\r\n //显示\r\n public showByLayerAndId(data: Array<{ layerId: string; ids: string[] }>) {\r\n let themeMap = new Map();\r\n data.forEach((item) => {\r\n let { layerId, ids } = item;\r\n let layer = this.hideLayerMap.get(layerId);\r\n if (!layer) {\r\n layer = new Set();\r\n this.hideLayerMap.set(layerId, layer);\r\n }\r\n ids.forEach((value) => {\r\n layer.delete(value);\r\n let info = this.getGeometryInstanceInfo(layerId, value);\r\n if (info) themeMap.set(info.theme, info);\r\n });\r\n });\r\n Array.from(themeMap.values()).forEach((item) => {\r\n this.updatePrimitive(item);\r\n });\r\n }\r\n\r\n //查询是否存在图元\r\n public hasGeometryInstance(layerId: string, id: string) {\r\n // 获取图层\r\n const layer = this.layerMap.get(layerId);\r\n if (!layer) {\r\n return false;\r\n }\r\n\r\n // 获取图元\r\n const geometryInstanceInfo = layer.get(id);\r\n if (!geometryInstanceInfo) {\r\n return false;\r\n }\r\n\r\n let themePrimitive = this.PrimitiveThemeMap.get(geometryInstanceInfo.theme);\r\n if (!themePrimitive) {\r\n return false;\r\n }\r\n // 获取图元的几何体\r\n const geometryInstance = themePrimitive.geometryInstances.get(id);\r\n if (!geometryInstance) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n //查询图元信息\r\n public getGeometryInstanceInfo(layerId: string, id: string) {\r\n // 获取图层\r\n const layer = this.layerMap.get(layerId);\r\n if (!layer) {\r\n return null;\r\n }\r\n\r\n // 获取图元\r\n const geometryInstanceInfo = layer.get(id);\r\n return geometryInstanceInfo;\r\n }\r\n\r\n public focusOnGeometryInstance(layerId: string, id: string): void {\r\n // 获取图层\r\n const layer = this.layerMap.get(layerId);\r\n if (!layer) {\r\n console.warn(`图层 ${layerId} 不存在`);\r\n return;\r\n }\r\n\r\n // 获取图元\r\n const geometryInstanceInfo = layer.get(id);\r\n if (!geometryInstanceInfo) {\r\n console.warn(`没有找到图元 ${id} 在图层 ${layerId} 中`);\r\n return;\r\n }\r\n\r\n let themePrimitive = this.PrimitiveThemeMap.get(geometryInstanceInfo.theme);\r\n if (!themePrimitive) {\r\n console.warn(`没有找到 ${id} 图元相关的Primitive`);\r\n return;\r\n }\r\n // 获取图元的几何体\r\n const geometryInstance = themePrimitive.geometryInstances.get(id);\r\n if (!geometryInstance) {\r\n console.warn(`没有找到图元的几何体 ${id}`);\r\n return;\r\n }\r\n\r\n const geometry = geometryInstance.geometry;\r\n const positions = geometry._positions || geometry._polygonHierarchy.positions;\r\n\r\n if (positions && positions.length > 0) {\r\n // 计算包围盒的最小和最大点\r\n let minX = positions[0].x,\r\n minY = positions[0].y,\r\n minZ = positions[0].z;\r\n let maxX = positions[0].x,\r\n maxY = positions[0].y,\r\n maxZ = positions[0].z;\r\n\r\n positions.forEach((position: any) => {\r\n minX = Math.min(minX, position.x);\r\n minY = Math.min(minY, position.y);\r\n minZ = Math.min(minZ, position.z);\r\n\r\n maxX = Math.max(maxX, position.x);\r\n maxY = Math.max(maxY, position.y);\r\n maxZ = Math.max(maxZ, position.z);\r\n });\r\n\r\n // 计算包围盒的中心和尺寸\r\n const center = new this.Cesium.Cartesian3(\r\n (minX + maxX) / 2,\r\n (minY + maxY) / 2,\r\n (minZ + maxZ) / 2,\r\n );\r\n const dimensions = new this.Cesium.Cartesian3(maxX - minX, maxY - minY, maxZ - minZ);\r\n\r\n // 计算偏移量(使用包围盒的高度作为偏移)\r\n const height = dimensions.z; // 高度对应 Z 轴\r\n const offsetHeight = Math.abs(height || 1) * 1.5; // 使用包围盒高度的 1.5 倍作为偏移量\r\n\r\n // 使用摄像机平滑定位到包围盒中心\r\n this.viewer.camera.flyTo({\r\n destination: center,\r\n duration: 2, // 平滑移动的持续时间(秒)\r\n complete: () => {\r\n console.log(`已定位到图元 ${id}`);\r\n },\r\n offset: new this.Cesium.Cartesian3(0, 0, offsetHeight), // 使用动态计算的偏移高度\r\n });\r\n } else {\r\n console.warn(`无法获取图元 ${id} 的顶点信息`);\r\n }\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class HorizontalMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private positions: any[] = [];\r\n private tempPoints: any[] = [];\r\n private segmentEntities: any[] = [];\r\n private segmentLabelIds: string[] = [];\r\n private previewEntity: any = null;\r\n private previewGroundEntity: any = null;\r\n private hoverPos: any = null;\r\n private htmlLabelPool: any = null;\r\n private totalLabelId: string | null = null;\r\n private previewLabelId: string | null = null;\r\n private labelEntity: any = null;\r\n private firstHeight: number | null = null;\r\n private groundLineEntities: any[] = [];\r\n private previewPos: any = null;\r\n private previewGroundPos: any = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-horizontal-total', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-horizontal-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n const carto = Cesium.Cartographic.fromCartesian(pos);\r\n const lng = Cesium.Math.toDegrees(carto.longitude);\r\n const lat = Cesium.Math.toDegrees(carto.latitude);\r\n if (this.positions.length === 0) {\r\n this.firstHeight = carto.height || 0;\r\n }\r\n const clampedPos = Cesium.Cartesian3.fromDegrees(lng, lat, this.firstHeight || 0);\r\n this.positions.push(clampedPos);\r\n const point = viewer.entities.add({\r\n position: clampedPos,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(point);\r\n const terrainHeight =\r\n viewer.scene.globe.getHeight(new Cesium.Cartographic(carto.longitude, carto.latitude, 0)) || 0;\r\n const groundPos = Cesium.Cartesian3.fromDegrees(lng, lat, terrainHeight);\r\n const groundDashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n const groundLine = viewer.entities.add({\r\n polyline: {\r\n positions: [groundPos, clampedPos],\r\n width: options.width || 3,\r\n material: new Cesium.PolylineDashMaterialProperty({\r\n color: groundDashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n this.groundLineEntities.push(groundLine);\r\n if (this.positions.length >= 2) {\r\n const p1 = this.positions[this.positions.length - 2];\r\n const p2 = this.positions[this.positions.length - 1];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const entity = viewer.entities.add({\r\n polyline: {\r\n positions: [p1, p2],\r\n width: options.width || 3,\r\n material: options.lineColor || options.color || Cesium.Color.YELLOW,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color:\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n this.segmentEntities.push(entity);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3(\r\n (p1.x + p2.x) / 2,\r\n (p1.y + p2.y) / 2,\r\n (p1.z + p2.z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const id = `measure_horizontal_seg_${this.segmentLabelIds.length}_${Date.now()}`;\r\n this.segmentLabelIds.push(id);\r\n this.htmlLabelPool.add(\r\n { text: `${d.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || (this.firstHeight || 0),\r\n theme: 'measure-horizontal-seg',\r\n show: true,\r\n },\r\n );\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction(() => {\r\n if (this.positions.length < 2) {\r\n this.stop();\r\n return;\r\n }\r\n this.stop();\r\n if (this.previewLabelId) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.hoverPos) {\r\n this.hoverPos = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewGroundEntity) {\r\n this.viewer.entities.remove(this.previewGroundEntity);\r\n this.previewGroundEntity = null;\r\n }\r\n let total = 0;\r\n for (let i = 1; i < this.positions.length; i++) {\r\n const p1 = this.positions[i - 1];\r\n const p2 = this.positions[i];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n total += geodesic.surfaceDistance;\r\n }\r\n const last = this.positions[this.positions.length - 1];\r\n const lc = Cesium.Cartographic.fromCartesian(last);\r\n const id = this.totalLabelId || `measure_horizontal_total_${Date.now()}`;\r\n this.totalLabelId = id;\r\n this.htmlLabelPool.add(\r\n { text: `${total.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(lc.longitude),\r\n lat: Cesium.Math.toDegrees(lc.latitude),\r\n height: lc.height || (this.firstHeight || 0),\r\n theme: 'measure-horizontal-total',\r\n show: true,\r\n },\r\n );\r\n this.labelEntity = this.totalLabelId;\r\n const result = {\r\n entity: this.segmentEntities,\r\n label: this.labelEntity,\r\n segmentLabels: this.segmentLabelIds,\r\n positions: this.positions,\r\n distance: total,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length === 0) return;\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (!pos) return;\r\n this.hoverPos = pos;\r\n const carto = Cesium.Cartographic.fromCartesian(pos);\r\n const lng = Cesium.Math.toDegrees(carto.longitude);\r\n const lat = Cesium.Math.toDegrees(carto.latitude);\r\n const clampedPos = Cesium.Cartesian3.fromDegrees(lng, lat, this.firstHeight || 0);\r\n this.previewPos = clampedPos;\r\n const terrainHeight =\r\n viewer.scene.globe.getHeight(new Cesium.Cartographic(carto.longitude, carto.latitude, 0)) || 0;\r\n const groundPos = Cesium.Cartesian3.fromDegrees(lng, lat, terrainHeight);\r\n this.previewGroundPos = groundPos;\r\n const p1 = this.positions[this.positions.length - 1];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(clampedPos);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3(\r\n (p1.x + clampedPos.x) / 2,\r\n (p1.y + clampedPos.y) / 2,\r\n (p1.z + clampedPos.z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const id = this.previewLabelId || 'measure_horizontal_preview';\r\n this.previewLabelId = id;\r\n this.htmlLabelPool.add(\r\n { text: `${d.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || (this.firstHeight || 0),\r\n theme: 'measure-horizontal-seg',\r\n show: true,\r\n },\r\n );\r\n const groundDashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n if (!this.previewGroundEntity) {\r\n this.previewGroundEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewPos || !this.previewGroundPos) return [];\r\n return [this.previewGroundPos, this.previewPos];\r\n }, false),\r\n width: options.width || 3,\r\n material: new Cesium.PolylineDashMaterialProperty({\r\n color: groundDashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n }\r\n if (!this.previewEntity) {\r\n this.previewEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewPos || !this.positions.length) return [];\r\n const last = this.positions[this.positions.length - 1];\r\n return [last, this.previewPos];\r\n }, false),\r\n width: options.width || 3,\r\n material: options.lineColor || options.color || Cesium.Color.YELLOW,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color:\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n this.segmentEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.segmentEntities = [];\r\n this.groundLineEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.groundLineEntities = [];\r\n this.tempPoints.forEach((p) => this.viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n if (this.totalLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.totalLabelId]);\r\n this.totalLabelId = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewGroundEntity) {\r\n this.viewer.entities.remove(this.previewGroundEntity);\r\n this.previewGroundEntity = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.segmentLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.segmentLabelIds.slice());\r\n }\r\n this.segmentLabelIds = [];\r\n this.positions = [];\r\n this.hoverPos = null;\r\n this.labelEntity = null;\r\n this.firstHeight = null;\r\n this.previewPos = null;\r\n this.previewGroundPos = null;\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const lineColor = opts.lineColor || opts.color || Cesium.Color.YELLOW;\r\n const dashColor = (opts.dashLineColor || opts.lineColor || opts.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n const width = opts.width || 3;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (!posList.length) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-horizontal-total', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-horizontal-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n for (const pos of posList) {\r\n const point = viewer.entities.add({ position: pos, point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.tempPoints.push(point);\r\n const carto = Cesium.Cartographic.fromCartesian(pos);\r\n const lng = Cesium.Math.toDegrees(carto.longitude);\r\n const lat = Cesium.Math.toDegrees(carto.latitude);\r\n const terrainHeight = viewer.scene.globe.getHeight(new Cesium.Cartographic(carto.longitude, carto.latitude, 0)) || 0;\r\n const groundPos = Cesium.Cartesian3.fromDegrees(lng, lat, terrainHeight);\r\n const groundLine = viewer.entities.add({\r\n polyline: {\r\n positions: [groundPos, pos],\r\n width,\r\n material: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n this.groundLineEntities.push(groundLine);\r\n }\r\n for (let i = 1; i < posList.length; i++) {\r\n const p1 = posList[i - 1];\r\n const p2 = posList[i];\r\n const seg = viewer.entities.add({\r\n polyline: {\r\n positions: [p1, p2],\r\n width,\r\n material: lineColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n this.segmentEntities.push(seg);\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = record.id + `_seg_${i - 1}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add({ text: `${d.toFixed(2)} m` }, {\r\n id: sid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-horizontal-seg',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n });\r\n }\r\n let total = 0;\r\n for (let i = 1; i < posList.length; i++) {\r\n const c1 = Cesium.Cartographic.fromCartesian(posList[i - 1]);\r\n const c2 = Cesium.Cartographic.fromCartesian(posList[i]);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n total += geodesic.surfaceDistance;\r\n }\r\n const last = posList[posList.length - 1];\r\n const lc = Cesium.Cartographic.fromCartesian(last);\r\n const id = record.id + '_total';\r\n this.totalLabelId = id;\r\n this.htmlLabelPool.add({ text: `${total.toFixed(2)} m` }, {\r\n id,\r\n lon: Cesium.Math.toDegrees(lc.longitude),\r\n lat: Cesium.Math.toDegrees(lc.latitude),\r\n height: lc.height || 0,\r\n theme: 'measure-horizontal-total',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n });\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class VerticalMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private labelEntity: any = null;\r\n private positions: any[] = [];\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n private previewLabelId: string | null = null;\r\n private baseCarto: any = null;\r\n private baseUp: any = null;\r\n private tempPoints: any[] = [];\r\n private previewPointEntity: any = null;\r\n private previewEntity: any = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-vertical', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const ray0 = viewer.camera.getPickRay(movement.position);\r\n let cart = ray0 ? viewer.scene.globe.pick(ray0, viewer.scene) : null;\r\n if (!cart) cart = viewer.camera.pickEllipsoid(movement.position, Cesium.Ellipsoid.WGS84);\r\n if (!cart) cart = viewer.scene.pickPosition(movement.position);\r\n if (!cart) return;\r\n if (this.positions.length === 0) {\r\n const c0 = Cesium.Cartographic.fromCartesian(cart);\r\n this.baseCarto = new Cesium.Cartographic(c0.longitude, c0.latitude, 0);\r\n const base = Cesium.Ellipsoid.WGS84.cartographicToCartesian(this.baseCarto);\r\n this.baseUp = Cesium.Ellipsoid.WGS84.geodeticSurfaceNormalCartographic(this.baseCarto);\r\n this.positions.push(base);\r\n const basePoint = viewer.entities.add({\r\n position: base,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(basePoint);\r\n const solidColor = options.lineColor || options.color || Cesium.Color.CYAN;\r\n const dashColor =\r\n (\r\n options.dashLineColor ||\r\n options.lineColor ||\r\n options.color ||\r\n Cesium.Color.RED\r\n ).withAlpha?.(0.9) || Cesium.Color.RED;\r\n this.previewEntity = viewer.entities.add({\r\n polyline: {\r\n positions: [base, base],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n } else {\r\n if (!this.baseCarto || !this.baseUp) return;\r\n const base = this.positions[0];\r\n const ray = viewer.camera.getPickRay(movement.position);\r\n if (!ray) return;\r\n const O = ray.origin;\r\n const D = Cesium.Cartesian3.normalize(ray.direction, new Cesium.Cartesian3());\r\n const B = base;\r\n const U = this.baseUp;\r\n const w0 = Cesium.Cartesian3.subtract(O, B, new Cesium.Cartesian3());\r\n const a = Cesium.Cartesian3.dot(D, D);\r\n const b = -Cesium.Cartesian3.dot(D, U);\r\n const c = Cesium.Cartesian3.dot(U, U);\r\n const d = -Cesium.Cartesian3.dot(D, w0);\r\n const e = Cesium.Cartesian3.dot(U, w0);\r\n const den = a * c - b * b;\r\n if (Math.abs(den) < 1e-6) return;\r\n const s = (a * e - b * d) / den;\r\n const second = Cesium.Cartesian3.add(\r\n B,\r\n Cesium.Cartesian3.multiplyByScalar(U, s, new Cesium.Cartesian3()),\r\n new Cesium.Cartesian3(),\r\n );\r\n this.positions[1] = second;\r\n this.stop();\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewPointEntity) {\r\n this.viewer.entities.remove(this.previewPointEntity);\r\n this.previewPointEntity = null;\r\n }\r\n const solidColor2 = options.lineColor || options.color || Cesium.Color.CYAN;\r\n const dashColor2 = (\r\n options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED\r\n ).withAlpha?.(0.9) || Cesium.Color.RED;\r\n this.entity = viewer.entities.add({\r\n polyline: {\r\n positions: [base, second],\r\n width: options.width || 3,\r\n material: solidColor2,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor2,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n const secondPoint = viewer.entities.add({\r\n position: second,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(secondPoint);\r\n const c1 = this.baseCarto;\r\n const c2 = Cesium.Cartographic.fromCartesian(second);\r\n const vertical = Math.abs((c2.height || 0) - (c1.height || 0));\r\n const mid = new Cesium.Cartesian3(\r\n (this.positions[0].x + this.positions[1].x) / 2,\r\n (this.positions[0].y + this.positions[1].y) / 2,\r\n (this.positions[0].z + this.positions[1].z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n const id = this.htmlLabelId || `measure_vertical_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n this.htmlLabelPool.add(\r\n { text: `${vertical.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-vertical',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n },\r\n );\r\n const result = {\r\n entity: this.entity,\r\n label: this.labelEntity,\r\n positions: this.positions,\r\n vertical,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length < 1) return;\r\n if (!this.baseCarto || !this.baseUp) {\r\n const c0 = Cesium.Cartographic.fromCartesian(this.positions[0]);\r\n this.baseCarto = new Cesium.Cartographic(c0.longitude, c0.latitude, c0.height || 0);\r\n this.baseUp = Cesium.Ellipsoid.WGS84.geodeticSurfaceNormalCartographic(this.baseCarto);\r\n }\r\n const base = this.positions[0];\r\n const ray = viewer.camera.getPickRay(movement.endPosition);\r\n if (!ray) return;\r\n const O = ray.origin;\r\n const D = Cesium.Cartesian3.normalize(ray.direction, new Cesium.Cartesian3());\r\n const B = base;\r\n const U = this.baseUp;\r\n const w0 = Cesium.Cartesian3.subtract(O, B, new Cesium.Cartesian3());\r\n const a = Cesium.Cartesian3.dot(D, D);\r\n const b = -Cesium.Cartesian3.dot(D, U);\r\n const c = Cesium.Cartesian3.dot(U, U);\r\n const d = -Cesium.Cartesian3.dot(D, w0);\r\n const e = Cesium.Cartesian3.dot(U, w0);\r\n const den = a * c - b * b;\r\n if (Math.abs(den) < 1e-6) return;\r\n const s = (a * e - b * d) / den;\r\n const second = Cesium.Cartesian3.add(\r\n B,\r\n Cesium.Cartesian3.multiplyByScalar(U, s, new Cesium.Cartesian3()),\r\n new Cesium.Cartesian3(),\r\n );\r\n this.positions[1] = second;\r\n if (!this.previewEntity) {\r\n const solidColor = options.lineColor || options.color || Cesium.Color.CYAN;\r\n const dashColor =\r\n (\r\n options.dashLineColor ||\r\n options.lineColor ||\r\n options.color ||\r\n Cesium.Color.RED\r\n ).withAlpha?.(0.9) || Cesium.Color.RED;\r\n this.previewEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (this.positions.length < 2) return [];\r\n return [this.positions[0], this.positions[1]];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n }\r\n if (!this.previewPointEntity) {\r\n this.previewPointEntity = viewer.entities.add({\r\n position: second,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n } else {\r\n this.previewPointEntity.position = second;\r\n }\r\n const c1 = this.baseCarto;\r\n const c2 = Cesium.Cartographic.fromCartesian(second);\r\n const vertical = Math.abs((c2.height || 0) - (c1.height || 0));\r\n const mid = new Cesium.Cartesian3(\r\n (this.positions[0].x + second.x) / 2,\r\n (this.positions[0].y + second.y) / 2,\r\n (this.positions[0].z + second.z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const pid = this.previewLabelId || 'measure_vertical_preview';\r\n this.previewLabelId = pid;\r\n this.htmlLabelPool.add(\r\n { text: `${vertical.toFixed(2)} m` },\r\n {\r\n id: pid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-vertical',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n },\r\n );\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n if (this.labelEntity) {\r\n this.viewer.entities.remove(this.labelEntity);\r\n this.labelEntity = null;\r\n }\r\n this.tempPoints.forEach((p) => this.viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n if (this.previewPointEntity) {\r\n this.viewer.entities.remove(this.previewPointEntity);\r\n this.previewPointEntity = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.htmlLabelPool && this.htmlLabelId) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n this.positions = [];\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const lineColor = opts.lineColor || opts.color || Cesium.Color.CYAN;\r\n const dashColor = (opts.dashLineColor || opts.lineColor || opts.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n const width = opts.width || 3;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 2) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-vertical', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n const base = posList[0];\r\n const second = posList[1];\r\n const basePoint = viewer.entities.add({ position: base, point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n const secondPoint = viewer.entities.add({ position: second, point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.tempPoints.push(basePoint);\r\n this.tempPoints.push(secondPoint);\r\n this.entity = viewer.entities.add({ polyline: { positions: [base, second], width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) } });\r\n const c1 = Cesium.Cartographic.fromCartesian(base);\r\n const c2 = Cesium.Cartographic.fromCartesian(second);\r\n const vertical = Math.abs((c2.height || 0) - (c1.height || 0));\r\n const mid = new Cesium.Cartesian3((base.x + second.x) / 2, (base.y + second.y) / 2, (base.z + second.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const id = record.id + '_label';\r\n this.htmlLabelId = id;\r\n this.htmlLabelPool.add({ text: `${vertical.toFixed(2)} m` }, {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-vertical',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n });\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class TriangleMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private positions: any[] = [];\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n private segmentEntities: any[] = [];\r\n private angleMarkerEntities: any[] = [];\r\n private pointEntities: any[] = [];\r\n private segmentLabelIds: string[] = [];\r\n private angleLabelIds: string[] = [];\r\n private previewLabelId: string | null = null;\r\n private previewSegmentEntities: any[] = [];\r\n private previewAngleMarkerEntities: any[] = [];\r\n private previewPointEntity: any = null;\r\n private previewLow: any = null;\r\n private previewHigh: any = null;\r\n private previewThird: any = null;\r\n private previewMarkerP1: any = null;\r\n private previewMarkerP2: any = null;\r\n private previewMarkerCorner: any = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-triangle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-triangle-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-triangle-angle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n this.positions.push(pos);\r\n const p = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.pointEntities.push(p);\r\n if (this.positions.length === 2) {\r\n this.stop();\r\n this.previewSegmentEntities.forEach((e) => viewer.entities.remove(e));\r\n this.previewSegmentEntities = [];\r\n this.previewAngleMarkerEntities.forEach((e) => viewer.entities.remove(e));\r\n this.previewAngleMarkerEntities = [];\r\n if (this.previewPointEntity) {\r\n viewer.entities.remove(this.previewPointEntity);\r\n this.previewPointEntity = null;\r\n }\r\n const c1 = Cesium.Cartographic.fromCartesian(this.positions[0]);\r\n const c2 = Cesium.Cartographic.fromCartesian(this.positions[1]);\r\n const h1 = c1.height || 0;\r\n const h2 = c2.height || 0;\r\n const low = h1 <= h2 ? this.positions[0] : this.positions[1];\r\n const high = h1 > h2 ? this.positions[0] : this.positions[1];\r\n const cl = Cesium.Cartographic.fromCartesian(low);\r\n const ch = Cesium.Cartographic.fromCartesian(high);\r\n const maxH = Math.max(h1, h2);\r\n const third = Cesium.Cartesian3.fromDegrees(\r\n Cesium.Math.toDegrees(cl.longitude),\r\n Cesium.Math.toDegrees(cl.latitude),\r\n maxH,\r\n );\r\n const solidColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor = (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n const vertical = viewer.entities.add({\r\n polyline: {\r\n positions: [low, third],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const horizontal = viewer.entities.add({\r\n polyline: {\r\n positions: [third, high],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const hypotenuse = viewer.entities.add({\r\n polyline: {\r\n positions: [low, high],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n this.segmentEntities.push(vertical, horizontal, hypotenuse);\r\n const lenV = Cesium.Cartesian3.distance(low, third);\r\n const lenH = Cesium.Cartesian3.distance(third, high);\r\n const lenHyp = Cesium.Cartesian3.distance(low, high);\r\n const midV = new Cesium.Cartesian3((low.x + third.x) / 2, (low.y + third.y) / 2, (low.z + third.z) / 2);\r\n const midH = new Cesium.Cartesian3((third.x + high.x) / 2, (third.y + high.y) / 2, (third.z + high.z) / 2);\r\n const midHyp = new Cesium.Cartesian3((low.x + high.x) / 2, (low.y + high.y) / 2, (low.z + high.z) / 2);\r\n const mV = Cesium.Cartographic.fromCartesian(midV);\r\n const mH = Cesium.Cartographic.fromCartesian(midH);\r\n const mHyp = Cesium.Cartographic.fromCartesian(midHyp);\r\n const idV = 'measure_triangle_seg_v';\r\n const idH = 'measure_triangle_seg_h';\r\n const idHyp = 'measure_triangle_seg_hyp';\r\n this.segmentLabelIds = [idV, idH, idHyp];\r\n this.htmlLabelPool.add({ text: `${lenV.toFixed(2)} m` }, { id: idV, lon: Cesium.Math.toDegrees(mV.longitude), lat: Cesium.Math.toDegrees(mV.latitude), height: mV.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${lenH.toFixed(2)} m` }, { id: idH, lon: Cesium.Math.toDegrees(mH.longitude), lat: Cesium.Math.toDegrees(mH.latitude), height: mH.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${lenHyp.toFixed(2)} m` }, { id: idHyp, lon: Cesium.Math.toDegrees(mHyp.longitude), lat: Cesium.Math.toDegrees(mHyp.latitude), height: mHyp.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n const vLowToHigh = Cesium.Cartesian3.subtract(high, low, new Cesium.Cartesian3());\r\n const vLowToThird = Cesium.Cartesian3.subtract(third, low, new Cesium.Cartesian3());\r\n const vHighToThird = Cesium.Cartesian3.subtract(third, high, new Cesium.Cartesian3());\r\n const vHighToLow = Cesium.Cartesian3.subtract(low, high, new Cesium.Cartesian3());\r\n const dotA = Cesium.Cartesian3.dot(vLowToHigh, vLowToThird);\r\n const magA = Math.sqrt(Cesium.Cartesian3.dot(vLowToHigh, vLowToHigh)) * Math.sqrt(Cesium.Cartesian3.dot(vLowToThird, vLowToThird));\r\n const dotB = Cesium.Cartesian3.dot(vHighToThird, vHighToLow);\r\n const magB = Math.sqrt(Cesium.Cartesian3.dot(vHighToThird, vHighToThird)) * Math.sqrt(Cesium.Cartesian3.dot(vHighToLow, vHighToLow));\r\n const angleA = Math.acos(Math.min(Math.max(dotA / (magA || 1), -1), 1));\r\n const angleB = Math.acos(Math.min(Math.max(dotB / (magB || 1), -1), 1));\r\n const cLow = Cesium.Cartographic.fromCartesian(low);\r\n const cHigh = Cesium.Cartographic.fromCartesian(high);\r\n const idAngA = 'measure_triangle_angle_a';\r\n const idAngB = 'measure_triangle_angle_b';\r\n this.angleLabelIds = [idAngA, idAngB];\r\n this.htmlLabelPool.add({ text: `${(angleA * 180 / Math.PI).toFixed(2)}°` }, { id: idAngA, lon: Cesium.Math.toDegrees(cLow.longitude), lat: Cesium.Math.toDegrees(cLow.latitude), height: cLow.height || 0, theme: 'measure-triangle-angle', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${(angleB * 180 / Math.PI).toFixed(2)}°` }, { id: idAngB, lon: Cesium.Math.toDegrees(cHigh.longitude), lat: Cesium.Math.toDegrees(cHigh.latitude), height: cHigh.height || 0, theme: 'measure-triangle-angle', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n const ratio = Math.max(0.01, Math.min(0.5, options.angleMarkerRatio ?? 0.2));\r\n const markerLen = Math.min(lenV, lenH) * ratio;\r\n if (lenV > 0.001 && lenH > 0.001) {\r\n const dirV = Cesium.Cartesian3.normalize(\r\n Cesium.Cartesian3.subtract(low, third, new Cesium.Cartesian3()),\r\n new Cesium.Cartesian3(),\r\n );\r\n const dirH = Cesium.Cartesian3.normalize(\r\n Cesium.Cartesian3.subtract(high, third, new Cesium.Cartesian3()),\r\n new Cesium.Cartesian3(),\r\n );\r\n const pOffV = new Cesium.Cartesian3(\r\n third.x + dirV.x * markerLen,\r\n third.y + dirV.y * markerLen,\r\n third.z + dirV.z * markerLen,\r\n );\r\n const pOffH = new Cesium.Cartesian3(\r\n third.x + dirH.x * markerLen,\r\n third.y + dirH.y * markerLen,\r\n third.z + dirH.z * markerLen,\r\n );\r\n const pCorner = new Cesium.Cartesian3(\r\n third.x + dirV.x * markerLen + dirH.x * markerLen,\r\n third.y + dirV.y * markerLen + dirH.y * markerLen,\r\n third.z + dirV.z * markerLen + dirH.z * markerLen,\r\n );\r\n const rightMarkerSeg1 = viewer.entities.add({\r\n polyline: {\r\n positions: [pOffV, pCorner],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const rightMarkerSeg2 = viewer.entities.add({\r\n polyline: {\r\n positions: [pOffH, pCorner],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n this.angleMarkerEntities.push(rightMarkerSeg1, rightMarkerSeg2);\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n const result = {\r\n entity: this.segmentEntities,\r\n positions: [low, high, third],\r\n lengths: { vertical: lenV, horizontal: lenH, hypotenuse: lenHyp },\r\n angles: { acuteA: angleA, acuteB: angleB },\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length !== 1) return;\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (!pos) return;\r\n const c1 = Cesium.Cartographic.fromCartesian(this.positions[0]);\r\n const c2 = Cesium.Cartographic.fromCartesian(pos);\r\n const h1 = c1.height || 0;\r\n const h2 = c2.height || 0;\r\n const low = h1 <= h2 ? this.positions[0] : pos;\r\n const high = h1 > h2 ? this.positions[0] : pos;\r\n const cl = Cesium.Cartographic.fromCartesian(low);\r\n const maxH = Math.max(h1, h2);\r\n const third = Cesium.Cartesian3.fromDegrees(\r\n this.Cesium.Math.toDegrees(cl.longitude),\r\n this.Cesium.Math.toDegrees(cl.latitude),\r\n maxH,\r\n );\r\n this.previewLow = low;\r\n this.previewHigh = high;\r\n this.previewThird = third;\r\n const solidColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor = (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n if (!this.previewPointEntity) {\r\n this.previewPointEntity = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n } else {\r\n this.previewPointEntity.position = pos;\r\n }\r\n if (!this.previewSegmentEntities.length) {\r\n const pv = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewLow || !this.previewThird) return [];\r\n return [this.previewLow, this.previewThird];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const ph = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewThird || !this.previewHigh) return [];\r\n return [this.previewThird, this.previewHigh];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const phyp = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewLow || !this.previewHigh) return [];\r\n return [this.previewLow, this.previewHigh];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n this.previewSegmentEntities.push(pv, ph, phyp);\r\n }\r\n const lenV = Cesium.Cartesian3.distance(low, third);\r\n const lenH = Cesium.Cartesian3.distance(third, high);\r\n const lenHyp = Cesium.Cartesian3.distance(low, high);\r\n const vLowToHigh = Cesium.Cartesian3.subtract(high, low, new Cesium.Cartesian3());\r\n const vLowToThird = Cesium.Cartesian3.subtract(third, low, new Cesium.Cartesian3());\r\n const vHighToThird = Cesium.Cartesian3.subtract(third, high, new Cesium.Cartesian3());\r\n const vHighToLow = Cesium.Cartesian3.subtract(low, high, new Cesium.Cartesian3());\r\n const dotA = Cesium.Cartesian3.dot(vLowToHigh, vLowToThird);\r\n const magA = Math.sqrt(Cesium.Cartesian3.dot(vLowToHigh, vLowToHigh)) * Math.sqrt(Cesium.Cartesian3.dot(vLowToThird, vLowToThird));\r\n const dotB = Cesium.Cartesian3.dot(vHighToThird, vHighToLow);\r\n const magB = Math.sqrt(Cesium.Cartesian3.dot(vHighToThird, vHighToThird)) * Math.sqrt(Cesium.Cartesian3.dot(vHighToLow, vHighToLow));\r\n const angleA = Math.acos(Math.min(Math.max((dotA / (magA || 1)), -1), 1));\r\n const angleB = Math.acos(Math.min(Math.max((dotB / (magB || 1)), -1), 1));\r\n const midV = new Cesium.Cartesian3((low.x + third.x) / 2, (low.y + third.y) / 2, (low.z + third.z) / 2);\r\n const midH = new Cesium.Cartesian3((third.x + high.x) / 2, (third.y + high.y) / 2, (third.z + high.z) / 2);\r\n const midHyp = new Cesium.Cartesian3((low.x + high.x) / 2, (low.y + high.y) / 2, (low.z + high.z) / 2);\r\n const mV = Cesium.Cartographic.fromCartesian(midV);\r\n const mH = Cesium.Cartographic.fromCartesian(midH);\r\n const mHyp = Cesium.Cartographic.fromCartesian(midHyp);\r\n const cLow = Cesium.Cartographic.fromCartesian(low);\r\n const cHigh = Cesium.Cartographic.fromCartesian(high);\r\n const idV = 'measure_triangle_seg_v';\r\n const idH = 'measure_triangle_seg_h';\r\n const idHyp = 'measure_triangle_seg_hyp';\r\n const idAngA = 'measure_triangle_angle_a';\r\n const idAngB = 'measure_triangle_angle_b';\r\n if (this.segmentLabelIds.length === 0) {\r\n this.segmentLabelIds = [idV, idH, idHyp];\r\n }\r\n if (this.angleLabelIds.length === 0) {\r\n this.angleLabelIds = [idAngA, idAngB];\r\n }\r\n this.htmlLabelPool.add({ text: `${lenV.toFixed(2)} m` }, { id: idV, lon: Cesium.Math.toDegrees(mV.longitude), lat: Cesium.Math.toDegrees(mV.latitude), height: mV.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${lenH.toFixed(2)} m` }, { id: idH, lon: Cesium.Math.toDegrees(mH.longitude), lat: Cesium.Math.toDegrees(mH.latitude), height: mH.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${lenHyp.toFixed(2)} m` }, { id: idHyp, lon: Cesium.Math.toDegrees(mHyp.longitude), lat: Cesium.Math.toDegrees(mHyp.latitude), height: mHyp.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${(angleA * 180 / Math.PI).toFixed(2)}°` }, { id: idAngA, lon: Cesium.Math.toDegrees(cLow.longitude), lat: Cesium.Math.toDegrees(cLow.latitude), height: cLow.height || 0, theme: 'measure-triangle-angle', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${(angleB * 180 / Math.PI).toFixed(2)}°` }, { id: idAngB, lon: Cesium.Math.toDegrees(cHigh.longitude), lat: Cesium.Math.toDegrees(cHigh.latitude), height: cHigh.height || 0, theme: 'measure-triangle-angle', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n const ratio = Math.max(0.01, Math.min(0.5, options.angleMarkerRatio ?? 0.2));\r\n const markerLen = Math.min(lenV, lenH) * ratio;\r\n if (lenV > 0.001 && lenH > 0.001) {\r\n const dirV = Cesium.Cartesian3.normalize(\r\n Cesium.Cartesian3.subtract(low, third, new Cesium.Cartesian3()),\r\n new Cesium.Cartesian3(),\r\n );\r\n const dirH = Cesium.Cartesian3.normalize(\r\n Cesium.Cartesian3.subtract(high, third, new Cesium.Cartesian3()),\r\n new Cesium.Cartesian3(),\r\n );\r\n const pOffV = new Cesium.Cartesian3(\r\n third.x + dirV.x * markerLen,\r\n third.y + dirV.y * markerLen,\r\n third.z + dirV.z * markerLen,\r\n );\r\n const pOffH = new Cesium.Cartesian3(\r\n third.x + dirH.x * markerLen,\r\n third.y + dirH.y * markerLen,\r\n third.z + dirH.z * markerLen,\r\n );\r\n const pCorner = new Cesium.Cartesian3(\r\n third.x + dirV.x * markerLen + dirH.x * markerLen,\r\n third.y + dirV.y * markerLen + dirH.y * markerLen,\r\n third.z + dirV.z * markerLen + dirH.z * markerLen,\r\n );\r\n this.previewMarkerP1 = pOffV;\r\n this.previewMarkerP2 = pOffH;\r\n this.previewMarkerCorner = pCorner;\r\n if (!this.previewAngleMarkerEntities.length) {\r\n const rightMarkerSeg1 = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewMarkerP1 || !this.previewMarkerCorner) return [];\r\n return [this.previewMarkerP1, this.previewMarkerCorner];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const rightMarkerSeg2 = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewMarkerP2 || !this.previewMarkerCorner) return [];\r\n return [this.previewMarkerP2, this.previewMarkerCorner];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n this.previewAngleMarkerEntities.push(rightMarkerSeg1, rightMarkerSeg2);\r\n }\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n this.segmentEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.segmentEntities = [];\r\n this.angleMarkerEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.angleMarkerEntities = [];\r\n this.pointEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.pointEntities = [];\r\n this.previewSegmentEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.previewSegmentEntities = [];\r\n this.previewAngleMarkerEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.previewAngleMarkerEntities = [];\r\n if (this.previewPointEntity) {\r\n this.viewer.entities.remove(this.previewPointEntity);\r\n this.previewPointEntity = null;\r\n }\r\n if (this.htmlLabelPool && this.htmlLabelId) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.segmentLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.segmentLabelIds.slice());\r\n }\r\n if (this.angleLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.angleLabelIds.slice());\r\n }\r\n this.segmentLabelIds = [];\r\n this.angleLabelIds = [];\r\n this.positions = [];\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const lineColor = opts.lineColor || opts.color || Cesium.Color.YELLOW;\r\n const dashColor = (opts.dashLineColor || opts.lineColor || opts.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n const width = opts.width || 3;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 2) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-triangle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-triangle-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-triangle-angle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n const c1 = Cesium.Cartographic.fromCartesian(posList[0]);\r\n const c2 = Cesium.Cartographic.fromCartesian(posList[1]);\r\n const h1 = c1.height || 0;\r\n const h2 = c2.height || 0;\r\n const low = h1 <= h2 ? posList[0] : posList[1];\r\n const high = h1 > h2 ? posList[0] : posList[1];\r\n const pLow = viewer.entities.add({ position: low, point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n const pHigh = viewer.entities.add({ position: high, point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.pointEntities.push(pLow, pHigh);\r\n const cl = Cesium.Cartographic.fromCartesian(low);\r\n const maxH = Math.max(h1, h2);\r\n const third = Cesium.Cartesian3.fromDegrees(\r\n Cesium.Math.toDegrees(cl.longitude),\r\n Cesium.Math.toDegrees(cl.latitude),\r\n maxH,\r\n );\r\n const vertical = viewer.entities.add({\r\n polyline: { positions: [low, third], width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) },\r\n });\r\n const horizontal = viewer.entities.add({\r\n polyline: { positions: [third, high], width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) },\r\n });\r\n const hypotenuse = viewer.entities.add({\r\n polyline: { positions: [low, high], width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) },\r\n });\r\n this.segmentEntities.push(vertical, horizontal, hypotenuse);\r\n const lenV = Cesium.Cartesian3.distance(low, third);\r\n const lenH = Cesium.Cartesian3.distance(third, high);\r\n const lenHyp = Cesium.Cartesian3.distance(low, high);\r\n const midV = new Cesium.Cartesian3((low.x + third.x) / 2, (low.y + third.y) / 2, (low.z + third.z) / 2);\r\n const midH = new Cesium.Cartesian3((third.x + high.x) / 2, (third.y + high.y) / 2, (third.z + high.z) / 2);\r\n const midHyp = new Cesium.Cartesian3((low.x + high.x) / 2, (low.y + high.y) / 2, (low.z + high.z) / 2);\r\n const mV = Cesium.Cartographic.fromCartesian(midV);\r\n const mH = Cesium.Cartographic.fromCartesian(midH);\r\n const mHyp = Cesium.Cartographic.fromCartesian(midHyp);\r\n const idV = record.id + '_tri_v';\r\n const idH = record.id + '_tri_h';\r\n const idHyp = record.id + '_tri_hyp';\r\n this.segmentLabelIds = [idV, idH, idHyp];\r\n this.htmlLabelPool.add({ text: `${lenV.toFixed(2)} m` }, { id: idV, lon: Cesium.Math.toDegrees(mV.longitude), lat: Cesium.Math.toDegrees(mV.latitude), height: mV.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${lenH.toFixed(2)} m` }, { id: idH, lon: Cesium.Math.toDegrees(mH.longitude), lat: Cesium.Math.toDegrees(mH.latitude), height: mH.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${lenHyp.toFixed(2)} m` }, { id: idHyp, lon: Cesium.Math.toDegrees(mHyp.longitude), lat: Cesium.Math.toDegrees(mHyp.latitude), height: mHyp.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n const vLowToHigh = Cesium.Cartesian3.subtract(high, low, new Cesium.Cartesian3());\r\n const vLowToThird = Cesium.Cartesian3.subtract(third, low, new Cesium.Cartesian3());\r\n const vHighToThird = Cesium.Cartesian3.subtract(third, high, new Cesium.Cartesian3());\r\n const vHighToLow = Cesium.Cartesian3.subtract(low, high, new Cesium.Cartesian3());\r\n const dotA = Cesium.Cartesian3.dot(vLowToHigh, vLowToThird);\r\n const magA = Math.sqrt(Cesium.Cartesian3.dot(vLowToHigh, vLowToHigh)) * Math.sqrt(Cesium.Cartesian3.dot(vLowToThird, vLowToThird));\r\n const dotB = Cesium.Cartesian3.dot(vHighToThird, vHighToLow);\r\n const magB = Math.sqrt(Cesium.Cartesian3.dot(vHighToThird, vHighToThird)) * Math.sqrt(Cesium.Cartesian3.dot(vHighToLow, vHighToLow));\r\n const angleA = Math.acos(Math.min(Math.max(dotA / (magA || 1), -1), 1));\r\n const angleB = Math.acos(Math.min(Math.max(dotB / (magB || 1), -1), 1));\r\n const cLow = Cesium.Cartographic.fromCartesian(low);\r\n const cHigh = Cesium.Cartographic.fromCartesian(high);\r\n const t = opts.labelText || { angle: '角度' };\r\n const idAngA = record.id + '_tri_angA';\r\n const idAngB = record.id + '_tri_angB';\r\n this.angleLabelIds = [idAngA, idAngB];\r\n this.htmlLabelPool.add({ text: `${t.angle}:${(angleA * 180 / Math.PI).toFixed(2)}°` }, { id: idAngA, lon: Cesium.Math.toDegrees(cLow.longitude), lat: Cesium.Math.toDegrees(cLow.latitude), height: cLow.height || 0, theme: 'measure-triangle-angle', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${t.angle}:${(angleB * 180 / Math.PI).toFixed(2)}°` }, { id: idAngB, lon: Cesium.Math.toDegrees(cHigh.longitude), lat: Cesium.Math.toDegrees(cHigh.latitude), height: cHigh.height || 0, theme: 'measure-triangle-angle', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n const ratio = Math.max(0.01, Math.min(0.5, opts.angleMarkerRatio ?? 0.2));\r\n const markerLen = Math.min(lenV, lenH) * ratio;\r\n if (lenV > 0.001 && lenH > 0.001) {\r\n const dirV = Cesium.Cartesian3.normalize(Cesium.Cartesian3.subtract(low, third, new Cesium.Cartesian3()), new Cesium.Cartesian3());\r\n const dirH = Cesium.Cartesian3.normalize(Cesium.Cartesian3.subtract(high, third, new Cesium.Cartesian3()), new Cesium.Cartesian3());\r\n const pOffV = new Cesium.Cartesian3(third.x + dirV.x * markerLen, third.y + dirV.y * markerLen, third.z + dirV.z * markerLen);\r\n const pOffH = new Cesium.Cartesian3(third.x + dirH.x * markerLen, third.y + dirH.y * markerLen, third.z + dirH.z * markerLen);\r\n const pCorner = new Cesium.Cartesian3(third.x + dirV.x * markerLen + dirH.x * markerLen, third.y + dirV.y * markerLen + dirH.y * markerLen, third.z + dirV.z * markerLen + dirH.z * markerLen);\r\n const rightMarkerSeg1 = viewer.entities.add({ polyline: { positions: [pOffV, pCorner], width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) } });\r\n const rightMarkerSeg2 = viewer.entities.add({ polyline: { positions: [pOffH, pCorner], width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) } });\r\n this.angleMarkerEntities.push(rightMarkerSeg1, rightMarkerSeg2);\r\n }\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class SpaceMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private labelEntity: any = null;\r\n private positions: any[] = [];\r\n private tempPoints: any[] = [];\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n private previewEntity: any = null;\r\n private previewPos: any = null;\r\n private previewLabelId: string | null = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-space', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n this.positions.push(pos);\r\n const point = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(point);\r\n if (this.positions.length === 2) {\r\n this.stop();\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n const p1 = this.positions[0];\r\n const p2 = this.positions[1];\r\n const solidColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor = (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n this.entity = viewer.entities.add({\r\n polyline: {\r\n positions: [p1, p2],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n const total = Cesium.Cartesian3.distance(p1, p2);\r\n const last = p2;\r\n const lc = Cesium.Cartographic.fromCartesian(last);\r\n const id = this.htmlLabelId || `measure_space_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n this.htmlLabelPool.add(\r\n { text: `${total.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(lc.longitude),\r\n lat: Cesium.Math.toDegrees(lc.latitude),\r\n height: lc.height || 0,\r\n theme: 'measure-space',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n },\r\n );\r\n const result = {\r\n entity: this.entity,\r\n label: this.labelEntity,\r\n positions: this.positions,\r\n distance: total,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length !== 1) return;\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (!pos) return;\r\n this.previewPos = pos;\r\n const p1 = this.positions[0];\r\n const d = Cesium.Cartesian3.distance(p1, pos);\r\n const mid = new Cesium.Cartesian3(\r\n (p1.x + pos.x) / 2,\r\n (p1.y + pos.y) / 2,\r\n (p1.z + pos.z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const pid = this.previewLabelId || 'measure_space_preview';\r\n this.previewLabelId = pid;\r\n this.htmlLabelPool.add(\r\n { text: `${d.toFixed(2)} m` },\r\n {\r\n id: pid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-space',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n },\r\n );\r\n const solidColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor = (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n if (!this.previewEntity) {\r\n this.previewEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewPos || !this.positions.length) return [];\r\n const first = this.positions[0];\r\n return [first, this.previewPos];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n \r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n if (this.labelEntity) {\r\n this.viewer.entities.remove(this.labelEntity);\r\n this.labelEntity = null;\r\n }\r\n if (this.htmlLabelPool && this.htmlLabelId) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n this.tempPoints.forEach((p) => this.viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n this.positions = [];\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const lineColor = opts.lineColor || opts.color || Cesium.Color.YELLOW;\r\n const dashColor = (opts.dashLineColor || opts.lineColor || opts.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n const width = opts.width || 3;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (!posList.length) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-space', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n if (posList.length >= 1) {\r\n const p0 = viewer.entities.add({ position: posList[0], point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.tempPoints.push(p0);\r\n }\r\n if (posList.length >= 2) {\r\n const p1 = viewer.entities.add({ position: posList[1], point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.tempPoints.push(p1);\r\n this.entity = viewer.entities.add({\r\n polyline: {\r\n positions: [posList[0], posList[1]],\r\n width,\r\n material: lineColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const total = Cesium.Cartesian3.distance(posList[0], posList[1]);\r\n const lc = Cesium.Cartographic.fromCartesian(posList[1]);\r\n const id = record.id + '_label';\r\n this.htmlLabelId = id;\r\n this.htmlLabelPool.add({ text: `${total.toFixed(2)} m` }, {\r\n id,\r\n lon: Cesium.Math.toDegrees(lc.longitude),\r\n lat: Cesium.Math.toDegrees(lc.latitude),\r\n height: lc.height || 0,\r\n theme: 'measure-space',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n });\r\n }\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class AreaMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private labelEntity: any = null;\r\n private positions: any[] = [];\r\n private tempPoints: any[] = [];\r\n private primitive: any = null;\r\n private previewEntity: any = null;\r\n private previewPos: any = null;\r\n private edgeEntities: any[] = [];\r\n private pointEntities: any[] = [];\r\n private previewEdgeEntity: any = null;\r\n private previewPointEntities: any[] = [];\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n private previewLabelId: string | null = null;\r\n private segmentLabelIds: string[] = [];\r\n private angleLabelIds: string[] = [];\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-area', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-area-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-area-angle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n this.positions.push(pos);\r\n const point = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(point);\r\n if (this.primitive) {\r\n viewer.scene.primitives.remove(this.primitive);\r\n this.primitive = null;\r\n }\r\n const hierarchy = new Cesium.PolygonHierarchy(this.positions.slice());\r\n const geom = new Cesium.PolygonGeometry({\r\n polygonHierarchy: hierarchy,\r\n vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n const occludedColor = (options.color && options.color.withAlpha)\r\n ? options.color.withAlpha(0.25)\r\n : Cesium.Color.RED.withAlpha(0.4);\r\n this.primitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color: occludedColor }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n });\r\n viewer.scene.primitives.add(this.primitive);\r\n if (this.positions.length >= 2) {\r\n if (this.edgeEntities.length) {\r\n for (const e of this.edgeEntities) {\r\n try {\r\n viewer.entities.remove(e);\r\n } catch {}\r\n }\r\n this.edgeEntities = [];\r\n }\r\n const lineColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n const polylinePositions = this.positions.concat([this.positions[0]]);\r\n const lineEntity = viewer.entities.add({\r\n polyline: {\r\n positions: polylinePositions,\r\n width: options.width || 2,\r\n material: lineColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n this.edgeEntities.push(lineEntity);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length === 0) return;\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (!pos) return;\r\n this.previewPos = pos;\r\n const pts = this.positions.concat([pos]);\r\n const center = new Cesium.Cartesian3(\r\n pts.reduce((s: number, p: any) => s + p.x, 0) / pts.length,\r\n pts.reduce((s: number, p: any) => s + p.y, 0) / pts.length,\r\n pts.reduce((s: number, p: any) => s + p.z, 0) / pts.length,\r\n );\r\n const plane = new Cesium.EllipsoidTangentPlane(center, Cesium.Ellipsoid.WGS84);\r\n const points2D = plane.projectPointsOntoPlane(pts);\r\n let area2D = 0;\r\n for (let i = 0; i < points2D.length; i++) {\r\n const j = (i + 1) % points2D.length;\r\n area2D += points2D[i].x * points2D[j].y - points2D[j].x * points2D[i].y;\r\n }\r\n area2D = Math.abs(area2D) / 2;\r\n const cc = Cesium.Cartographic.fromCartesian(center);\r\n const pid = this.previewLabelId || 'measure_area_preview';\r\n this.previewLabelId = pid;\r\n const t = options.labelText || { area: '面积' };\r\n this.htmlLabelPool.add(\r\n { text: `${t.area}:${area2D.toFixed(2)} m²` },\r\n {\r\n id: pid,\r\n lon: Cesium.Math.toDegrees(cc.longitude),\r\n lat: Cesium.Math.toDegrees(cc.latitude),\r\n height: cc.height || 0,\r\n theme: 'measure-area',\r\n show: true,\r\n },\r\n );\r\n if (!this.previewEntity) {\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n this.previewEntity = viewer.entities.add({\r\n polygon: {\r\n hierarchy: new Cesium.CallbackProperty(() => {\r\n if (!this.previewPos || !this.positions.length) return undefined;\r\n const all = this.positions.concat([this.previewPos]);\r\n return new Cesium.PolygonHierarchy(all);\r\n }, false),\r\n material: color,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n },\r\n });\r\n const lineColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n this.previewEdgeEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewPos || !this.positions.length) return [];\r\n const all = this.positions.concat([this.previewPos, this.positions[0]]);\r\n return all;\r\n }, false),\r\n width: options.width || 2,\r\n material: lineColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n const pointColor = options.pointColor || options.color || Cesium.Color.YELLOW;\r\n const hoverPoint = viewer.entities.add({\r\n position: new Cesium.CallbackProperty(() => this.previewPos || this.positions[this.positions.length - 1], false),\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.previewPointEntities.push(hoverPoint);\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n this.handler.setInputAction(() => {\r\n if (this.positions.length < 3) {\r\n this.stop();\r\n return;\r\n }\r\n if (this.positions.length >= 3) {\r\n this.positions.pop();\r\n const lastPoint = this.tempPoints.pop();\r\n if (lastPoint) this.viewer.entities.remove(lastPoint);\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewEdgeEntity) {\r\n this.viewer.entities.remove(this.previewEdgeEntity);\r\n this.previewEdgeEntity = null;\r\n }\r\n if (this.previewPointEntities.length) {\r\n for (const p of this.previewPointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.previewPointEntities = [];\r\n }\r\n this.previewPos = null;\r\n this.stop();\r\n const center = new Cesium.Cartesian3(\r\n this.positions.reduce((s: number, p: any) => s + p.x, 0) / this.positions.length,\r\n this.positions.reduce((s: number, p: any) => s + p.y, 0) / this.positions.length,\r\n this.positions.reduce((s: number, p: any) => s + p.z, 0) / this.positions.length,\r\n );\r\n const plane = new Cesium.EllipsoidTangentPlane(center, Cesium.Ellipsoid.WGS84);\r\n const points2D = plane.projectPointsOntoPlane(this.positions);\r\n let area2D = 0;\r\n for (let i = 0; i < points2D.length; i++) {\r\n const j = (i + 1) % points2D.length;\r\n area2D += points2D[i].x * points2D[j].y - points2D[j].x * points2D[i].y;\r\n }\r\n area2D = Math.abs(area2D) / 2;\r\n const cc = Cesium.Cartographic.fromCartesian(center);\r\n const id = this.htmlLabelId || `measure_area_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n const t = options.labelText || { area: '面积', side: '边长', angle: '角度' };\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n this.htmlLabelPool.add(\r\n { text: `${t.area}:${area2D.toFixed(2)} m²` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(cc.longitude),\r\n lat: Cesium.Math.toDegrees(cc.latitude),\r\n height: cc.height || 0,\r\n theme: 'measure-area',\r\n show: true,\r\n },\r\n );\r\n this.labelEntity = this.htmlLabelId;\r\n for (let i = 0; i < this.positions.length; i++) {\r\n const j = (i + 1) % this.positions.length;\r\n const p1 = this.positions[i];\r\n const p2 = this.positions[j];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = `measure_area_seg_${Date.now()}_${i}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add(\r\n { text: `${t.side}:${d.toFixed(2)} m` },\r\n {\r\n id: sid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-area-seg',\r\n show: true,\r\n },\r\n );\r\n }\r\n const p2d = points2D;\r\n for (let i = 0; i < p2d.length; i++) {\r\n const prev = p2d[(i - 1 + p2d.length) % p2d.length];\r\n const curr = p2d[i];\r\n const next = p2d[(i + 1) % p2d.length];\r\n const v1x = prev.x - curr.x;\r\n const v1y = prev.y - curr.y;\r\n const v2x = next.x - curr.x;\r\n const v2y = next.y - curr.y;\r\n const len1 = Math.sqrt(v1x * v1x + v1y * v1y);\r\n const len2 = Math.sqrt(v2x * v2x + v2y * v2y);\r\n if (!len1 || !len2) continue;\r\n const dot = (v1x / len1) * (v2x / len2) + (v1y / len1) * (v2y / len2);\r\n const ang = Math.acos(Math.min(1, Math.max(-1, dot))) * (180 / Math.PI);\r\n const pc = Cesium.Cartographic.fromCartesian(this.positions[i]);\r\n const aid = `measure_area_angle_${Date.now()}_${i}`;\r\n this.angleLabelIds.push(aid);\r\n this.htmlLabelPool.add(\r\n { text: `${t.angle}:${ang.toFixed(2)} °` },\r\n {\r\n id: aid,\r\n lon: Cesium.Math.toDegrees(pc.longitude),\r\n lat: Cesium.Math.toDegrees(pc.latitude),\r\n height: pc.height || 0,\r\n theme: 'measure-area-angle',\r\n show: true,\r\n },\r\n );\r\n }\r\n const result = {\r\n entity: this.primitive,\r\n label: this.labelEntity,\r\n positions: this.positions,\r\n area: area2D,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n if (this.primitive) {\r\n this.viewer.scene.primitives.remove(this.primitive);\r\n this.primitive = null;\r\n }\r\n if (this.edgeEntities.length) {\r\n for (const e of this.edgeEntities) {\r\n try {\r\n this.viewer.entities.remove(e);\r\n } catch {}\r\n }\r\n this.edgeEntities = [];\r\n }\r\n if (this.pointEntities.length) {\r\n for (const p of this.pointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.pointEntities = [];\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n this.previewPos = null;\r\n }\r\n if (this.previewEdgeEntity) {\r\n this.viewer.entities.remove(this.previewEdgeEntity);\r\n this.previewEdgeEntity = null;\r\n }\r\n if (this.previewPointEntities.length) {\r\n for (const p of this.previewPointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.previewPointEntities = [];\r\n }\r\n if (this.labelEntity) {\r\n this.viewer.entities.remove(this.labelEntity);\r\n this.labelEntity = null;\r\n }\r\n if (this.htmlLabelPool && this.htmlLabelId) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.segmentLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.segmentLabelIds.slice());\r\n }\r\n if (this.angleLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.angleLabelIds.slice());\r\n }\r\n this.segmentLabelIds = [];\r\n this.angleLabelIds = [];\r\n this.tempPoints.forEach((p) => this.viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n this.positions = [];\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 3) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-area', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-area-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-area-angle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n for (const pos of posList) {\r\n const point = viewer.entities.add({ position: pos, point: { pixelSize: 8, color: opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.tempPoints.push(point);\r\n }\r\n const center = new Cesium.Cartesian3(\r\n posList.reduce((s: number, p: any) => s + p.x, 0) / posList.length,\r\n posList.reduce((s: number, p: any) => s + p.y, 0) / posList.length,\r\n posList.reduce((s: number, p: any) => s + p.z, 0) / posList.length,\r\n );\r\n const plane = new Cesium.EllipsoidTangentPlane(center, Cesium.Ellipsoid.WGS84);\r\n const points2D = plane.projectPointsOntoPlane(posList);\r\n let area2D = 0;\r\n for (let i = 0; i < points2D.length; i++) {\r\n const j = (i + 1) % points2D.length;\r\n area2D += points2D[i].x * points2D[j].y - points2D[j].x * points2D[i].y;\r\n }\r\n area2D = Math.abs(area2D) / 2;\r\n const cc = Cesium.Cartographic.fromCartesian(center);\r\n const id = record.id + '_area';\r\n this.htmlLabelId = id;\r\n const t = opts.labelText || { area: '面积', side: '边长', angle: '角度' };\r\n this.htmlLabelPool.add({ text: `${t.area}:${area2D.toFixed(2)} m²` }, {\r\n id,\r\n lon: Cesium.Math.toDegrees(cc.longitude),\r\n lat: Cesium.Math.toDegrees(cc.latitude),\r\n height: cc.height || 0,\r\n theme: 'measure-area',\r\n show: true,\r\n });\r\n const hierarchy = new Cesium.PolygonHierarchy(posList);\r\n const geom = new Cesium.PolygonGeometry({ polygonHierarchy: hierarchy, vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT, perPositionHeight: true });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = opts.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n const occludedColor = (opts.color && opts.color.withAlpha) ? opts.color.withAlpha(0.25) : Cesium.Color.RED.withAlpha(0.4);\r\n const primitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color }), translucent: true, closed: true }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color: occludedColor }), translucent: true, closed: true }),\r\n });\r\n viewer.scene.primitives.add(primitive);\r\n this.primitive = primitive;\r\n for (let i = 0; i < posList.length; i++) {\r\n const j = (i + 1) % posList.length;\r\n const p1 = posList[i];\r\n const p2 = posList[j];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = record.id + `_area_seg_${i}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add({ text: `${t.side}:${d.toFixed(2)} m` }, { id: sid, lon: Cesium.Math.toDegrees(mc.longitude), lat: Cesium.Math.toDegrees(mc.latitude), height: mc.height || 0, theme: 'measure-area-seg', show: true });\r\n }\r\n const p2d = points2D;\r\n for (let i = 0; i < p2d.length; i++) {\r\n const prev = p2d[(i - 1 + p2d.length) % p2d.length];\r\n const curr = p2d[i];\r\n const next = p2d[(i + 1) % p2d.length];\r\n const v1x = prev.x - curr.x;\r\n const v1y = prev.y - curr.y;\r\n const v2x = next.x - curr.x;\r\n const v2y = next.y - curr.y;\r\n const len1 = Math.sqrt(v1x * v1x + v1y * v1y);\r\n const len2 = Math.sqrt(v2x * v2x + v2y * v2y);\r\n if (!len1 || !len2) continue;\r\n const dot = (v1x / len1) * (v2x / len2) + (v1y / len1) * (v2y / len2);\r\n const ang = Math.acos(Math.min(1, Math.max(-1, dot))) * (180 / Math.PI);\r\n const pc = Cesium.Cartographic.fromCartesian(posList[i]);\r\n const aid = record.id + `_area_angle_${i}`;\r\n this.angleLabelIds.push(aid);\r\n this.htmlLabelPool.add({ text: `${t.angle}:${ang.toFixed(2)} °` }, { id: aid, lon: Cesium.Math.toDegrees(pc.longitude), lat: Cesium.Math.toDegrees(pc.latitude), height: pc.height || 0, theme: 'measure-area-angle', show: true });\r\n }\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class CircleMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private positions: any[] = [];\r\n private currentRadius: number = 0;\r\n private labelEntity: any = null;\r\n private previewLabel: any = null;\r\n private ellipsePrimitive: any = null;\r\n private previewEntity: any = null;\r\n private isPrimitive: boolean = false;\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-circle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n const text = ctx?.data?.text || '';\r\n el.innerHTML = String(text);\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((click: any) => {\r\n const position = viewer.scene.pickPosition(click.position);\r\n if (!position) return;\r\n this.positions.push(position);\r\n if (this.positions.length === 2) {\r\n this.stop();\r\n const center = this.positions[0];\r\n const edge = this.positions[1];\r\n const radius = Cesium.Cartesian3.distance(center, edge);\r\n const area = Math.PI * radius * radius;\r\n const perimeter = 2 * Math.PI * radius;\r\n const t = options.labelText || { radius: '半径', area: '面积', circumference: '周长' };\r\n const centerLabelPos = center;\r\n if (!this.labelEntity) {\r\n this.labelEntity = viewer.entities.add({\r\n position: centerLabelPos,\r\n label: {\r\n text: `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`,\r\n font: '14px sans-serif',\r\n fillColor: Cesium.Color.WHITE,\r\n outlineColor: Cesium.Color.BLACK,\r\n outlineWidth: 2,\r\n style: Cesium.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: Cesium.VerticalOrigin.BOTTOM,\r\n pixelOffset: new Cesium.Cartesian2(0, -10),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n eyeOffset: new Cesium.Cartesian3(0, 0, -1000),\r\n showBackground: true,\r\n backgroundColor: Cesium.Color.BLACK.withAlpha(0.6),\r\n show: false,\r\n },\r\n });\r\n } else {\r\n this.labelEntity.position = centerLabelPos;\r\n this.labelEntity.label.text = `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`;\r\n }\r\n if (this.previewEntity) {\r\n viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n const cartoCenter = Cesium.Cartographic.fromCartesian(center);\r\n const geom = new Cesium.EllipseGeometry({\r\n center,\r\n semiMajorAxis: radius,\r\n semiMinorAxis: radius,\r\n height: cartoCenter.height || 0,\r\n vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT,\r\n });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.5);\r\n const occludedColor = (options.color && options.color.withAlpha)\r\n ? options.color.withAlpha(0.25)\r\n : Cesium.Color.RED.withAlpha(0.4);\r\n if (this.ellipsePrimitive) {\r\n viewer.scene.primitives.remove(this.ellipsePrimitive);\r\n this.ellipsePrimitive = null;\r\n }\r\n this.ellipsePrimitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color: occludedColor }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n });\r\n viewer.scene.primitives.add(this.ellipsePrimitive);\r\n this.entity = this.ellipsePrimitive;\r\n this.isPrimitive = true;\r\n const c = Cesium.Cartographic.fromCartesian(center);\r\n const lng = Cesium.Math.toDegrees(c.longitude);\r\n const lat = Cesium.Math.toDegrees(c.latitude);\r\n const h = c.height || 0;\r\n const id = this.htmlLabelId || `measure_circle_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n const text = `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`;\r\n this.htmlLabelPool.add({ text }, { id, lon: lng, lat, height: h, theme: 'measure-circle', show: true });\r\n const result = {\r\n entity: this.entity,\r\n label: this.labelEntity,\r\n positions: this.positions,\r\n radius,\r\n area,\r\n perimeter,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length !== 1) return;\r\n const center = this.positions[0];\r\n const ray = viewer.camera.getPickRay(movement.endPosition);\r\n const edge = viewer.scene.globe.pick(ray, viewer.scene);\r\n if (!edge) return;\r\n const radius = Cesium.Cartesian3.distance(center, edge);\r\n this.currentRadius = radius;\r\n const cartoCenter = Cesium.Cartographic.fromCartesian(center);\r\n const area = Math.PI * radius * radius;\r\n const perimeter = 2 * Math.PI * radius;\r\n const t = options.labelText || { radius: '半径', area: '面积', circumference: '周长' };\r\n const centerLabelPos = center;\r\n if (!this.labelEntity) {\r\n this.labelEntity = viewer.entities.add({\r\n position: centerLabelPos,\r\n label: {\r\n text: `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`,\r\n font: '14px sans-serif',\r\n fillColor: Cesium.Color.WHITE,\r\n outlineColor: Cesium.Color.BLACK,\r\n outlineWidth: 2,\r\n style: Cesium.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: Cesium.VerticalOrigin.BOTTOM,\r\n pixelOffset: new Cesium.Cartesian2(0, -10),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n eyeOffset: new Cesium.Cartesian3(0, 0, -1000),\r\n showBackground: true,\r\n backgroundColor: Cesium.Color.BLACK.withAlpha(0.6),\r\n show: false,\r\n },\r\n });\r\n } else {\r\n this.labelEntity.position = centerLabelPos;\r\n this.labelEntity.label.text = `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`;\r\n }\r\n const c = Cesium.Cartographic.fromCartesian(center);\r\n const lng = Cesium.Math.toDegrees(c.longitude);\r\n const lat = Cesium.Math.toDegrees(c.latitude);\r\n const h = c.height || 0;\r\n const id = this.htmlLabelId || `measure_circle_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n const text = `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`;\r\n this.htmlLabelPool.add({ text }, { id, lon: lng, lat, height: h, theme: 'measure-circle', show: true });\r\n if (!this.previewEntity) {\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.5);\r\n this.previewEntity = viewer.entities.add({\r\n position: center,\r\n ellipse: {\r\n semiMajorAxis: new Cesium.CallbackProperty(() => this.currentRadius, false),\r\n semiMinorAxis: new Cesium.CallbackProperty(() => this.currentRadius, false),\r\n height: cartoCenter.height || 0,\r\n material: color,\r\n },\r\n });\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n if (this.isPrimitive) {\r\n this.viewer.scene.primitives.remove(this.entity);\r\n } else {\r\n this.viewer.entities.remove(this.entity);\r\n }\r\n this.entity = null;\r\n this.isPrimitive = false;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.labelEntity) {\r\n this.viewer.entities.remove(this.labelEntity);\r\n this.labelEntity = null;\r\n }\r\n if (this.previewLabel) {\r\n this.viewer.entities.remove(this.previewLabel);\r\n this.previewLabel = null;\r\n }\r\n if (this.ellipsePrimitive) {\r\n this.viewer.scene.primitives.remove(this.ellipsePrimitive);\r\n this.ellipsePrimitive = null;\r\n }\r\n if (this.htmlLabelPool && this.htmlLabelId) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n this.positions = [];\r\n this.currentRadius = 0;\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 2) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-circle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n const text = ctx?.data?.text || '';\r\n el.innerHTML = String(text);\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n const center = posList[0];\r\n const edge = posList[1];\r\n const radius = Cesium.Cartesian3.distance(center, edge);\r\n const area = Math.PI * radius * radius;\r\n const perimeter = 2 * Math.PI * radius;\r\n const cartoCenter = Cesium.Cartographic.fromCartesian(center);\r\n const geom = new Cesium.EllipseGeometry({ center, semiMajorAxis: radius, semiMinorAxis: radius, height: cartoCenter.height || 0, vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = opts.color || Cesium.Color.YELLOW.withAlpha(0.5);\r\n const occludedColor = (opts.color && opts.color.withAlpha) ? opts.color.withAlpha(0.25) : Cesium.Color.RED.withAlpha(0.4);\r\n const primitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color }), translucent: true, closed: true }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color: occludedColor }), translucent: true, closed: true }),\r\n });\r\n viewer.scene.primitives.add(primitive);\r\n this.ellipsePrimitive = primitive;\r\n this.entity = primitive;\r\n this.isPrimitive = true;\r\n const c = Cesium.Cartographic.fromCartesian(center);\r\n const id = record.id + '_circle';\r\n this.htmlLabelId = id;\r\n const t = opts.labelText || { radius: '半径', area: '面积', circumference: '周长' };\r\n const text = `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`;\r\n this.htmlLabelPool.add({ text }, { id, lon: Cesium.Math.toDegrees(c.longitude), lat: Cesium.Math.toDegrees(c.latitude), height: c.height || 0, theme: 'measure-circle', show: true });\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class PolylineDistanceMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private labelEntity: any = null;\r\n private positions: any[] = [];\r\n private tempPoints: any[] = [];\r\n private segmentLabels: any[] = [];\r\n private hoverPos: any = null;\r\n private previewPos: any = null;\r\n private previewLabel: any = null;\r\n private previewEntity: any = null;\r\n private htmlLabelPool: any = null;\r\n private totalLabelId: string | null = null;\r\n private segmentLabelIds: string[] = [];\r\n private previewLabelId: string | null = null;\r\n \r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-polyline-total', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-polyline-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n this.positions.push(pos);\r\n const point = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(point);\r\n if (!this.entity) {\r\n this.entity = viewer.entities.add({\r\n polyline: {\r\n positions: this.positions.slice(),\r\n width: options.width || 3,\r\n material: options.lineColor || options.color || Cesium.Color.YELLOW,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n } else {\r\n this.entity.polyline.positions = this.positions.slice();\r\n }\r\n if (this.positions.length >= 2) {\r\n const p1 = this.positions[this.positions.length - 2];\r\n const p2 = this.positions[this.positions.length - 1];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3(\r\n (p1.x + p2.x) / 2,\r\n (p1.y + p2.y) / 2,\r\n (p1.z + p2.z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const id = `measure_polyline_seg_${this.segmentLabelIds.length}_${Date.now()}`;\r\n this.segmentLabelIds.push(id);\r\n this.htmlLabelPool.add(\r\n { text: `${d.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-polyline-seg',\r\n show: true,\r\n },\r\n );\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction(() => {\r\n if (this.positions.length < 2) {\r\n this.stop();\r\n return;\r\n }\r\n this.stop();\r\n if (this.previewLabelId) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.hoverPos) {\r\n this.hoverPos = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.positions.length >= 2 && this.tempPoints.length >= 2) {\r\n const lastPoint = this.tempPoints[this.tempPoints.length - 1];\r\n this.viewer.entities.remove(lastPoint);\r\n this.tempPoints.pop();\r\n }\r\n if (this.segmentLabelIds.length >= 1) {\r\n const lastId = this.segmentLabelIds[this.segmentLabelIds.length - 1];\r\n if (lastId) {\r\n this.htmlLabelPool.removeByIds([lastId]);\r\n this.segmentLabelIds.pop();\r\n }\r\n }\r\n if (this.positions.length >= 2) {\r\n this.positions.pop();\r\n }\r\n let total = 0;\r\n for (let i = 1; i < this.positions.length; i++) {\r\n const p1 = this.positions[i - 1];\r\n const p2 = this.positions[i];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n total += d;\r\n }\r\n const last = this.positions[this.positions.length - 1];\r\n if (this.entity && this.entity.polyline) {\r\n this.entity.polyline.positions = this.positions;\r\n }\r\n const lc = Cesium.Cartographic.fromCartesian(last);\r\n const id = this.totalLabelId || `measure_polyline_total_${Date.now()}`;\r\n this.totalLabelId = id;\r\n this.htmlLabelPool.add(\r\n { text: `${total.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(lc.longitude),\r\n lat: Cesium.Math.toDegrees(lc.latitude),\r\n height: lc.height || 0,\r\n theme: 'measure-polyline-total',\r\n show: true,\r\n },\r\n );\r\n this.labelEntity = this.totalLabelId;\r\n const result = {\r\n entity: this.entity,\r\n label: this.labelEntity,\r\n segmentLabels: this.segmentLabelIds,\r\n positions: this.positions,\r\n distance: total,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length === 0) return;\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (!pos) return;\r\n this.hoverPos = pos;\r\n this.previewPos = pos;\r\n const p1 = this.positions[this.positions.length - 1];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(pos);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3(\r\n (p1.x + pos.x) / 2,\r\n (p1.y + pos.y) / 2,\r\n (p1.z + pos.z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const id = this.previewLabelId || 'measure_polyline_preview';\r\n this.previewLabelId = id;\r\n this.htmlLabelPool.add(\r\n { text: `${d.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-polyline-seg',\r\n show: true,\r\n },\r\n );\r\n\r\n if (!this.previewEntity) {\r\n this.previewEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewPos || !this.positions.length) return [];\r\n const last = this.positions[this.positions.length - 1];\r\n return [last, this.previewPos];\r\n }, false),\r\n width: options.width || 3,\r\n material: options.lineColor || options.color || Cesium.Color.YELLOW,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n }\r\n\r\n \r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n if (this.totalLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.totalLabelId]);\r\n this.totalLabelId = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n this.hoverPos = null;\r\n if (this.segmentLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.segmentLabelIds.slice());\r\n }\r\n this.segmentLabelIds = [];\r\n this.tempPoints.forEach((p) => this.viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n this.positions = [];\r\n }\r\n \r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const lineColor = opts.lineColor || opts.color || Cesium.Color.YELLOW;\r\n const dashColor = (opts.dashLineColor || opts.lineColor || opts.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n const width = opts.width || 3;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 2) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-polyline-total', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-polyline-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n for (const pos of posList) {\r\n const point = viewer.entities.add({ position: pos, point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.tempPoints.push(point);\r\n }\r\n this.entity = viewer.entities.add({ polyline: { positions: posList, width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) } });\r\n let total = 0;\r\n for (let i = 1; i < posList.length; i++) {\r\n const c1 = Cesium.Cartographic.fromCartesian(posList[i - 1]);\r\n const c2 = Cesium.Cartographic.fromCartesian(posList[i]);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n total += geodesic.surfaceDistance;\r\n const p1 = posList[i - 1];\r\n const p2 = posList[i];\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = record.id + `_seg_${i - 1}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add({ text: `${geodesic.surfaceDistance.toFixed(2)} m` }, {\r\n id: sid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-polyline-seg',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n });\r\n }\r\n const last = posList[posList.length - 1];\r\n const lc = Cesium.Cartographic.fromCartesian(last);\r\n const id = record.id + '_total';\r\n this.totalLabelId = id;\r\n this.htmlLabelPool.add({ text: `${total.toFixed(2)} m` }, {\r\n id,\r\n lon: Cesium.Math.toDegrees(lc.longitude),\r\n lat: Cesium.Math.toDegrees(lc.latitude),\r\n height: lc.height || 0,\r\n theme: 'measure-polyline-total',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n });\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\n\nexport default class TerrainHeightMeasure implements IMeasure {\n private Cesium: any;\n private viewer: any;\n private handler: any = null;\n private labelEntity: any = null;\n private htmlLabelPool: any = null;\n private htmlLabelId: string | null = null;\n private topPoint: any = null;\n private zeroPoint: any = null;\n private lineEntity: any = null;\n\n constructor(Cesium: any, viewer: any) {\n this.Cesium = Cesium;\n this.viewer = viewer;\n }\n\n start(options: MeasurementOptions) {\n this.clear();\n const Cesium = this.Cesium;\n const viewer = this.viewer;\n if (!this.htmlLabelPool) {\n const containerId = options.overlayContainerId || 'html-label-container';\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\n this.htmlLabelPool.registerTheme('measure-terrainHeight', {\n createElement: (el: HTMLDivElement, ctx: any) => {\n el.innerHTML = String(ctx?.data?.text || '');\n el.style.background = 'rgba(0,0,0,0.6)';\n el.style.color = '#fff';\n el.style.font = '14px sans-serif';\n el.style.padding = '4px 6px';\n el.style.borderRadius = '4px';\n el.style.whiteSpace = 'pre';\n },\n options: { offset: { x: 0, y: -10 } },\n });\n }\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\n this.handler.setInputAction((movement: any) => {\n const position = viewer.scene.pickPosition(movement.position);\n if (!position) return;\n const carto = Cesium.Cartographic.fromCartesian(position);\n const terrainHeight = viewer.scene.globe.getHeight(\n new Cesium.Cartographic(carto.longitude, carto.latitude, 0),\n ) || 0;\n const lng = Cesium.Math.toDegrees(carto.longitude);\n const lat = Cesium.Math.toDegrees(carto.latitude);\n const terrainPos = Cesium.Cartesian3.fromDegrees(lng, lat, terrainHeight);\n this.topPoint = viewer.entities.add({\n position,\n point: {\n pixelSize: 8,\n color: options.color || Cesium.Color.YELLOW,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n },\n });\n this.zeroPoint = viewer.entities.add({\n position: terrainPos,\n point: {\n pixelSize: 8,\n color: Cesium.Color.YELLOW,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n },\n });\n this.lineEntity = viewer.entities.add({\n polyline: {\n positions: [terrainPos, position],\n width: options.width || 3,\n material: options.color || Cesium.Color.YELLOW,\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\n color: Cesium.Color.RED,\n dashLength: 12,\n dashPattern: 255,\n }),\n },\n });\n const t = options.labelText || { height: '高差' };\n const heightDiff = (carto.height || 0) - terrainHeight;\n const labelText = `${t.height}:${heightDiff.toFixed(2)} m`;\n const id = this.htmlLabelId || `measure_terrain_${Date.now()}`;\n this.htmlLabelId = id;\n this.htmlLabelPool.add(\n { text: labelText },\n {\n id,\n lon: lng,\n lat: lat,\n height: carto.height || 0,\n theme: 'measure-terrainHeight',\n show: true,\n },\n );\n this.labelEntity = this.htmlLabelId;\n const result = {\n label: this.labelEntity,\n position,\n zeroPosition: terrainPos,\n line: this.lineEntity,\n terrainHeight,\n difference: heightDiff,\n clear: () => this.clear(),\n };\n options.onComplete?.(result);\n this.stop();\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\n }\n\n stop() {\n if (this.handler) {\n this.handler.destroy();\n this.handler = null;\n }\n }\n\n clear() {\n this.stop();\n if (this.lineEntity) {\n this.viewer.entities.remove(this.lineEntity);\n this.lineEntity = null;\n }\n if (this.topPoint) {\n this.viewer.entities.remove(this.topPoint);\n this.topPoint = null;\n }\n if (this.zeroPoint) {\n this.viewer.entities.remove(this.zeroPoint);\n this.zeroPoint = null;\n }\n if (this.htmlLabelId && this.htmlLabelPool) {\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\n this.htmlLabelId = null;\n }\n }\n\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\n const Cesium = this.Cesium;\n const viewer = this.viewer;\n const opts = (record.options || {}) as MeasurementOptions;\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\n if (posList.length < 1) {\n const data: any = record.data || {};\n const p = data.position;\n if (p) {\n if (Array.isArray(p) && p.length === 3) {\n posList.push(new Cesium.Cartesian3(p[0], p[1], p[2]));\n } else if (typeof p === 'object' && p && 'x' in p && 'y' in p && 'z' in p) {\n posList.push(new Cesium.Cartesian3(p.x, p.y, p.z));\n }\n }\n }\n if (posList.length < 1) return;\n if (!this.htmlLabelPool) {\n const containerId = opts.overlayContainerId || 'html-label-container';\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\n this.htmlLabelPool.registerTheme('measure-terrainHeight', {\n createElement: (el: HTMLDivElement, ctx: any) => {\n el.innerHTML = String(ctx?.data?.text || '');\n el.style.background = 'rgba(0,0,0,0.6)';\n el.style.color = '#fff';\n el.style.font = '14px sans-serif';\n el.style.padding = '4px 6px';\n el.style.borderRadius = '4px';\n el.style.whiteSpace = 'pre';\n },\n options: { offset: { x: 0, y: -10 } },\n });\n }\n const position = posList[0];\n const carto = Cesium.Cartographic.fromCartesian(position);\n const terrainHeight = viewer.scene.globe.getHeight(new Cesium.Cartographic(carto.longitude, carto.latitude, 0)) || 0;\n const lng = Cesium.Math.toDegrees(carto.longitude);\n const lat = Cesium.Math.toDegrees(carto.latitude);\n const terrainPos = Cesium.Cartesian3.fromDegrees(lng, lat, terrainHeight);\n this.topPoint = viewer.entities.add({ position, point: { pixelSize: 8, color: opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\n this.zeroPoint = viewer.entities.add({ position: terrainPos, point: { pixelSize: 8, color: Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\n this.lineEntity = viewer.entities.add({ polyline: { positions: [terrainPos, position], width: opts.width || 3, material: opts.color || Cesium.Color.YELLOW, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: Cesium.Color.RED, dashLength: 12, dashPattern: 255 }) } });\n const t = opts.labelText || { height: '高差' };\n const heightDiff = (carto.height || 0) - terrainHeight;\n const id = record.id + '_terrain';\n this.htmlLabelId = id;\n this.htmlLabelPool.add({ text: `${t.height}:${heightDiff.toFixed(2)} m` }, { id, lon: lng, lat, height: carto.height || 0, theme: 'measure-terrainHeight', show: true });\n }\n}\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\n\nexport default class CoordinateMeasure implements IMeasure {\n private Cesium: any;\n private viewer: any;\n private handler: any = null;\n private entity: any = null;\n private labelEntity: any = null;\n private htmlLabelPool: any = null;\n private htmlLabelId: string | null = null;\n\n constructor(Cesium: any, viewer: any) {\n this.Cesium = Cesium;\n this.viewer = viewer;\n }\n\n start(options: MeasurementOptions) {\n this.clear();\n const Cesium = this.Cesium;\n const viewer = this.viewer;\n if (!this.htmlLabelPool) {\n const containerId = options.overlayContainerId || 'html-label-container';\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\n this.htmlLabelPool.registerTheme('measure-coordinate', {\n createElement: (el: HTMLDivElement, ctx: any) => {\n el.innerHTML = String(ctx?.data?.text || '');\n el.style.background = 'rgba(0,0,0,0.6)';\n el.style.color = '#fff';\n el.style.font = '14px sans-serif';\n el.style.padding = '4px 6px';\n el.style.borderRadius = '4px';\n el.style.whiteSpace = 'pre';\n },\n options: { offset: { x: 0, y: -10 } },\n });\n }\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\n this.handler.setInputAction((movement: any) => {\n const position = viewer.scene.pickPosition(movement.position);\n if (!position) return;\n const carto = Cesium.Cartographic.fromCartesian(position);\n const lng = Cesium.Math.toDegrees(carto.longitude);\n const lat = Cesium.Math.toDegrees(carto.latitude);\n const h = carto.height || 0;\n this.entity = viewer.entities.add({\n position,\n point: {\n pixelSize: 10,\n color: options.color || Cesium.Color.YELLOW,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n },\n });\n const id = this.htmlLabelId || `measure_coordinate_${Date.now()}`;\n this.htmlLabelId = id;\n const t = options.labelText || { lng: '经', lat: '纬', height: '高' };\n this.htmlLabelPool.add(\n { text: `${t.lng}:${lng.toFixed(6)}\\n${t.lat}:${lat.toFixed(6)}\\n${t.height}:${h.toFixed(2)} m` },\n {\n id,\n lon: lng,\n lat,\n height: h,\n theme: 'measure-coordinate',\n show: true,\n },\n );\n this.labelEntity = this.htmlLabelId;\n const result = {\n entity: this.entity,\n label: this.labelEntity,\n lnglat: { lng, lat, height: h },\n clear: () => this.clear(),\n };\n options.onComplete?.(result);\n this.stop();\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\n }\n\n stop() {\n if (this.handler) {\n this.handler.destroy();\n this.handler = null;\n }\n }\n\n clear() {\n this.stop();\n if (this.entity) {\n this.viewer.entities.remove(this.entity);\n this.entity = null;\n }\n if (this.htmlLabelId && this.htmlLabelPool) {\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\n this.htmlLabelId = null;\n }\n }\n\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\n const Cesium = this.Cesium;\n const viewer = this.viewer;\n const opts = (record.options || {}) as MeasurementOptions;\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\n if (!posList.length) {\n const ll = (record.data as any)?.lnglat;\n if (ll && typeof ll.lng === 'number' && typeof ll.lat === 'number') {\n const c = Cesium.Cartesian3.fromDegrees(ll.lng, ll.lat, ll.height || 0);\n posList.push(c);\n }\n }\n if (!posList.length) return;\n if (!this.htmlLabelPool) {\n const containerId = opts.overlayContainerId || 'html-label-container';\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\n this.htmlLabelPool.registerTheme('measure-coordinate', {\n createElement: (el: HTMLDivElement, ctx: any) => {\n el.innerHTML = String(ctx?.data?.text || '');\n el.style.background = 'rgba(0,0,0,0.6)';\n el.style.color = '#fff';\n el.style.font = '14px sans-serif';\n el.style.padding = '4px 6px';\n el.style.borderRadius = '4px';\n el.style.whiteSpace = 'pre';\n },\n options: { offset: { x: 0, y: -10 } },\n });\n }\n const position = posList[0];\n const carto = Cesium.Cartographic.fromCartesian(position);\n const lng = Cesium.Math.toDegrees(carto.longitude);\n const lat = Cesium.Math.toDegrees(carto.latitude);\n const h = carto.height || 0;\n this.entity = viewer.entities.add({ position, point: { pixelSize: 10, color: opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\n const id = record.id + '_coord';\n this.htmlLabelId = id;\n const t = opts.labelText || { lng: '经', lat: '纬', height: '高' };\n this.htmlLabelPool.add({ text: `${t.lng}:${lng.toFixed(6)}\\n${t.lat}:${lat.toFixed(6)}\\n${t.height}:${h.toFixed(2)} m` }, { id, lon: lng, lat, height: h, theme: 'measure-coordinate', show: true });\n }\n}\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class RectangleMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private startPoint: any = null;\r\n private endPoint: any = null;\r\n private secondPoint: any = null;\r\n private currentCorners: any[] = [];\r\n private edgeEntities: any[] = [];\r\n private pointEntities: any[] = [];\r\n private previewEdgeEntity: any = null;\r\n private previewPointEntities: any[] = [];\r\n private entity: any = null;\r\n private labelEntity: any = null;\r\n private primitive: any = null;\r\n private previewEntity: any = null;\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n private segmentLabelIds: string[] = [];\r\n private previewLabelId: string | null = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-rectangle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-rectangle-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n if (!this.startPoint) {\r\n this.startPoint = pos;\r\n return;\r\n }\r\n if (!this.secondPoint) {\r\n this.secondPoint = pos;\r\n this.endPoint = pos;\r\n return;\r\n }\r\n const thirdPoint = pos;\r\n const rect = this.computeRectangle(this.startPoint, this.secondPoint, thirdPoint);\r\n if (!rect) {\r\n this.stop();\r\n return;\r\n }\r\n this.stop();\r\n const { corners, center, width, height, area } = rect;\r\n if (this.previewEntity) {\r\n viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.primitive) {\r\n viewer.scene.primitives.remove(this.primitive);\r\n this.primitive = null;\r\n }\r\n if (this.entity) {\r\n viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n const id = this.htmlLabelId || `measure_rectangle_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n const mc = Cesium.Cartographic.fromCartesian(center);\r\n const t = options.labelText || { width: '宽', heightLabel: '高', area: '面积', side: '边长' };\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n this.htmlLabelPool.add(\r\n { text: `${t.width}:${width.toFixed(2)} m\\n${t.heightLabel}:${height.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-rectangle',\r\n show: true,\r\n },\r\n );\r\n const edges = [\r\n [corners[0], corners[1]],\r\n [corners[1], corners[2]],\r\n [corners[2], corners[3]],\r\n [corners[3], corners[0]],\r\n ];\r\n for (let i = 0; i < edges.length; i++) {\r\n const [p1, p2] = edges[i];\r\n const d = i === 0 || i === 2 ? width : height;\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc2 = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = `measure_rectangle_seg_${Date.now()}_${i}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add(\r\n { text: `${t.side}:${Number(d).toFixed(2)} m` },\r\n {\r\n id: sid,\r\n lon: Cesium.Math.toDegrees(mc2.longitude),\r\n lat: Cesium.Math.toDegrees(mc2.latitude),\r\n height: mc2.height || 0,\r\n theme: 'measure-rectangle-seg',\r\n show: true,\r\n },\r\n );\r\n }\r\n const surfacePositions = this.buildSurfaceRectanglePositions(corners);\r\n const hierarchy = new Cesium.PolygonHierarchy(surfacePositions);\r\n const geom = new Cesium.PolygonGeometry({\r\n polygonHierarchy: hierarchy,\r\n vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n const occludedColor = (options.color && options.color.withAlpha)\r\n ? options.color.withAlpha(0.25)\r\n : Cesium.Color.RED.withAlpha(0.4);\r\n this.primitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color: occludedColor }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n });\r\n viewer.scene.primitives.add(this.primitive);\r\n const lineColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n const polylinePositions = [...surfacePositions, surfacePositions[0]];\r\n const lineEntity = viewer.entities.add({\r\n polyline: {\r\n positions: polylinePositions,\r\n width: options.width || 2,\r\n material: lineColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n this.edgeEntities.push(lineEntity);\r\n const pointColor = options.pointColor || options.color || Cesium.Color.YELLOW;\r\n for (const corner of corners) {\r\n const pointEntity = viewer.entities.add({\r\n position: corner,\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.pointEntities.push(pointEntity);\r\n }\r\n const result = {\r\n entity: this.primitive,\r\n label: this.labelEntity,\r\n positions: [this.startPoint, this.secondPoint, thirdPoint],\r\n width,\r\n height,\r\n area,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (!pos) return;\r\n if (this.startPoint && !this.secondPoint) {\r\n this.endPoint = pos;\r\n if (!this.previewEdgeEntity) {\r\n const solidColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n this.previewEdgeEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.startPoint || !this.endPoint) return [];\r\n return [this.startPoint, this.endPoint];\r\n }, false),\r\n width: options.width || 2,\r\n material: solidColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n const pointColor = options.pointColor || options.color || Cesium.Color.YELLOW;\r\n const basePoint = viewer.entities.add({\r\n position: this.startPoint,\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n const hoverPoint = viewer.entities.add({\r\n position: new Cesium.CallbackProperty(() => this.endPoint || this.startPoint, false),\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.previewPointEntities.push(basePoint, hoverPoint);\r\n }\r\n return;\r\n }\r\n if (!this.startPoint || !this.secondPoint) return;\r\n const rect = this.computeRectangle(this.startPoint, this.secondPoint, pos);\r\n if (!rect) return;\r\n const { corners, center, width, height, area } = rect;\r\n const surfacePositions = this.buildSurfaceRectanglePositions(corners);\r\n this.currentCorners = surfacePositions;\r\n const mc = Cesium.Cartographic.fromCartesian(center);\r\n const pid = this.previewLabelId || 'measure_rectangle_preview';\r\n this.previewLabelId = pid;\r\n const tPrev = options.labelText || { width: '宽', heightLabel: '高', area: '面积' };\r\n this.htmlLabelPool.add(\r\n { text: `${tPrev.width}:${width.toFixed(2)} m\\n${tPrev.heightLabel}:${height.toFixed(2)} m\\n${tPrev.area}:${area.toFixed(2)} m²` },\r\n {\r\n id: pid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-rectangle',\r\n show: true,\r\n },\r\n );\r\n if (!this.previewEntity) {\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n this.previewEntity = viewer.entities.add({\r\n polygon: {\r\n hierarchy: new Cesium.CallbackProperty(() => {\r\n if (!this.startPoint || !this.secondPoint || !this.currentCorners.length) return undefined;\r\n return new Cesium.PolygonHierarchy(this.currentCorners);\r\n }, false),\r\n material: color,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n },\r\n });\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewEdgeEntity) {\r\n this.viewer.entities.remove(this.previewEdgeEntity);\r\n this.previewEdgeEntity = null;\r\n }\r\n if (this.previewPointEntities.length) {\r\n for (const p of this.previewPointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.previewPointEntities = [];\r\n }\r\n if (this.edgeEntities.length) {\r\n for (const e of this.edgeEntities) {\r\n try {\r\n this.viewer.entities.remove(e);\r\n } catch {}\r\n }\r\n this.edgeEntities = [];\r\n }\r\n if (this.pointEntities.length) {\r\n for (const p of this.pointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.pointEntities = [];\r\n }\r\n if (this.primitive) {\r\n this.viewer.scene.primitives.remove(this.primitive);\r\n this.primitive = null;\r\n }\r\n if (this.htmlLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.segmentLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.segmentLabelIds.slice());\r\n }\r\n this.segmentLabelIds = [];\r\n this.startPoint = null;\r\n this.endPoint = null;\r\n this.secondPoint = null;\r\n this.currentCorners = [];\r\n }\r\n\r\n private buildSurfaceRectanglePositions(corners: any[]) {\r\n if (!corners || !corners.length) return [];\r\n return corners.slice();\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 3) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-rectangle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-rectangle-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n const rect = this.computeRectangle(posList[0], posList[1], posList[2]);\r\n if (!rect) return;\r\n const corners = rect.corners;\r\n const center = rect.center;\r\n const width = rect.width;\r\n const height = rect.height;\r\n const area = rect.area;\r\n const mc = Cesium.Cartographic.fromCartesian(center);\r\n const id = record.id + '_rectangle';\r\n const t = opts.labelText || { width: '宽', heightLabel: '高', area: '面积', side: '边长' };\r\n this.htmlLabelId = id;\r\n this.htmlLabelPool.add({ text: `${t.width}:${width.toFixed(2)} m\\n${t.heightLabel}:${height.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²` }, { id, lon: Cesium.Math.toDegrees(mc.longitude), lat: Cesium.Math.toDegrees(mc.latitude), height: mc.height || 0, theme: 'measure-rectangle', show: true });\r\n const edges: any[] = [\r\n [corners[0], corners[1]],\r\n [corners[1], corners[2]],\r\n [corners[2], corners[3]],\r\n [corners[3], corners[0]],\r\n ];\r\n for (let i = 0; i < edges.length; i++) {\r\n const [ep1, ep2] = edges[i];\r\n const d = i === 0 || i === 2 ? width : height;\r\n const mid = new Cesium.Cartesian3((ep1.x + ep2.x) / 2, (ep1.y + ep2.y) / 2, (ep1.z + ep2.z) / 2);\r\n const mc2 = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = record.id + `_rectangle_seg_${i}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add({ text: `${t.side}:${Number(d).toFixed(2)} m` }, { id: sid, lon: Cesium.Math.toDegrees(mc2.longitude), lat: Cesium.Math.toDegrees(mc2.latitude), height: mc2.height || 0, theme: 'measure-rectangle-seg', show: true });\r\n }\r\n const hierarchy = new Cesium.PolygonHierarchy(corners);\r\n const geom = new Cesium.PolygonGeometry({\r\n polygonHierarchy: hierarchy,\r\n vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = opts.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n const occludedColor = (opts.color && opts.color.withAlpha) ? opts.color.withAlpha(0.25) : Cesium.Color.RED.withAlpha(0.4);\r\n const primitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color }), translucent: true, closed: true }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color: occludedColor }), translucent: true, closed: true }),\r\n });\r\n this.primitive = primitive;\r\n viewer.scene.primitives.add(this.primitive);\r\n\r\n const lineColor = opts.lineColor || color;\r\n const polylinePositions = [...corners, corners[0]];\r\n const lineEntity = viewer.entities.add({\r\n polyline: {\r\n positions: polylinePositions,\r\n width: opts.width || 2,\r\n material: lineColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n },\r\n });\r\n this.edgeEntities.push(lineEntity);\r\n const pointColor = opts.pointColor || color;\r\n for (const corner of corners) {\r\n const pointEntity = viewer.entities.add({\r\n position: corner,\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.pointEntities.push(pointEntity);\r\n }\r\n }\r\n\r\n private computeRectangle(p1: any, p2: any, p3: any) {\r\n const Cesium = this.Cesium;\r\n const plane = new Cesium.EllipsoidTangentPlane(p1, Cesium.Ellipsoid.WGS84);\r\n const pts2d = plane.projectPointsOntoPlane([p1, p2, p3]);\r\n if (!pts2d || pts2d.length < 3) return null;\r\n const a = pts2d[0];\r\n const b = pts2d[1];\r\n const c = pts2d[2];\r\n const vx = b.x - a.x;\r\n const vy = b.y - a.y;\r\n const baseLen = Math.sqrt(vx * vx + vy * vy);\r\n if (!baseLen) return null;\r\n const ux = vx / baseLen;\r\n const uy = vy / baseLen;\r\n const nx = -uy;\r\n const ny = ux;\r\n const wx = c.x - b.x;\r\n const wy = c.y - b.y;\r\n const s = wx * nx + wy * ny;\r\n if (!s) return null;\r\n const c2 = new Cesium.Cartesian2(b.x + nx * s, b.y + ny * s);\r\n const d2 = new Cesium.Cartesian2(a.x + nx * s, a.y + ny * s);\r\n const worldPoints = plane.projectPointsOntoEllipsoid([a, b, c2, d2]);\r\n if (!worldPoints || worldPoints.length < 4) return null;\r\n const corners = worldPoints;\r\n const p0 = corners[0];\r\n const p2w = corners[2];\r\n const width = Math.abs(baseLen);\r\n const height = Math.abs(s);\r\n const center = new Cesium.Cartesian3(\r\n (p0.x + p2w.x) / 2,\r\n (p0.y + p2w.y) / 2,\r\n (p0.z + p2w.z) / 2,\r\n );\r\n const planeCenter = new Cesium.EllipsoidTangentPlane(center, Cesium.Ellipsoid.WGS84);\r\n const rect2d = planeCenter.projectPointsOntoPlane(corners);\r\n let area2D = 0;\r\n for (let i = 0; i < rect2d.length; i++) {\r\n const j = (i + 1) % rect2d.length;\r\n area2D += rect2d[i].x * rect2d[j].y - rect2d[j].x * rect2d[i].y;\r\n }\r\n const area = Math.abs(area2D) / 2;\r\n return { corners, center, width, height, area };\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class RegularPolygonMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private positions: any[] = [];\r\n private labelEntity: any = null;\r\n private currentPoints: any[] = [];\r\n private primitive: any = null;\r\n private previewEntity: any = null;\r\n private edgeEntities: any[] = [];\r\n private pointEntities: any[] = [];\r\n private previewEdgeEntity: any = null;\r\n private previewPointEntities: any[] = [];\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n private segmentLabelIds: string[] = [];\r\n private previewLabelId: string | null = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const sides = Math.max(options.sides || 6, 6);\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-regular', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-regular-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((click: any) => {\r\n const position = viewer.scene.pickPosition(click.position);\r\n if (!position) return;\r\n this.positions.push(position);\r\n if (this.positions.length === 2) {\r\n this.stop();\r\n const center = this.positions[0];\r\n const edge = this.positions[1];\r\n const radius = Cesium.Cartesian3.distance(center, edge);\r\n const points = this.buildRegularPolygonPoints(center, radius, sides);\r\n if (this.previewEntity) {\r\n viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.primitive) {\r\n viewer.scene.primitives.remove(this.primitive);\r\n this.primitive = null;\r\n }\r\n const hierarchy = new Cesium.PolygonHierarchy(points);\r\n const geom = new Cesium.PolygonGeometry({\r\n polygonHierarchy: hierarchy,\r\n vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n const occludedColor = (options.color && options.color.withAlpha)\r\n ? options.color.withAlpha(0.25)\r\n : Cesium.Color.RED.withAlpha(0.4);\r\n this.primitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color: occludedColor }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n });\r\n viewer.scene.primitives.add(this.primitive);\r\n const lineColor = options.lineColor || color;\r\n const dashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n const polylinePositions = points.slice();\r\n const lineEntity = viewer.entities.add({\r\n polyline: {\r\n positions: polylinePositions,\r\n width: options.width || 2,\r\n material: lineColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n this.edgeEntities.push(lineEntity);\r\n const pointColor = options.pointColor || color;\r\n const uniquePoints = points.slice(0, points.length - 1);\r\n for (const p of uniquePoints) {\r\n const pointEntity = viewer.entities.add({\r\n position: p,\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.pointEntities.push(pointEntity);\r\n }\r\n const area = this.computeAreaByPlane(points);\r\n const cc = Cesium.Cartographic.fromCartesian(center);\r\n const id = this.htmlLabelId || `measure_regular_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n const t = options.labelText || { sides: '边数', radius: '半径', circumference: '周长', area: '面积', side: '边长' };\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n let perimeter = 0;\r\n for (let i = 1; i < points.length; i++) {\r\n const p1 = points[i - 1];\r\n const p2 = points[i];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n perimeter += d;\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = `measure_regular_seg_${Date.now()}_${i - 1}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add(\r\n { text: `${t.side}:${d.toFixed(2)} m` },\r\n {\r\n id: sid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-regular-seg',\r\n show: true,\r\n },\r\n );\r\n }\r\n this.htmlLabelPool.add(\r\n { text: `${t.sides}:${sides}\\n${t.radius}:${radius.toFixed(2)} m\\n${t.circumference}:${perimeter.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(cc.longitude),\r\n lat: Cesium.Math.toDegrees(cc.latitude),\r\n height: cc.height || 0,\r\n theme: 'measure-regular',\r\n show: true,\r\n },\r\n );\r\n const result = {\r\n entity: this.primitive,\r\n label: this.labelEntity,\r\n positions: points,\r\n radius,\r\n sides,\r\n perimeter,\r\n area,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length !== 1) return;\r\n const center = this.positions[0];\r\n const ray = viewer.camera.getPickRay(movement.endPosition);\r\n const edge = viewer.scene.globe.pick(ray, viewer.scene);\r\n if (!edge) return;\r\n const radius = Cesium.Cartesian3.distance(center, edge);\r\n this.currentPoints = this.buildRegularPolygonPoints(center, radius, sides);\r\n if (!this.previewEntity) {\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n this.previewEntity = viewer.entities.add({\r\n polygon: {\r\n hierarchy: new Cesium.CallbackProperty(() => {\r\n if (!this.currentPoints || this.currentPoints.length === 0) return undefined;\r\n return new Cesium.PolygonHierarchy(this.currentPoints);\r\n }, false),\r\n material: color,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n },\r\n });\r\n const lineColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n this.previewEdgeEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.currentPoints || this.currentPoints.length === 0) return [];\r\n return this.currentPoints.slice();\r\n }, false),\r\n width: options.width || 2,\r\n material: lineColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n const pointColor = options.pointColor || options.color || Cesium.Color.YELLOW;\r\n const basePoint = viewer.entities.add({\r\n position: center,\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n const hoverPoint = viewer.entities.add({\r\n position: new Cesium.CallbackProperty(() => edge || center, false),\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.previewPointEntities.push(basePoint, hoverPoint);\r\n }\r\n let perimeter = 0;\r\n for (let i = 1; i < this.currentPoints.length; i++) {\r\n const p1 = this.currentPoints[i - 1];\r\n const p2 = this.currentPoints[i];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n perimeter += geodesic.surfaceDistance;\r\n }\r\n const area = this.computeAreaByPlane(this.currentPoints);\r\n const cc = Cesium.Cartographic.fromCartesian(center);\r\n const pid = this.previewLabelId || 'measure_regular_preview';\r\n this.previewLabelId = pid;\r\n const t = options.labelText || { sides: '边数', radius: '半径', circumference: '周长', area: '面积' };\r\n this.htmlLabelPool.add(\r\n { text: `${t.sides}:${sides}\\n${t.radius}:${radius.toFixed(2)} m\\n${t.circumference}:${perimeter.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²` },\r\n {\r\n id: pid,\r\n lon: Cesium.Math.toDegrees(cc.longitude),\r\n lat: Cesium.Math.toDegrees(cc.latitude),\r\n height: cc.height || 0,\r\n theme: 'measure-regular',\r\n show: true,\r\n },\r\n );\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewEdgeEntity) {\r\n this.viewer.entities.remove(this.previewEdgeEntity);\r\n this.previewEdgeEntity = null;\r\n }\r\n if (this.previewPointEntities.length) {\r\n for (const p of this.previewPointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.previewPointEntities = [];\r\n }\r\n if (this.primitive) {\r\n this.viewer.scene.primitives.remove(this.primitive);\r\n this.primitive = null;\r\n }\r\n if (this.edgeEntities.length) {\r\n for (const e of this.edgeEntities) {\r\n try {\r\n this.viewer.entities.remove(e);\r\n } catch {}\r\n }\r\n this.edgeEntities = [];\r\n }\r\n if (this.pointEntities.length) {\r\n for (const p of this.pointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.pointEntities = [];\r\n }\r\n if (this.labelEntity) {\r\n this.viewer.entities.remove(this.labelEntity);\r\n this.labelEntity = null;\r\n }\r\n if (this.htmlLabelPool && this.htmlLabelId) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.segmentLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.segmentLabelIds.slice());\r\n }\r\n this.segmentLabelIds = [];\r\n this.positions = [];\r\n this.currentPoints = [];\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const sides = (record.data?.sides || opts.sides || 3);\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 2) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-regular', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-regular-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n let points: any[] = [];\r\n let center = posList[0];\r\n let radius = 0;\r\n if (posList.length >= 3) {\r\n points = posList.slice();\r\n center = new Cesium.Cartesian3(\r\n points.reduce((s: number, p: any) => s + p.x, 0) / points.length,\r\n points.reduce((s: number, p: any) => s + p.y, 0) / points.length,\r\n points.reduce((s: number, p: any) => s + p.z, 0) / points.length,\r\n );\r\n const c1 = points[0];\r\n const c2 = points[Math.floor(points.length / 2)] || points[1];\r\n radius = Cesium.Cartesian3.distance(center, c1);\r\n } else {\r\n const edge = posList[1];\r\n radius = Cesium.Cartesian3.distance(center, edge);\r\n points = this.buildRegularPolygonPoints(center, radius, Math.max(sides, 3));\r\n }\r\n const hierarchy = new Cesium.PolygonHierarchy(points);\r\n const geom = new Cesium.PolygonGeometry({ polygonHierarchy: hierarchy, vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT, perPositionHeight: true });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = opts.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n const occludedColor = (opts.color && opts.color.withAlpha) ? opts.color.withAlpha(0.25) : Cesium.Color.RED.withAlpha(0.4);\r\n const primitive = new Cesium.Primitive({ geometryInstances: instance, appearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color }), translucent: true, closed: true }), depthFailAppearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color: occludedColor }), translucent: true, closed: true }) });\r\n viewer.scene.primitives.add(primitive);\r\n this.primitive = primitive;\r\n const area = this.computeAreaByPlane(points);\r\n const cc = Cesium.Cartographic.fromCartesian(center);\r\n const id = record.id + '_regular';\r\n this.htmlLabelId = id;\r\n const t = opts.labelText || { sides: '边数', radius: '半径', circumference: '周长', area: '面积', side: '边长' };\r\n let perimeter = 0;\r\n for (let i = 1; i < points.length; i++) {\r\n const p1 = points[i - 1];\r\n const p2 = points[i];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n perimeter += d;\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = record.id + `_regular_seg_${i - 1}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add({ text: `${t.side}:${d.toFixed(2)} m` }, { id: sid, lon: Cesium.Math.toDegrees(mc.longitude), lat: Cesium.Math.toDegrees(mc.latitude), height: mc.height || 0, theme: 'measure-regular-seg', show: true });\r\n }\r\n this.htmlLabelPool.add({ text: `${t.sides}:${Math.max(sides, 3)}\\n${t.radius}:${radius.toFixed(2)} m\\n${t.circumference}:${perimeter.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²` }, { id, lon: Cesium.Math.toDegrees(cc.longitude), lat: Cesium.Math.toDegrees(cc.latitude), height: cc.height || 0, theme: 'measure-regular', show: true });\r\n }\r\n\r\n private buildRegularPolygonPoints(center: any, radius: number, sides: number) {\r\n const Cesium = this.Cesium;\r\n const plane = new Cesium.EllipsoidTangentPlane(center, Cesium.Ellipsoid.WGS84);\r\n const step = (2 * Math.PI) / sides;\r\n const points2D: any[] = [];\r\n for (let i = 0; i < sides; i++) {\r\n const angle = i * step;\r\n const x = radius * Math.cos(angle);\r\n const y = radius * Math.sin(angle);\r\n points2D.push(new Cesium.Cartesian2(x, y));\r\n }\r\n const worldPoints = plane.projectPointsOntoEllipsoid(points2D);\r\n const points: any[] = worldPoints.slice();\r\n points.push(points[0]);\r\n return points;\r\n }\r\n\r\n private computeAreaByPlane(points: any[]) {\r\n const Cesium = this.Cesium;\r\n const center = new Cesium.Cartesian3(\r\n points.reduce((s: number, p: any) => s + p.x, 0) / points.length,\r\n points.reduce((s: number, p: any) => s + p.y, 0) / points.length,\r\n points.reduce((s: number, p: any) => s + p.z, 0) / points.length,\r\n );\r\n const plane = new Cesium.EllipsoidTangentPlane(center, Cesium.Ellipsoid.WGS84);\r\n const p2d = plane.projectPointsOntoPlane(points);\r\n let area = 0;\r\n for (let i = 0; i < p2d.length; i++) {\r\n const j = (i + 1) % p2d.length;\r\n area += p2d[i].x * p2d[j].y - p2d[j].x * p2d[i].y;\r\n }\r\n return Math.abs(area) / 2;\r\n }\r\n}\r\n","import {\n IMeasure,\n MeasurementOptions,\n MeasurementType,\n MeasurementRecord,\n MeasurementsConfig,\n} from './types';\nimport HorizontalMeasure from './handlers/HorizontalMeasure';\nimport VerticalMeasure from './handlers/VerticalMeasure';\nimport TriangleMeasure from './handlers/TriangleMeasure';\nimport SpaceMeasure from './handlers/SpaceMeasure';\nimport AreaMeasure from './handlers/AreaMeasure';\nimport CircleMeasure from './handlers/CircleMeasure';\nimport PolylineDistanceMeasure from './handlers/PolylineDistanceMeasure';\nimport TerrainHeightMeasure from './handlers/TerrainHeightMeasure';\nimport CoordinateMeasure from './handlers/CoordinateMeasure';\nimport RectangleMeasure from './handlers/RectangleMeasure';\nimport RegularPolygonMeasure from './handlers/RegularPolygonMeasure';\nimport { HtmlOverlayLabelPool } from '../HtmlOverlayLabelPool';\nimport { MarkerEventKey } from '../MarkerEvent';\n\nexport class MeasurementTool {\n private Cesium: any;\n private viewer: any;\n private actives: IMeasure[] = [];\n private measurements: MeasurementRecord[] = [];\n private htmlLabelPool: any = null;\n private recordHandlers: Map<string, IMeasure> = new Map();\n private specifiedClear: boolean = false;\n private deleteLabelPool: HtmlOverlayLabelPool | null = null;\n private deleteLabelIds: Map<string, string> = new Map();\n\n constructor({ Cesium, viewer }: { Cesium: any; viewer: any }) {\n this.Cesium = Cesium;\n this.viewer = viewer;\n viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\n }\n\n measure(type: MeasurementType, options: MeasurementOptions) {\n let handler: IMeasure | null = null;\n switch (type) {\n case 'horizontal':\n handler = new HorizontalMeasure(this.Cesium, this.viewer);\n break;\n case 'vertical':\n handler = new VerticalMeasure(this.Cesium, this.viewer);\n break;\n case 'triangle':\n handler = new TriangleMeasure(this.Cesium, this.viewer);\n break;\n case 'space':\n handler = new SpaceMeasure(this.Cesium, this.viewer);\n break;\n case 'area':\n handler = new AreaMeasure(this.Cesium, this.viewer);\n break;\n case 'circle':\n handler = new CircleMeasure(this.Cesium, this.viewer);\n break;\n case 'polyline':\n handler = new PolylineDistanceMeasure(this.Cesium, this.viewer);\n break;\n case 'terrainHeight':\n handler = new TerrainHeightMeasure(this.Cesium, this.viewer);\n break;\n case 'coordinate':\n handler = new CoordinateMeasure(this.Cesium, this.viewer);\n break;\n case 'rectangle':\n handler = new RectangleMeasure(this.Cesium, this.viewer);\n break;\n case 'regularPolygon':\n handler = new RegularPolygonMeasure(this.Cesium, this.viewer);\n break;\n default:\n throw new Error(`Unsupported measurement type: ${type}`);\n }\n if (!handler) return;\n this.actives.push(handler);\n const currentHandler = handler;\n const wrapped: MeasurementOptions = {\n ...options,\n onComplete: (result: any) => {\n const record: MeasurementRecord = {\n id: `m_${Date.now()}_${this.measurements.length}`,\n type,\n options: (() => {\n const o: any = { ...options };\n if ('onComplete' in o) {\n delete o.onComplete;\n }\n return o;\n })(),\n positions: (() => {\n if (Array.isArray(result?.positions)) {\n return result.positions.map((p: any) => [p.x, p.y, p.z]);\n }\n switch (type) {\n case 'terrainHeight': {\n const pos = (result as any)?.position;\n if (pos) return [[pos.x, pos.y, pos.z]];\n return undefined;\n }\n case 'coordinate': {\n const ll = (result as any)?.lnglat;\n if (ll && typeof ll.lng === 'number' && typeof ll.lat === 'number') {\n const c = this.Cesium.Cartesian3.fromDegrees(ll.lng, ll.lat, ll.height || 0);\n return [[c.x, c.y, c.z]];\n }\n return undefined;\n }\n default:\n return undefined;\n }\n })(),\n data: this._serializeMetrics(type, result),\n };\n this.measurements.push(record);\n if (currentHandler) {\n this.recordHandlers.set(record.id, currentHandler);\n }\n if (this.specifiedClear) {\n this._showDeleteLabels('html-label-container');\n }\n options.onComplete?.(result);\n const idx = this.actives.indexOf(currentHandler);\n if (idx >= 0) this.actives.splice(idx, 1);\n },\n };\n handler.start(wrapped);\n }\n\n clear() {\n const h = this.actives.pop();\n if (h) h.clear();\n this._removeAllDeleteLabels();\n this.specifiedClear = false;\n }\n\n cancel() {\n const h = this.actives.pop();\n if (h) h.stop();\n }\n\n disableDefaultSelection({ disableLeftClick = false, disableDoubleClick = true } = {}) {\n const handler = this.viewer?.cesiumWidget?.screenSpaceEventHandler;\n if (!handler) return;\n if (disableDoubleClick) {\n handler.removeInputAction(this.Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\n }\n if (disableLeftClick) {\n handler.removeInputAction(this.Cesium.ScreenSpaceEventType.LEFT_CLICK);\n }\n }\n\n clearAll() {\n while (this.actives.length) {\n const h = this.actives.pop();\n try {\n h?.clear();\n } catch {}\n }\n for (const [, handler] of this.recordHandlers) {\n try {\n handler.clear();\n } catch {}\n }\n this.recordHandlers.clear();\n this.measurements = [];\n this._removeAllDeleteLabels();\n this.specifiedClear = false;\n }\n\n public getMeasurementsConfig(): MeasurementsConfig {\n return {\n measurements: this.measurements.map((m) => ({\n ...m,\n options: m.options ? { ...(m.options as any) } : m.options,\n positions: m.positions ? m.positions.map((p) => [p[0], p[1], p[2]]) : m.positions,\n data: m.data ? { ...(m.data as any) } : m.data,\n })),\n };\n }\n\n public setMeasurementsConfig(config: MeasurementsConfig) {\n if (!config?.measurements?.length) return;\n for (const rec of config.measurements) {\n let handler: IMeasure | null = null;\n switch (rec.type) {\n case 'horizontal':\n handler = new HorizontalMeasure(this.Cesium, this.viewer);\n break;\n case 'vertical':\n handler = new VerticalMeasure(this.Cesium, this.viewer);\n break;\n case 'triangle':\n handler = new TriangleMeasure(this.Cesium, this.viewer);\n break;\n case 'space':\n handler = new SpaceMeasure(this.Cesium, this.viewer);\n break;\n case 'area':\n handler = new AreaMeasure(this.Cesium, this.viewer);\n break;\n case 'circle':\n handler = new CircleMeasure(this.Cesium, this.viewer);\n break;\n case 'polyline':\n handler = new PolylineDistanceMeasure(this.Cesium, this.viewer);\n break;\n case 'terrainHeight':\n handler = new TerrainHeightMeasure(this.Cesium, this.viewer);\n break;\n case 'coordinate':\n handler = new CoordinateMeasure(this.Cesium, this.viewer);\n break;\n case 'rectangle':\n handler = new RectangleMeasure(this.Cesium, this.viewer);\n break;\n case 'regularPolygon':\n handler = new RegularPolygonMeasure(this.Cesium, this.viewer);\n break;\n default:\n handler = null;\n }\n handler?.rehydrate?.(rec, undefined);\n if (handler && rec.id) {\n this.recordHandlers.set(rec.id, handler);\n }\n const exists = this.measurements.find((r) => r.id === rec.id);\n if (!exists) this.measurements.push(rec);\n }\n if (this.specifiedClear) {\n this._showDeleteLabels('html-label-container');\n }\n }\n\n private _serializeMetrics(type: MeasurementType, result: any) {\n switch (type) {\n case 'space':\n return { distance: result?.distance };\n case 'horizontal':\n return { distance: result?.distance };\n case 'vertical':\n return { vertical: result?.vertical };\n case 'polyline':\n return { distance: result?.distance };\n case 'area':\n return { area: result?.area };\n case 'circle':\n return { radius: result?.radius, area: result?.area, perimeter: result?.perimeter };\n case 'rectangle':\n return { width: result?.width, height: result?.height, area: result?.area };\n case 'regularPolygon':\n return {\n sides: result?.sides,\n radius: result?.radius,\n perimeter: result?.perimeter,\n area: result?.area,\n };\n case 'triangle':\n return { lengths: result?.lengths, angles: result?.angles };\n case 'terrainHeight':\n return {\n terrainHeight: result?.terrainHeight,\n difference: result?.difference,\n position: result?.position,\n zeroPosition: result?.zeroPosition,\n };\n case 'coordinate':\n return { lnglat: result?.lnglat };\n default:\n return {};\n }\n }\n\n private _toCartesian(arr: [number, number, number]) {\n const Cesium = this.Cesium;\n return new Cesium.Cartesian3(arr[0], arr[1], arr[2]);\n }\n\n private _removeRecordVisual(_rec: MeasurementRecord) {\n const viewer = this.viewer;\n const Cesium = this.Cesium;\n const entities = viewer.entities.values;\n for (let i = entities.length - 1; i >= 0; i--) {\n const e = entities[i];\n try {\n viewer.entities.remove(e);\n } catch {}\n }\n const primitives = viewer.scene.primitives;\n const arr: any[] = [];\n primitives._primitives && primitives._primitives.forEach((p: any) => arr.push(p));\n for (const p of arr) {\n try {\n viewer.scene.primitives.remove(p);\n } catch {}\n }\n if (this.htmlLabelPool) {\n this.htmlLabelPool.removeAll();\n }\n }\n\n public toggleSpecifiedClear(containerId?: string) {\n if (!this.specifiedClear) {\n this.specifiedClear = true;\n if (!this.deleteLabelPool) {\n const cid = containerId || 'html-label-container';\n this.deleteLabelPool = new HtmlOverlayLabelPool(this.Cesium, this.viewer, cid);\n this.deleteLabelPool.registerTheme('measure-delete-label', {\n createElement: (el: HTMLDivElement, ctx: any) => {\n el.innerHTML = '删除';\n el.style.background = 'rgba(255,0,0,0.7)';\n el.style.color = '#fff';\n el.style.font = '12px sans-serif';\n el.style.padding = '2px 6px';\n el.style.borderRadius = '4px';\n el.style.whiteSpace = 'nowrap';\n },\n options: { offset: { x: 0, y: -10 } },\n });\n this.deleteLabelPool.eventBus.addListener(\n MarkerEventKey.Click,\n {\n name: 'measurement_delete_label_click',\n fn: (info: any) => {\n if (!info || info.theme !== 'measure-delete-label') return;\n const rid = info?.data?.recordId;\n if (rid) this.deleteMeasurement(rid);\n },\n },\n true,\n );\n }\n this._showDeleteLabels(containerId || 'html-label-container');\n } else {\n this._removeAllDeleteLabels();\n this.specifiedClear = false;\n }\n }\n\n public deleteMeasurement(recordId: string) {\n const handler = this.recordHandlers.get(recordId);\n if (handler) {\n try {\n handler.clear();\n } catch {}\n }\n this.recordHandlers.delete(recordId);\n this.measurements = this.measurements.filter((m) => m.id !== recordId);\n const did = this.deleteLabelIds.get(recordId);\n if (did && this.deleteLabelPool) {\n this.deleteLabelPool.removeByIds([did]);\n }\n this.deleteLabelIds.delete(recordId);\n }\n\n private _showDeleteLabels(containerId?: string) {\n if (!this.deleteLabelPool) return;\n const Cesium = this.Cesium;\n for (const rec of this.measurements) {\n const id = 'm_del_' + rec.id;\n if (this.deleteLabelIds.has(rec.id)) continue;\n const center = this._computeRecordCenter(rec);\n if (!center) continue;\n const carto = Cesium.Cartographic.fromCartesian(center);\n const lon = Cesium.Math.toDegrees(carto.longitude);\n const lat = Cesium.Math.toDegrees(carto.latitude);\n const h = carto.height || 0;\n this.deleteLabelPool.add(\n { recordId: rec.id },\n {\n id,\n lon,\n lat,\n height: h,\n theme: 'measure-delete-label',\n show: true,\n style: { zIndex: '1000' },\n },\n );\n this.deleteLabelIds.set(rec.id, id);\n }\n }\n\n private _removeAllDeleteLabels() {\n if (this.deleteLabelPool) {\n const ids = Array.from(this.deleteLabelIds.values());\n if (ids.length) this.deleteLabelPool.removeByIds(ids);\n }\n this.deleteLabelIds.clear();\n }\n\n private _computeRecordCenter(rec: MeasurementRecord) {\n const Cesium = this.Cesium;\n const posList = (rec.positions || []).map((p) => this._toCartesian(p));\n if (posList.length > 0) {\n const cx = posList.reduce((s, p) => s + p.x, 0) / posList.length;\n const cy = posList.reduce((s, p) => s + p.y, 0) / posList.length;\n const cz = posList.reduce((s, p) => s + p.z, 0) / posList.length;\n return new Cesium.Cartesian3(cx, cy, cz);\n }\n if (rec.type === 'coordinate' && rec.data?.lnglat) {\n const lng = rec.data.lnglat.lng;\n const lat = rec.data.lnglat.lat;\n const height = rec.data.lnglat.height || 0;\n return Cesium.Cartesian3.fromDegrees(lng, lat, height);\n }\n if (rec.type === 'terrainHeight' && rec.data?.position) {\n const p = rec.data.position;\n return new Cesium.Cartesian3(p.x, p.y, p.z);\n }\n return null;\n }\n}\n","import { IRoamTool, ViewRoamOptions, Waypoint } from './types';\n\nexport class CameraRoamTool implements IRoamTool {\n private Cesium: any;\n private viewer: any;\n private options: ViewRoamOptions | null = null;\n private entity: any = null;\n private viewEntities: any[] = [];\n private startTime: any = null;\n private stopTime: any = null;\n private isPaused = false;\n private lastTime: any = null;\n\n constructor({ Cesium, viewer }: { Cesium: any; viewer: any }) {\n this.Cesium = Cesium;\n this.viewer = viewer;\n }\n\n get Viewer() {\n return this.viewer;\n }\n\n get CesiumInstance() {\n return this.Cesium;\n }\n\n start(options: ViewRoamOptions) {\n this.clear();\n this.options = options;\n const waypoints = options.waypoints || [];\n if (waypoints.length < 2) return;\n\n this._setupEntities(options);\n\n // Setup Clock\n this.viewer.clock.startTime = this.startTime.clone();\n this.viewer.clock.stopTime = this.stopTime.clone();\n this.viewer.clock.currentTime = this.startTime.clone();\n this.viewer.clock.clockRange = options.loop ? this.Cesium.ClockRange.LOOP_STOP : this.Cesium.ClockRange.CLAMPED;\n this.viewer.clock.multiplier = 1;\n this.viewer.clock.shouldAnimate = true;\n\n this.viewer.clock.onTick.addEventListener(this.onTick);\n }\n\n preview(options: ViewRoamOptions) {\n this.clear();\n this.options = options;\n const waypoints = options.waypoints || [];\n if (waypoints.length < 2) return;\n \n this._setupEntities(options);\n \n // Ensure availability logic works without playing\n // We might want to set clock to start time so user sees the start point\n // but do NOT start animation\n // this.viewer.clock.currentTime = this.startTime.clone();\n // this.viewer.clock.shouldAnimate = false; \n // ^ Calling this might disrupt user's current time if they are looking at something else?\n // Actually, if the path is based on JulianDate.now(), it is in the future relative to when setupEntities is called.\n // So if the clock is \"now\", it should be visible.\n }\n\n private _setupEntities(options: ViewRoamOptions) {\n const waypoints = options.waypoints || [];\n\n // Calculate times and properties\n const property = new this.Cesium.SampledPositionProperty();\n const orientationProperty = new this.Cesium.SampledProperty(this.Cesium.Quaternion);\n \n // Normalize waypoints to Cartesian3 and Quaternion\n const points: { position: any; orientation: any }[] = [];\n \n for (const w of waypoints) {\n let position;\n if (w.destination) {\n if (w.destination.x !== undefined) {\n position = new this.Cesium.Cartesian3(w.destination.x, w.destination.y, w.destination.z);\n } else {\n position = w.destination;\n }\n } else if (w.lon !== undefined && w.lat !== undefined) {\n position = this.Cesium.Cartesian3.fromDegrees(w.lon, w.lat, w.height ?? 0);\n }\n\n let hpr;\n if (w.orientation) {\n hpr = new this.Cesium.HeadingPitchRoll(w.orientation.heading, w.orientation.pitch, w.orientation.roll);\n } else {\n hpr = this.Cesium.HeadingPitchRoll.fromDegrees(w.heading ?? 0, w.pitch ?? -30, w.roll ?? 0);\n }\n const orientation = this.Cesium.Transforms.headingPitchRollQuaternion(position, hpr);\n points.push({ position, orientation });\n }\n\n // Build Time\n const start = this.Cesium.JulianDate.now();\n const speed = options.speed || 100; // Default speed if not specified\n let accTime = 0;\n const times = [];\n\n for (let i = 0; i < points.length; i++) {\n if (i === 0) {\n times.push(start.clone());\n } else {\n const dist = this.Cesium.Cartesian3.distance(points[i-1].position, points[i].position);\n const duration = dist / Math.max(speed, 0.1);\n accTime += duration;\n times.push(this.Cesium.JulianDate.addSeconds(start, accTime, new this.Cesium.JulianDate()));\n }\n property.addSample(times[i], points[i].position);\n orientationProperty.addSample(times[i], points[i].orientation);\n }\n\n this.startTime = times[0];\n this.stopTime = times[times.length - 1];\n\n // Create Main Entity (Drone)\n const entityOptions: any = {\n availability: new this.Cesium.TimeIntervalCollection([\n new this.Cesium.TimeInterval({ start: this.startTime, stop: this.stopTime }),\n ]),\n position: property,\n orientation: orientationProperty,\n };\n\n if (options.modelUrl) {\n entityOptions.model = {\n uri: options.modelUrl,\n scale: options.modelScale ?? 1.0,\n minimumPixelSize: 64,\n runAnimations: options.modelAnimate ?? true,\n };\n } else {\n // Invisible point if no model, or maybe a small pixel\n entityOptions.point = { pixelSize: 1, color: this.Cesium.Color.TRANSPARENT };\n }\n\n // Removed entityOptions.path to use static Polyline instead for better visibility\n if (options.showPath) {\n this.viewEntities.push(this.viewer.entities.add({\n polyline: {\n positions: points.map(p => p.position),\n width: 3,\n material: this.Cesium.Color.GREEN,\n // clampToGround: false\n }\n }));\n }\n\n this.entity = this.viewer.entities.add(entityOptions);\n\n // Show Stops (Viewpoint Icons)\n if (options.showStops) {\n points.forEach((p, index) => {\n // Calculate ground position for drop line\n const carto = this.Cesium.Cartographic.fromCartesian(p.position);\n const groundPos = this.Cesium.Cartesian3.fromRadians(carto.longitude, carto.latitude, 0);\n\n this.viewEntities.push(this.viewer.entities.add({\n position: p.position,\n point: {\n pixelSize: 8,\n color: this.Cesium.Color.YELLOW,\n outlineColor: this.Cesium.Color.BLACK,\n outlineWidth: 1\n },\n label: {\n text: '' + (index + 1),\n font: '12px sans-serif',\n pixelOffset: new this.Cesium.Cartesian2(0, -15),\n fillColor: this.Cesium.Color.WHITE,\n outlineColor: this.Cesium.Color.BLACK,\n outlineWidth: 2,\n style: this.Cesium.LabelStyle.FILL_AND_OUTLINE,\n },\n polyline: {\n positions: [p.position, groundPos],\n width: 2,\n material: new this.Cesium.PolylineDashMaterialProperty({\n color: this.Cesium.Color.RED,\n dashLength: 16\n })\n }\n }));\n });\n }\n }\n\n private onTick = (clock: any) => {\n if (!this.options || !this.entity) return;\n const t = clock.currentTime;\n \n // Check bounds\n if (this.Cesium.JulianDate.lessThan(t, this.startTime) || \n this.Cesium.JulianDate.greaterThan(t, this.stopTime)) {\n if (!this.options.loop && this.Cesium.JulianDate.greaterThan(t, this.stopTime)) {\n // End\n if (this.viewer.clock.shouldAnimate) {\n this.viewer.clock.shouldAnimate = false;\n if (this.options.onComplete) this.options.onComplete();\n }\n }\n return;\n }\n\n const pos = this.entity.position.getValue(t);\n const ori = this.entity.orientation.getValue(t);\n\n if (pos && ori) {\n // Sync Camera\n // Calculate Heading Pitch Roll from Quaternion\n // We need to convert the Global Quaternion back to Local HeadingPitchRoll\n // 1. Create Model Matrix from Position and Orientation\n const modelMatrix = this.Cesium.Matrix4.fromTranslationQuaternionRotationScale(\n pos,\n ori,\n new this.Cesium.Cartesian3(1, 1, 1),\n new this.Cesium.Matrix4()\n );\n\n // 2. Extract Local HPR\n const hpr = this.Cesium.Transforms.fixedFrameToHeadingPitchRoll(\n modelMatrix,\n this.viewer.scene.globe.ellipsoid,\n this.Cesium.Transforms.eastNorthUpToFixedFrame,\n new this.Cesium.HeadingPitchRoll()\n );\n \n this.viewer.camera.setView({\n destination: pos,\n orientation: {\n heading: hpr.heading,\n pitch: hpr.pitch,\n roll: hpr.roll\n }\n });\n \n if (this.options.onTick) this.options.onTick(t, pos, hpr);\n }\n }\n\n stop() {\n this.viewer.clock.shouldAnimate = false;\n this.viewer.clock.onTick.removeEventListener(this.onTick);\n }\n\n pause() {\n this.viewer.clock.shouldAnimate = false;\n this.isPaused = true;\n }\n\n resume() {\n this.viewer.clock.shouldAnimate = true;\n this.isPaused = false;\n }\n\n clear() {\n this.stop();\n if (this.entity) {\n this.viewer.entities.remove(this.entity);\n this.entity = null;\n }\n for (const e of this.viewEntities) {\n this.viewer.entities.remove(e);\n }\n this.viewEntities = [];\n this.options = null;\n }\n \n // Helper to capture current view in the format we want\n captureCurrentView(): Waypoint {\n const destination = this.viewer.camera.position.clone(); // Cartesian3\n const h = this.viewer.camera.heading;\n const p = this.viewer.camera.pitch;\n const r = this.viewer.camera.roll;\n \n return {\n destination: { x: destination.x, y: destination.y, z: destination.z },\n orientation: { heading: h, pitch: p, roll: r }\n };\n }\n\n // Legacy/Helper methods compatibility if needed, but we are refactoring.\n // We'll keep minimal interface compliance.\n}\n","import { IRoamTool, PathRoamOptions } from './types';\n\nexport class PathRoamTool implements IRoamTool {\n private Cesium: any;\n private viewer: any;\n private entity: any = null;\n private positionProperty: any = null;\n private startTime: any = null;\n private stopTime: any = null;\n private options: PathRoamOptions | null = null;\n private cameraOffset: any = null;\n\n constructor({ Cesium, viewer }: { Cesium: any; viewer: any }) {\n this.Cesium = Cesium;\n this.viewer = viewer;\n }\n\n get Viewer() {\n return this.viewer;\n }\n\n get CesiumInstance() {\n return this.Cesium;\n }\n\n start(options: PathRoamOptions) {\n this.clear();\n this.options = options;\n const positions = this.normalizePositions(options.positions || []);\n if (!positions.length) return;\n const speed = options.speed ?? 30;\n const times = this.buildTimes(positions, speed);\n const property = new this.Cesium.SampledPositionProperty();\n for (let i = 0; i < positions.length; i++) {\n property.addSample(times[i], positions[i]);\n }\n this.positionProperty = property;\n const orientation = new this.Cesium.VelocityOrientationProperty(property);\n const showPath = options.showPath ?? true;\n const pathColor = options.pathColor ?? this.Cesium.Color.YELLOW;\n const pathWidth = options.pathWidth ?? 3;\n const pointColor = options.pointColor ?? this.Cesium.Color.RED;\n const pointPixelSize = options.pointPixelSize ?? 8;\n\n const entityOptions: any = {\n availability: new this.Cesium.TimeIntervalCollection([\n new this.Cesium.TimeInterval({ start: this.startTime, stop: this.stopTime }),\n ]),\n position: property,\n orientation,\n path: showPath ? { material: pathColor, width: pathWidth, leadTime: 0 } : undefined,\n };\n\n if (options.modelUrl) {\n entityOptions.model = {\n uri: options.modelUrl,\n scale: options.modelScale ?? 1.0,\n minimumPixelSize: 64,\n runAnimations: options.modelAnimate ?? true,\n };\n } else {\n entityOptions.point = { color: pointColor, pixelSize: pointPixelSize };\n }\n\n this.entity = this.viewer.entities.add(entityOptions);\n this.viewer.clock.startTime = this.startTime.clone();\n this.viewer.clock.stopTime = this.stopTime.clone();\n this.viewer.clock.currentTime = this.startTime.clone();\n this.viewer.clock.clockRange = options.loop\n ? this.Cesium.ClockRange.LOOP_STOP\n : this.Cesium.ClockRange.CLAMPED;\n this.viewer.clock.multiplier = 1;\n this.viewer.clock.shouldAnimate = true;\n if (options.initialView) {\n this.viewer.camera.setView({\n destination: options.initialView.destination,\n orientation: options.initialView.orientation,\n });\n this.cameraOffset = null; // Reset offset\n } else if (options.followCamera) {\n this.viewer.trackedEntity = this.entity;\n } else if (options.lookAtOffset) {\n this.viewer.camera.lookAt(this.entity.position, options.lookAtOffset);\n }\n this.viewer.clock.onTick.addEventListener(this.onTick);\n }\n\n stop() {\n this.viewer.clock.shouldAnimate = false;\n this.viewer.clock.onTick.removeEventListener(this.onTick);\n if (this.viewer.trackedEntity === this.entity) this.viewer.trackedEntity = undefined;\n }\n\n clear() {\n this.stop();\n if (this.entity) {\n this.viewer.entities.remove(this.entity);\n this.entity = null;\n }\n this.positionProperty = null;\n this.startTime = null;\n this.stopTime = null;\n this.options = null;\n try {\n this.viewer.camera.lookAtTransform(this.Cesium.Matrix4.IDENTITY);\n } catch {}\n }\n\n private normalizePositions(arr: Array<[number, number, number?]> | any[]) {\n const out: any[] = [];\n for (const p of arr) {\n if (Array.isArray(p)) {\n const [lon, lat, height] = p as [number, number, number?];\n out.push(this.Cesium.Cartesian3.fromDegrees(lon, lat, height ?? 0));\n } else if (p?.x !== undefined && p?.y !== undefined && p?.z !== undefined) {\n out.push(p);\n }\n }\n return out;\n }\n\n private buildTimes(positions: any[], speed: number) {\n const times: any[] = [];\n const start = this.Cesium.JulianDate.now();\n let acc = 0;\n for (let i = 0; i < positions.length; i++) {\n if (i === 0) {\n times.push(start.clone());\n } else {\n const d = this.Cesium.Cartesian3.distance(positions[i - 1], positions[i]);\n acc += d / Math.max(speed, 0.1);\n times.push(this.Cesium.JulianDate.addSeconds(start, acc, new this.Cesium.JulianDate()));\n }\n }\n this.startTime = times[0];\n this.stopTime = times[times.length - 1];\n return times;\n }\n\n private onTick = (clock: any) => {\n if (!this.options || !this.positionProperty) return;\n const t = clock.currentTime;\n const pos = this.positionProperty.getValue(t);\n\n // Custom Camera Follow Logic (Initial View + Follow)\n if (this.options.followCamera && this.options.initialView && pos) {\n if (!this.cameraOffset) {\n // Calculate offset on first valid position relative to initial view\n this.cameraOffset = this.Cesium.Cartesian3.subtract(\n this.options.initialView.destination,\n pos,\n new this.Cesium.Cartesian3(),\n );\n }\n const newCamPos = this.Cesium.Cartesian3.add(\n pos,\n this.cameraOffset,\n new this.Cesium.Cartesian3(),\n );\n this.viewer.camera.setView({\n destination: newCamPos,\n orientation: this.options.initialView.orientation,\n });\n }\n\n if (pos && this.options.onTick) this.options.onTick(t, pos);\n if (this.Cesium.JulianDate.greaterThanOrEquals(t, this.stopTime)) {\n if (!this.options.loop) {\n if (this.options.onComplete) this.options.onComplete();\n this.stop();\n }\n }\n };\n}\n"],"names":["BufferedHierarchicalAggregator","Cesium","viewer","options","__publicField","globe","surface","provider","pending","currentScene","currentGlobe","groupByTheme","rebuild","update","count","threshold","debug","levels","minLevel","maxLevel","index","tileLevel","size","points","newPoints","isUpdate","pt","newData","_a","_b","idx","p","oldPt","level","grid","carto","tileXY","key","cell","iAll","iSkip","theme","group","iGroup","updated","ids","idSet","groupKey","groupPoints","filteredGroup","_c","_d","_e","_f","effectiveThreshold","labelCount","processCell","levelIdx","lonIdx","latIdx","_g","_h","_i","_j","_k","_l","_m","_n","_o","isLastLevel","rect","west","south","east","north","centerLon","centerLat","rawGroupPoints","clusterLon","clusterLat","finalTheme","clusterId","tileLevelForDebug","tiles","visited","t","minDefinedLevel","maxDefinedLevel","nearestIndex","minDiff","i","diff","targetTileLevel","tileX","tileY","factor","tileWestDeg","tileEastDeg","tileSouthDeg","tileNorthDeg","westIdx","eastIdx","southIdx","northIdx","text","entity","e","scene","MarkerEventKey","MarkerEventBus","listener","overwrite","map","existed","name","data","err","DOM_EVENT_MAP","HtmlOverlayLabelPool","containerId","eventBus","openWheel","id","container","themeName","lon","lat","height","show","notCreateElement","style","themeOptions","label","el","domEvent","labelData","lastTime","event","dom","currTime","unload","items","filter","positions","heightResult","finalHeight","worldPos","position","st","screenPosition","offset","offsetX","offsetY","TooltipManager","PointDrawer","movement","cartographic","lng","result","LineDrawer","pos","point","lnglats","RectangleDrawer","c1","c2","sw","ne","CircleDrawer","CesiumInstance","viewerInstance","click","center","ray","edge","radius","dynamicRadius","centerCarto","centerLngLat","step","circlePoints","circleLnglats","angle","angleRad","geodesic","interpolated","destCartesian","PolygonDrawer","DrawTool","type","freeGlobal","freeSelf","root","Symbol","objectProto","hasOwnProperty","nativeObjectToString","symToStringTag","getRawTag","value","isOwn","tag","unmasked","objectToString","nullTag","undefinedTag","baseGetTag","isObjectLike","isArray","isObject","asyncTag","funcTag","genTag","proxyTag","isFunction","coreJsData","maskSrcKey","uid","isMasked","func","funcProto","funcToString","toSource","reRegExpChar","reIsHostCtor","reIsNative","baseIsNative","pattern","getValue","object","getNative","WeakMap","objectCreate","baseCreate","proto","defineProperty","arrayEach","array","iteratee","length","MAX_SAFE_INTEGER","reIsUint","isIndex","baseAssignValue","eq","other","assignValue","objValue","isLength","isArrayLike","isPrototype","Ctor","baseTimes","n","argsTag","baseIsArguments","propertyIsEnumerable","isArguments","stubFalse","freeExports","freeModule","moduleExports","Buffer","nativeIsBuffer","isBuffer","arrayTag","boolTag","dateTag","errorTag","mapTag","numberTag","objectTag","regexpTag","setTag","stringTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","typedArrayTags","baseIsTypedArray","baseUnary","freeProcess","nodeUtil","types","nodeIsTypedArray","isTypedArray","arrayLikeKeys","inherited","isArr","isArg","isBuff","isType","skipIndexes","overArg","transform","arg","nativeKeys","baseKeys","keys","nativeCreate","hashClear","hashDelete","HASH_UNDEFINED","hashGet","hashHas","hashSet","Hash","entries","entry","listCacheClear","assocIndexOf","arrayProto","splice","listCacheDelete","lastIndex","listCacheGet","listCacheHas","listCacheSet","ListCache","Map","mapCacheClear","isKeyable","getMapData","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","arrayPush","values","getPrototype","stackClear","stackDelete","stackGet","stackHas","LARGE_ARRAY_SIZE","stackSet","pairs","Stack","cloneBuffer","buffer","isDeep","arrayFilter","predicate","resIndex","stubArray","nativeGetSymbols","getSymbols","symbol","baseGetAllKeys","keysFunc","symbolsFunc","getAllKeys","DataView","Promise","Set","promiseTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","getTag","ctorString","initCloneArray","Uint8Array","cloneArrayBuffer","arrayBuffer","cloneDataView","dataView","reFlags","cloneRegExp","regexp","symbolProto","symbolValueOf","cloneSymbol","cloneTypedArray","typedArray","symbolTag","initCloneByTag","initCloneObject","baseIsMap","nodeIsMap","isMap","baseIsSet","nodeIsSet","isSet","cloneableTags","baseClone","bitmask","customizer","stack","isFunc","stacked","subValue","props","CLONE_DEEP_FLAG","CLONE_SYMBOLS_FLAG","cloneDeep","EditMode","GLTFManageEventKey","GLTFManage","models","gltf","model","info","newHeading","newPitch","newRoll","headingPitchRoll","modelMatrix","boundingSphere","worldBoundingSphere","g","num","curModel","scale","mode","cameraController","cartesian","from","to","deltaLongitude","deltaLatitude","m1","m2","mat3","q","f","instantiation","list","parameter","item","getEditState","draggedModel","startModelMatrix","startModelCartographic","startMouseCartographic","startMousePosition","clearStatus","initDragged","modelId","modelPosition","rayHit","hit","currentMouseCartographic","angleDelta","currAngle","callbackInfo","sin","cos","x","y","geometry","instnce","halfSide","boxGeometry","color","width","headWidth","headLength","sideLength","line","arrow","arrowOffset","lineOffset","scratchOffset","newModelMatrix","startPosition","startCartographic","newCartographic","newPosition","rotationMatrix","dragEndCallback","deltaY","modelHeadingPitchRoll","getDynamicImgMaterial","MaterialType","TrailLineMaterialProperty","opts","time","_getWallShader","getWallMaterial","materail","getPolylineFlowMaterialProperty","Color","defineProperties","Event","createPropertyDescriptor","Property","defaultValue","defaultVal","DEFAULT_EMPTY_OBJECT","_materialType","PolylineFlowMaterialProperty","_time","MaterialManager","category","fn","themeKey","material","force","materialMap","EntityGroup","entities","primitives","dataItem","aggregator","cardPool","visible","primitive","bill","immediately","EntityLayer","materialManager","opt","wall","minHeights","maxHeights","poly","outerRing","outerCartesian","holes","hole","_hole","polygonHierarchy","isAppendPoints","groupId","w","pointList","dataItemList","allPoints","groupIds","EntityLayerManager","layerId","layer","dataList","convertGeoJsonToEntityData","geoJson","feature","properties","polygon","geom","PrimitiveManager","entityLayerManager","geometryInstance","_item","themePrimitive","appearance","isDashed","lineMaterialKey","dashPattern","dashLength","cesiumDash","polygonMaterialKey","patternLength","unitLength","dashBits","assigned","len","bit","materialThemes","_holeDegrees","geometryInstanceInfo","oldThemePrimitive","themeMap","geometryInstances","minX","minY","minZ","maxX","maxY","maxZ","offsetHeight","HorizontalMeasure","ctx","clampedPos","terrainHeight","groundPos","groundDashColor","groundLine","p1","p2","d","mid","mc","total","last","lc","record","htmlLabelPool","lineColor","dashColor","posList","seg","sid","VerticalMeasure","ray0","cart","c0","base","basePoint","solidColor","O","D","B","U","w0","a","b","c","den","s","second","solidColor2","dashColor2","secondPoint","vertical","pid","TriangleMeasure","h1","h2","low","high","cl","maxH","third","horizontal","hypotenuse","lenV","lenH","lenHyp","midV","midH","midHyp","mV","mH","mHyp","idV","idH","idHyp","vLowToHigh","vLowToThird","vHighToThird","vHighToLow","dotA","magA","dotB","magB","angleA","angleB","cLow","cHigh","idAngA","idAngB","ratio","markerLen","dirV","dirH","pOffV","pOffH","pCorner","rightMarkerSeg1","rightMarkerSeg2","pv","ph","phyp","pLow","pHigh","SpaceMeasure","p0","AreaMeasure","hierarchy","instance","occludedColor","polylinePositions","lineEntity","pts","points2D","area2D","j","cc","all","pointColor","hoverPoint","lastPoint","p2d","prev","curr","next","v1x","v1y","v2x","v2y","len1","len2","dot","ang","pc","aid","CircleMeasure","area","perimeter","centerLabelPos","cartoCenter","h","PolylineDistanceMeasure","lastId","TerrainHeightMeasure","terrainPos","heightDiff","labelText","CoordinateMeasure","ll","RectangleMeasure","thirdPoint","corners","edges","mc2","surfacePositions","corner","pointEntity","tPrev","ep1","ep2","p3","plane","pts2d","vx","vy","baseLen","ux","nx","ny","wx","wy","d2","worldPoints","p2w","rect2d","RegularPolygonMeasure","sides","uniquePoints","MeasurementTool","handler","currentHandler","wrapped","o","disableLeftClick","disableDoubleClick","m","config","rec","r","arr","_rec","cid","rid","recordId","did","cx","cy","cz","CameraRoamTool","clock","ori","hpr","waypoints","property","orientationProperty","orientation","start","speed","accTime","times","duration","entityOptions","destination","PathRoamTool","newCamPos","showPath","pathColor","pathWidth","pointPixelSize","out","acc"],"mappings":"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","x_google_ignoreList":[10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106]}
|
|
1
|
+
{"version":3,"file":"cesium-core.mjs","sources":["../src/components/BufferedHierarchicalAggregator.ts","../src/components/MarkerEvent.ts","../src/components/HtmlOverlayLabelPool.ts","../src/components/TooltipManager.ts","../src/components/draw/handlers/PointDrawer.ts","../src/components/draw/handlers/LineDrawer.ts","../src/components/draw/handlers/RectangleDrawer.ts","../src/components/draw/handlers/CircleDrawer.ts","../src/components/draw/handlers/PolygonDrawer.ts","../src/components/draw/DrawTool.ts","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_freeGlobal.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_root.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Symbol.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getRawTag.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_objectToString.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseGetTag.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isObjectLike.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isArray.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isObject.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isFunction.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_coreJsData.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_isMasked.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_toSource.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsNative.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getValue.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getNative.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_WeakMap.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseCreate.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_defineProperty.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_arrayEach.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_isIndex.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseAssignValue.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/eq.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_assignValue.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isLength.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isArrayLike.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_isPrototype.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseTimes.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsArguments.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isArguments.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/stubFalse.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isBuffer.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsTypedArray.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseUnary.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_nodeUtil.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isTypedArray.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_arrayLikeKeys.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_overArg.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_nativeKeys.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseKeys.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/keys.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_nativeCreate.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_hashClear.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_hashDelete.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_hashGet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_hashHas.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_hashSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Hash.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_listCacheClear.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_assocIndexOf.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_listCacheDelete.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_listCacheGet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_listCacheHas.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_listCacheSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_ListCache.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Map.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_mapCacheClear.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_isKeyable.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getMapData.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_mapCacheDelete.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_mapCacheGet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_mapCacheHas.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_mapCacheSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_MapCache.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_arrayPush.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getPrototype.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_stackClear.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_stackDelete.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_stackGet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_stackHas.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_stackSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Stack.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_cloneBuffer.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_arrayFilter.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/stubArray.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getSymbols.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseGetAllKeys.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getAllKeys.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_DataView.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Promise.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Set.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_getTag.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_initCloneArray.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_Uint8Array.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_cloneArrayBuffer.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_cloneDataView.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_cloneRegExp.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_cloneSymbol.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_cloneTypedArray.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_initCloneByTag.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_initCloneObject.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsMap.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isMap.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseIsSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/isSet.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/_baseClone.js","../../../node_modules/.pnpm/lodash-es@4.17.23/node_modules/lodash-es/cloneDeep.js","../src/components/gltf/GLTFManage.ts","../src/components/Material/help/dynamicImgMaterial.ts","../src/components/Material/help/PolylineFlowMaterialProperty.ts","../src/components/Material/MaterialManager.ts","../src/components/entity/EntityLayer.ts","../src/components/utils/convertGeoJsonToEntityData.ts","../src/components/primitive/PrimitiveManager.ts","../src/components/measurement/handlers/HorizontalMeasure.ts","../src/components/measurement/handlers/VerticalMeasure.ts","../src/components/measurement/handlers/TriangleMeasure.ts","../src/components/measurement/handlers/SpaceMeasure.ts","../src/components/measurement/handlers/AreaMeasure.ts","../src/components/measurement/handlers/CircleMeasure.ts","../src/components/measurement/handlers/PolylineDistanceMeasure.ts","../src/components/measurement/handlers/TerrainHeightMeasure.ts","../src/components/measurement/handlers/CoordinateMeasure.ts","../src/components/measurement/handlers/RectangleMeasure.ts","../src/components/measurement/handlers/RegularPolygonMeasure.ts","../src/components/measurement/MeasurementTool.ts","../src/components/roaming/CameraRoamTool.ts","../src/components/roaming/PathRoamTool.ts"],"sourcesContent":["import { HtmlOverlayLabelPool } from './HtmlOverlayLabelPool';\r\n\r\ninterface PointData {\r\n id: string;\r\n lon: number;\r\n lat: number;\r\n height: number;\r\n name: string;\r\n data: {\r\n [key: string]: any;\r\n };\r\n [key: string]: any;\r\n}\r\n\r\ninterface GridCell {\r\n allPoints: PointData[];\r\n groups: Map<string, PointData[]>;\r\n skipPoints: PointData[];\r\n}\r\n\r\ninterface AggregatorOptions {\r\n labelPool: HtmlOverlayLabelPool;\r\n threshold?: number;\r\n displayLimit?: number;\r\n maxLevel?: number;\r\n debugCurrentGrids?: boolean;\r\n clusterTheme?: string;\r\n pointTheme?: string;\r\n centralPointMode?: string;\r\n minGlobalPointCount?: number;\r\n groupByTheme?: boolean;\r\n}\r\n\r\ninterface GridLevel {\r\n level: number;\r\n size: number;\r\n minViewWidth: number;\r\n}\r\n\r\nexport { PointData, GridLevel, AggregatorOptions };\r\n\r\nexport class BufferedHierarchicalAggregator {\r\n private Cesium: any;\r\n private viewer: any;\r\n labelPool: HtmlOverlayLabelPool;\r\n private threshold: number;\r\n private displayLimit: number;\r\n private maxLevel: number;\r\n private debugCurrentGrids: boolean;\r\n private levels: GridLevel[];\r\n private points: PointData[] = [];\r\n private gridLayers: Map<number, Map<string, GridCell>> = new Map();\r\n private debugGrids: any[] = [];\r\n private _updateFn: () => void;\r\n private clusterTheme: string;\r\n private pointTheme: string;\r\n private centralPointMode: string;\r\n private minGlobalPointCount: number;\r\n private groupByTheme: boolean;\r\n private tilingScheme: any;\r\n private levelIndexByTileLevel: Map<number, number> = new Map();\r\n private _lastTileProvider: any = null;\r\n private _updateTimer: number | null = null;\r\n private _updateDelay: number = 100;\r\n private _tilesRetryCount: number = 0;\r\n private _tilesRetryMax: number = 100;\r\n private _cameraDirty: boolean = false;\r\n private _tileLoadListener: ((pending: number) => void) | null = null;\r\n private _cameraChangedHandler: (() => void) | null = null;\r\n\r\n constructor(Cesium: any, viewer: any, options: AggregatorOptions) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n\r\n this.labelPool = options.labelPool;\r\n this.threshold = options.threshold ?? 10;\r\n this.displayLimit = options.displayLimit ?? 100;\r\n this.maxLevel = options.maxLevel ?? 5;\r\n this.debugCurrentGrids = options.debugCurrentGrids ?? false;\r\n\r\n this.clusterTheme = options.clusterTheme ?? 'cluster-label';\r\n this.pointTheme = options.pointTheme ?? 'point-label';\r\n this.centralPointMode = options.centralPointMode ?? 'central';\r\n this.minGlobalPointCount = options.minGlobalPointCount ?? 0;\r\n this.groupByTheme = options.groupByTheme ?? false;\r\n\r\n const globe = this.viewer.scene && this.viewer.scene.globe;\r\n const surface = globe && (globe as any)._surface;\r\n const provider = surface && (surface as any)._tileProvider;\r\n const tilingScheme =\r\n provider?.tilingScheme || new this.Cesium.GeographicTilingScheme();\r\n this._lastTileProvider = provider;\r\n this.tilingScheme = tilingScheme;\r\n this.levels = this._createLevels();\r\n this._buildLevels();\r\n\r\n this._updateFn = this._update.bind(this);\r\n\r\n if (globe) {\r\n this._tileLoadListener = (pending: number) => {\r\n if (pending === 0 && this._cameraDirty) {\r\n this._cameraDirty = false;\r\n this._scheduleUpdate();\r\n }\r\n };\r\n (globe as any).tileLoadProgressEvent.addEventListener(this._tileLoadListener);\r\n }\r\n\r\n this._cameraChangedHandler = () => {\r\n const currentScene = this.viewer.scene;\r\n const currentGlobe = currentScene && currentScene.globe;\r\n if (!currentGlobe) {\r\n this._scheduleUpdate();\r\n return;\r\n }\r\n\r\n this._cameraDirty = true;\r\n\r\n if ((currentGlobe as any).tilesLoaded) {\r\n this._cameraDirty = false;\r\n this._scheduleUpdate();\r\n }\r\n };\r\n\r\n this.viewer.camera.changed.addEventListener(this._cameraChangedHandler);\r\n }\r\n\r\n public setGroupByTheme(groupByTheme: boolean, rebuild: boolean = true, update: boolean = true) {\r\n if (this.groupByTheme === groupByTheme) {\r\n if (update) this._update();\r\n return;\r\n }\r\n this.groupByTheme = groupByTheme;\r\n if (rebuild) {\r\n this._buildLevels();\r\n }\r\n if (update) {\r\n this._update();\r\n }\r\n }\r\n\r\n public setMinGlobalPointCount(count: number, update: boolean = true) {\r\n this.minGlobalPointCount = count;\r\n if (update) {\r\n this._update();\r\n }\r\n }\r\n\r\n public setThreshold(threshold: number, update: boolean = true) {\r\n this.threshold = threshold;\r\n if (update) {\r\n this._update();\r\n }\r\n }\r\n\r\n public setDebugCurrentGrids(debug: boolean, update: boolean = true) {\r\n this.debugCurrentGrids = debug;\r\n if (!debug) {\r\n this._clearDebugGrids();\r\n }\r\n if (update) {\r\n this._update();\r\n }\r\n }\r\n\r\n private _syncTilingSchemeAndLevels() {\r\n const globe = this.viewer.scene && this.viewer.scene.globe;\r\n const surface = globe && (globe as any)._surface;\r\n const provider = surface && (surface as any)._tileProvider;\r\n const tilingScheme =\r\n provider?.tilingScheme || new this.Cesium.GeographicTilingScheme();\r\n const providerChanged = provider !== this._lastTileProvider;\r\n const schemeChanged = this.tilingScheme !== tilingScheme;\r\n if (!providerChanged && !schemeChanged && this.levels && this.levels.length > 0) {\r\n return;\r\n }\r\n this._lastTileProvider = provider;\r\n this.tilingScheme = tilingScheme;\r\n this.levels = this._createLevels();\r\n this._buildLevels();\r\n }\r\n\r\n private _createLevels(): GridLevel[] {\r\n const levels: GridLevel[] = [];\r\n this.levelIndexByTileLevel = new Map();\r\n\r\n const minLevel = 0;\r\n const maxLevel = this.maxLevel;\r\n\r\n let index = 0;\r\n for (let tileLevel = minLevel; tileLevel <= maxLevel; tileLevel++, index++) {\r\n const size = 360 / Math.pow(2, tileLevel);\r\n levels.push({\r\n level: tileLevel,\r\n size,\r\n minViewWidth: size * 4,\r\n });\r\n this.levelIndexByTileLevel.set(tileLevel, index);\r\n }\r\n return levels;\r\n }\r\n\r\n public addPoints(points: PointData[]) {\r\n this.points = points;\r\n this._buildLevels();\r\n }\r\n\r\n public appendPoints(newPoints: PointData[], isUpdate: boolean = true) {\r\n for (const pt of newPoints) {\r\n this.points.push(pt);\r\n }\r\n for (const pt of newPoints) {\r\n this._addPointToGrid(pt);\r\n }\r\n if (isUpdate) {\r\n this._scheduleUpdate();\r\n }\r\n }\r\n\r\n private _scheduleUpdate() {\r\n if (this._updateTimer !== null) {\r\n clearTimeout(this._updateTimer);\r\n }\r\n this._updateTimer = window.setTimeout(() => {\r\n this._update();\r\n this._updateTimer = null;\r\n }, this._updateDelay);\r\n }\r\n\r\n public updatePoint(newData: Partial<PointData>) {\r\n const idx = this.points.findIndex((p: PointData) => p.id === newData.id);\r\n if (idx === -1) return;\r\n\r\n const oldPt = this.points[idx];\r\n\r\n for (const level of this.levels) {\r\n const tileLevel = level.level;\r\n const grid = this.gridLayers.get(tileLevel);\r\n if (!grid) continue;\r\n\r\n const carto = this.Cesium.Cartographic.fromDegrees(oldPt.lon, oldPt.lat);\r\n const tileXY = this.tilingScheme.positionToTileXY(\r\n carto,\r\n tileLevel,\r\n new this.Cesium.Cartesian2(),\r\n );\r\n if (!tileXY) continue;\r\n const key = `${tileXY.x}_${tileXY.y}`;\r\n const cell = grid.get(key);\r\n if (cell) {\r\n // 1. remove from allPoints\r\n const iAll = cell.allPoints.findIndex((p: PointData) => p.id === newData.id);\r\n if (iAll !== -1) cell.allPoints.splice(iAll, 1);\r\n\r\n // 2. remove from skipPoints or groups\r\n if (oldPt.data?.skipAggregation) {\r\n const iSkip = cell.skipPoints.findIndex((p: PointData) => p.id === newData.id);\r\n if (iSkip !== -1) cell.skipPoints.splice(iSkip, 1);\r\n } else {\r\n const theme = this.groupByTheme ? oldPt.data?.theme : this.clusterTheme;\r\n const group = cell.groups.get(theme);\r\n if (group) {\r\n const iGroup = group.findIndex((p: PointData) => p.id === newData.id);\r\n if (iGroup !== -1) group.splice(iGroup, 1);\r\n if (group.length === 0) cell.groups.delete(theme);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 替换数据\r\n const updated = { ...oldPt, ...newData };\r\n this.points[idx] = updated;\r\n\r\n // 加入新 grid\r\n this._addPointToGrid(updated);\r\n this._update();\r\n }\r\n\r\n public removePointsById(ids: string[]) {\r\n const idSet = new Set(ids);\r\n this.points = this.points.filter((p: PointData) => !idSet.has(p.id));\r\n\r\n for (const level of this.levels) {\r\n const grid = this.gridLayers.get(level.level);\r\n if (!grid) continue;\r\n for (const [key, cell] of grid.entries()) {\r\n // Filter allPoints\r\n cell.allPoints = cell.allPoints.filter((p: PointData) => !idSet.has(p.id));\r\n\r\n // Filter skipPoints\r\n cell.skipPoints = cell.skipPoints.filter((p: PointData) => !idSet.has(p.id));\r\n\r\n // Filter groups\r\n for (const [groupKey, groupPoints] of cell.groups.entries()) {\r\n const filteredGroup = groupPoints.filter((p: PointData) => !idSet.has(p.id));\r\n if (filteredGroup.length === 0) {\r\n cell.groups.delete(groupKey);\r\n } else {\r\n cell.groups.set(groupKey, filteredGroup);\r\n }\r\n }\r\n\r\n // Cleanup empty cell if needed (optional)\r\n if (cell.allPoints.length === 0) {\r\n grid.delete(key);\r\n }\r\n }\r\n }\r\n this._update();\r\n }\r\n\r\n private _buildLevels() {\r\n this.gridLayers.clear();\r\n for (const level of this.levels) {\r\n this.gridLayers.set(level.level, new Map<string, GridCell>());\r\n }\r\n for (const pt of this.points) {\r\n this._addPointToGrid(pt);\r\n }\r\n }\r\n\r\n private _addPointToGrid(pt: PointData) {\r\n for (const level of this.levels) {\r\n const tileLevel = level.level;\r\n const grid = this.gridLayers.get(tileLevel);\r\n if (!grid) continue;\r\n\r\n const carto = this.Cesium.Cartographic.fromDegrees(pt.lon, pt.lat);\r\n const tileXY = this.tilingScheme.positionToTileXY(\r\n carto,\r\n tileLevel,\r\n new this.Cesium.Cartesian2(),\r\n );\r\n if (!tileXY) continue;\r\n const key = `${tileXY.x}_${tileXY.y}`;\r\n\r\n let cell = grid.get(key);\r\n if (!cell) {\r\n cell = {\r\n allPoints: [],\r\n groups: new Map(),\r\n skipPoints: [],\r\n };\r\n grid.set(key, cell);\r\n }\r\n\r\n cell.allPoints.push(pt);\r\n\r\n if (pt.data?.billboard?.[0]?.skipAggregation) {\r\n cell.skipPoints.push(pt);\r\n } else {\r\n const theme = this.groupByTheme ? pt.data?.billboard?.[0]?.theme : this.clusterTheme;\r\n if (!cell.groups.has(theme)) {\r\n cell.groups.set(theme, []);\r\n }\r\n cell.groups.get(theme)!.push(pt);\r\n }\r\n }\r\n }\r\n\r\n private _update() {\r\n if (!this.labelPool) return;\r\n this._syncTilingSchemeAndLevels();\r\n this.labelPool.reset();\r\n\r\n if (this.debugCurrentGrids) this._clearDebugGrids();\r\n\r\n const effectiveThreshold =\r\n this.points.length < this.minGlobalPointCount ? Infinity : this.threshold;\r\n\r\n let labelCount = 0;\r\n\r\n const processCell = (levelIdx: number, lonIdx: number, latIdx: number) => {\r\n if (labelCount >= this.displayLimit) return;\r\n if (levelIdx < 0) return;\r\n // 当超过最大层级时,强制使用最大层级\r\n if (levelIdx >= this.levels.length) {\r\n levelIdx = this.levels.length - 1;\r\n }\r\n const level = this.levels[levelIdx];\r\n const isLastLevel = levelIdx === this.levels.length - 1;\r\n const tileLevel = level.level;\r\n const grid = this.gridLayers.get(tileLevel);\r\n if (!grid) return;\r\n const key = `${lonIdx}_${latIdx}`;\r\n const cell = grid.get(key);\r\n if (!cell) return;\r\n\r\n const rect = this.tilingScheme.tileXYToRectangle(lonIdx, latIdx, tileLevel);\r\n const west = this.Cesium.Math.toDegrees(rect.west);\r\n const south = this.Cesium.Math.toDegrees(rect.south);\r\n const east = this.Cesium.Math.toDegrees(rect.east);\r\n const north = this.Cesium.Math.toDegrees(rect.north);\r\n const centerLon = (west + east) / 2;\r\n const centerLat = (south + north) / 2;\r\n\r\n for (const p of cell.skipPoints) {\r\n if (p.data?.show === false) continue;\r\n if (labelCount >= this.displayLimit) break;\r\n this.labelPool.add(p.data, {\r\n id: `point-${p.id}`,\r\n lon: p.lon,\r\n lat: p.lat,\r\n height: p.height,\r\n theme: p.data?.billboard?.[0]?.theme || this.pointTheme,\r\n style: p.style,\r\n });\r\n labelCount++;\r\n }\r\n\r\n if (labelCount >= this.displayLimit) {\r\n if (this.debugCurrentGrids) {\r\n this._drawDebugGrid(west, south, east, north, key);\r\n }\r\n return;\r\n }\r\n\r\n for (const [groupKey, rawGroupPoints] of cell.groups) {\r\n const groupPoints = rawGroupPoints.filter((p: PointData) => p.data?.show !== false);\r\n if (groupPoints.length === 0) continue;\r\n\r\n let clusterLon = centerLon;\r\n let clusterLat = centerLat;\r\n let clusterHeight = groupPoints[0]?.height || 0;\r\n if (this.centralPointMode == 'firstPoint') {\r\n clusterLon = groupPoints[0]?.lon || 0;\r\n clusterLat = groupPoints[0]?.lat || 0;\r\n clusterHeight = groupPoints[0]?.height || 0;\r\n }\r\n\r\n if (isLastLevel || groupPoints.length < effectiveThreshold) {\r\n for (const p of groupPoints) {\r\n if (labelCount >= this.displayLimit) break;\r\n this.labelPool.add(p.data, {\r\n id: `point-${p.id}`,\r\n lon: p.lon,\r\n lat: p.lat,\r\n height: p.height,\r\n theme: p.data?.billboard?.[0]?.theme || this.pointTheme,\r\n style: p.style,\r\n });\r\n labelCount++;\r\n }\r\n } else {\r\n if (labelCount >= this.displayLimit) break;\r\n const customClusterTheme = groupPoints[0]?.data?.billboard?.[0]?.theme;\r\n const finalTheme = customClusterTheme || this.clusterTheme;\r\n const clusterId = this.groupByTheme\r\n ? `cluster-${levelIdx}-${lonIdx}-${latIdx}-${groupKey}`\r\n : `cluster-${levelIdx}-${lonIdx}-${latIdx}`;\r\n this.labelPool.add(\r\n {\r\n id: clusterId,\r\n billboard: groupPoints[0]?.data?.billboard || [],\r\n count: groupPoints.length,\r\n gridKey: key,\r\n points: groupPoints,\r\n aggregationGroup: groupKey,\r\n },\r\n {\r\n id: clusterId,\r\n lon: clusterLon,\r\n lat: clusterLat,\r\n height: clusterHeight,\r\n theme: finalTheme,\r\n },\r\n );\r\n labelCount++;\r\n }\r\n }\r\n\r\n if (this.debugCurrentGrids) {\r\n const tileLevelForDebug = this.levels[levelIdx].level;\r\n this._drawDebugGrid(\r\n west,\r\n south,\r\n east,\r\n north,\r\n `L:${tileLevelForDebug} X:${lonIdx} Y:${latIdx}`,\r\n );\r\n }\r\n };\r\n\r\n try {\r\n const globe = this.viewer.scene && this.viewer.scene.globe;\r\n const surface = globe && (globe as any)._surface;\r\n let tiles: any[] | undefined;\r\n if (surface) {\r\n tiles =\r\n (surface as any)._tilesToRender || (surface as any)._tilesToRenderByTextureCount;\r\n }\r\n if (!tiles || tiles.length === 0) {\r\n for (const p of this.points) {\r\n if (labelCount >= this.displayLimit) break;\r\n if (p.data?.show === false) continue;\r\n this.labelPool.add(p.data, {\r\n id: `point-${p.id}`,\r\n lon: p.lon,\r\n lat: p.lat,\r\n height: p.height,\r\n theme: p.data?.billboard?.[0]?.theme || this.pointTheme,\r\n style: (p as any).style,\r\n });\r\n labelCount++;\r\n }\r\n this.labelPool.cleanup();\r\n if (this.points.length > 0 && this._tilesRetryCount < this._tilesRetryMax) {\r\n this._tilesRetryCount++;\r\n this._scheduleUpdate();\r\n }\r\n return;\r\n }\r\n this._tilesRetryCount = 0;\r\n\r\n const visited = new Set<string>();\r\n for (const t of tiles) {\r\n const rect = t.rectangle;\r\n const tileLevel = t._level ?? t.level;\r\n if (!rect || typeof tileLevel !== 'number') continue;\r\n\r\n let levelIdx = this.levelIndexByTileLevel.get(tileLevel);\r\n if (levelIdx === undefined) {\r\n if (this.levels.length === 0) continue;\r\n const minDefinedLevel = this.levels[0].level;\r\n const maxDefinedLevel = this.levels[this.levels.length - 1].level;\r\n if (tileLevel > maxDefinedLevel) {\r\n levelIdx = this.levels.length - 1;\r\n } else if (tileLevel < minDefinedLevel) {\r\n levelIdx = 0;\r\n } else {\r\n let nearestIndex = 0;\r\n let minDiff = Infinity;\r\n for (let i = 0; i < this.levels.length; i++) {\r\n const diff = Math.abs(this.levels[i].level - tileLevel);\r\n if (diff < minDiff) {\r\n minDiff = diff;\r\n nearestIndex = i;\r\n }\r\n }\r\n levelIdx = nearestIndex;\r\n }\r\n }\r\n if (levelIdx === undefined) continue;\r\n const targetTileLevel = this.levels[levelIdx].level;\r\n\r\n const tileX = (t as any)._x ?? (t as any).x;\r\n const tileY = (t as any)._y ?? (t as any).y;\r\n\r\n if (typeof tileX === 'number' && typeof tileY === 'number') {\r\n let lonIdx = tileX;\r\n let latIdx = tileY;\r\n\r\n const diff = tileLevel - targetTileLevel;\r\n if (diff > 0) {\r\n const factor = 1 << diff;\r\n lonIdx = Math.floor(tileX / factor);\r\n latIdx = Math.floor(tileY / factor);\r\n } else if (diff < 0) {\r\n const factor = 1 << -diff;\r\n lonIdx = tileX * factor;\r\n latIdx = tileY * factor;\r\n }\r\n\r\n const key = `${targetTileLevel}_${lonIdx}_${latIdx}`;\r\n if (visited.has(key)) continue;\r\n visited.add(key);\r\n processCell(levelIdx, lonIdx, latIdx);\r\n continue;\r\n }\r\n\r\n const level = this.levels[levelIdx];\r\n const size = level.size;\r\n const tileWestDeg = this.Cesium.Math.toDegrees(rect.west);\r\n const tileEastDeg = this.Cesium.Math.toDegrees(rect.east);\r\n const tileSouthDeg = this.Cesium.Math.toDegrees(rect.south);\r\n const tileNorthDeg = this.Cesium.Math.toDegrees(rect.north);\r\n\r\n const westIdx = Math.floor((tileWestDeg - -180) / size);\r\n const eastIdx = Math.floor((tileEastDeg - -180) / size);\r\n const southIdx = Math.floor((tileSouthDeg - -90) / size);\r\n const northIdx = Math.floor((tileNorthDeg - -90) / size);\r\n\r\n for (let lonIdx = westIdx; lonIdx <= eastIdx; lonIdx++) {\r\n for (let latIdx = southIdx; latIdx <= northIdx; latIdx++) {\r\n const key = `${targetTileLevel}_${lonIdx}_${latIdx}`;\r\n if (visited.has(key)) continue;\r\n visited.add(key);\r\n processCell(levelIdx, lonIdx, latIdx);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n this.labelPool.cleanup();\r\n return;\r\n }\r\n this.labelPool.cleanup();\r\n }\r\n\r\n refresh() {\r\n this._update();\r\n }\r\n\r\n private _drawDebugGrid(\r\n west: number,\r\n south: number,\r\n east: number,\r\n north: number,\r\n text: string,\r\n ) {\r\n const rect = this.Cesium.Rectangle.fromDegrees(west, south, east, north);\r\n const entity = this.viewer.entities.add({\r\n rectangle: {\r\n coordinates: rect,\r\n material: this.Cesium.Color.YELLOW.withAlpha(0.2),\r\n outline: true,\r\n outlineColor: this.Cesium.Color.RED,\r\n height: 0,\r\n },\r\n label: {\r\n text,\r\n font: '14px sans-serif',\r\n fillColor: this.Cesium.Color.BLACK,\r\n outlineColor: this.Cesium.Color.WHITE,\r\n outlineWidth: 2,\r\n style: this.Cesium.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: this.Cesium.VerticalOrigin.CENTER,\r\n horizontalOrigin: this.Cesium.HorizontalOrigin.CENTER,\r\n },\r\n });\r\n this.debugGrids.push(entity);\r\n }\r\n\r\n private _clearDebugGrids() {\r\n for (const e of this.debugGrids) {\r\n this.viewer.entities.remove(e);\r\n }\r\n this.debugGrids = [];\r\n }\r\n\r\n public destroy() {\r\n if (this._cameraChangedHandler) {\r\n this.viewer.camera.changed.removeEventListener(this._cameraChangedHandler);\r\n this._cameraChangedHandler = null;\r\n }\r\n const scene = this.viewer.scene;\r\n const globe = scene && scene.globe;\r\n if (globe && this._tileLoadListener) {\r\n (globe as any).tileLoadProgressEvent.removeEventListener(this._tileLoadListener);\r\n this._tileLoadListener = null;\r\n }\r\n if (this._updateTimer !== null) {\r\n clearTimeout(this._updateTimer);\r\n this._updateTimer = null;\r\n }\r\n this.labelPool.reset();\r\n this._clearDebugGrids();\r\n }\r\n}\r\n","export enum MarkerEventKey {\r\n Click = 'marker:click',\r\n DoubleClick = 'marker:dblclick',\r\n RightClick = 'marker:rightclick',\r\n MouseEnter = 'marker:mouseenter',\r\n MouseLeave = 'marker:mouseleave',\r\n MouseDown = 'marker:mousedown',\r\n MouseUp = 'marker:mouseup',\r\n}\r\n\r\ninterface ListenerItem<T = any> {\r\n name: string;\r\n fn: (data: T, event: Event) => void;\r\n once?: boolean;\r\n}\r\n\r\nexport { ListenerItem };\r\n\r\nexport class MarkerEventBus {\r\n private listenerMap = new Map<MarkerEventKey, Map<string, ListenerItem>>();\r\n\r\n /**\r\n * 添加监听器\r\n * @param key 事件 key\r\n * @param listener 监听器项\r\n * @param overwrite 是否覆盖同名监听器\r\n * @returns 是否成功添加\r\n */\r\n addListener(key: MarkerEventKey, listener: ListenerItem, overwrite: boolean = false): boolean {\r\n let map = this.listenerMap.get(key);\r\n if (!map) {\r\n map = new Map();\r\n this.listenerMap.set(key, map);\r\n }\r\n\r\n if (map.has(listener.name)) {\r\n if (overwrite) {\r\n console.warn(\r\n `[MarkerEventBus] Overwriting listener \"${listener.name}\" for event \"${key}\".`,\r\n );\r\n map.set(listener.name, listener);\r\n return true;\r\n } else {\r\n console.warn(\r\n `[MarkerEventBus] Listener \"${listener.name}\" for event \"${key}\" already exists. Use overwrite=true to replace it.`,\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n map.set(listener.name, listener);\r\n return true;\r\n }\r\n\r\n /**\r\n * 移除某个 key 的所有监听器\r\n */\r\n removeListenerByKey(key: MarkerEventKey): boolean {\r\n const existed = this.listenerMap.has(key);\r\n this.listenerMap.set(key, new Map());\r\n return existed;\r\n }\r\n\r\n /**\r\n * 移除某个 key 下的指定名字的监听器\r\n */\r\n removeListenerByKeyAndName(key: MarkerEventKey, name: string): boolean {\r\n const map = this.listenerMap.get(key);\r\n if (!map) return false;\r\n return map.delete(name);\r\n }\r\n\r\n /**\r\n * 运行监听器\r\n */\r\n runListener<T = any>(key: MarkerEventKey, data: T, e: Event) {\r\n const map = this.listenerMap.get(key);\r\n if (!map) return;\r\n\r\n for (const [name, listener] of map.entries()) {\r\n try {\r\n listener.fn(data, e);\r\n } catch (err) {\r\n console.error(`Error in listener \"${name}\" for event \"${key}\":`, err);\r\n }\r\n\r\n if (listener.once) {\r\n map.delete(name);\r\n }\r\n }\r\n }\r\n}\r\n","import { MarkerEventKey, MarkerEventBus } from './MarkerEvent';\r\n\r\n/**\r\n * 单个标签实例\r\n */\r\ninterface LabelInstance {\r\n id: string;\r\n el: HTMLDivElement;\r\n theme: string;\r\n data?: any;\r\n notCreateElement?: boolean;\r\n unload?: any;\r\n}\r\n\r\n/**\r\n * 主题配置项\r\n */\r\ninterface ThemeOptions {\r\n /**\r\n * 创建标签 DOM 内容的方法\r\n */\r\n createElement: (\r\n el: HTMLDivElement,\r\n context: { id: string; theme: string; data: any },\r\n options: ThemeOptions,\r\n ) => any;\r\n\r\n /**\r\n * 可选配置,如偏移量\r\n */\r\n options?: {\r\n offset?: { x?: number; y?: number };\r\n };\r\n}\r\n\r\n/**\r\n * 标签添加时的参数\r\n */\r\ninterface LabelOptions {\r\n id: string;\r\n lon: number;\r\n lat: number;\r\n height?: number;\r\n theme: string;\r\n show?: boolean;\r\n notCreateElement?: boolean;\r\n style?: {\r\n [key: string]: string;\r\n };\r\n}\r\n\r\nexport { LabelOptions, LabelInstance, ThemeOptions };\r\n\r\n/**\r\n * 自定义事件与 DOM 事件的映射\r\n */\r\nexport const DOM_EVENT_MAP: Record<MarkerEventKey, keyof HTMLElementEventMap> = {\r\n [MarkerEventKey.Click]: 'click',\r\n [MarkerEventKey.DoubleClick]: 'dblclick',\r\n [MarkerEventKey.RightClick]: 'contextmenu',\r\n [MarkerEventKey.MouseEnter]: 'mouseenter',\r\n [MarkerEventKey.MouseLeave]: 'mouseleave',\r\n [MarkerEventKey.MouseDown]: 'mousedown',\r\n [MarkerEventKey.MouseUp]: 'mouseup',\r\n};\r\n\r\n/**\r\n * 用于管理 Cesium HTML 标签的池,支持主题渲染、事件分发、动态更新等功能\r\n */\r\nexport class HtmlOverlayLabelPool {\r\n private viewer: any;\r\n private Cesium: any;\r\n private container: HTMLDivElement;\r\n private labels: Map<string, LabelInstance> = new Map();\r\n private activeIds: Set<string> = new Set();\r\n private _updateFn: () => void;\r\n private themes: Record<string, ThemeOptions> = {};\r\n public eventBus: MarkerEventBus;\r\n public openWheel = true;\r\n /**\r\n * 构造函数\r\n * @param Cesium Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param containerId HTML 容器 ID(默认:\"html-label-container\")\r\n * @param eventBus 可选:自定义事件总线\r\n */\r\n constructor(\r\n Cesium: any,\r\n viewer: any,\r\n containerId: string = 'html-label-container',\r\n eventBus?: MarkerEventBus,\r\n openWheel: boolean = true,\r\n ) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n this.container = this._createContainer(containerId);\r\n this._updateFn = this._update.bind(this);\r\n this.viewer.scene.postRender.addEventListener(this._updateFn);\r\n this.eventBus = eventBus || new MarkerEventBus();\r\n this.openWheel = openWheel;\r\n }\r\n\r\n /**\r\n * 创建标签容器\r\n */\r\n private _createContainer(id: string): HTMLDivElement {\r\n let container = document.getElementById(id) as HTMLDivElement;\r\n if (!container) {\r\n container = document.createElement('div');\r\n container.id = id;\r\n Object.assign(container.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n pointerEvents: 'none',\r\n width: '100%',\r\n height: '100%',\r\n zIndex: '100',\r\n overflow: 'hidden',\r\n });\r\n document.body.appendChild(container);\r\n }\r\n return container;\r\n }\r\n\r\n /**\r\n * 注册标签主题\r\n */\r\n registerTheme(themeName: string, options: ThemeOptions) {\r\n this.themes[themeName] = options;\r\n }\r\n\r\n /**\r\n * 添加单个标签\r\n */\r\n add(data: any, options: LabelOptions) {\r\n const {\r\n id,\r\n lon,\r\n lat,\r\n height = 0,\r\n theme,\r\n show = true,\r\n notCreateElement = false,\r\n style,\r\n } = options;\r\n\r\n const themeOptions = this.themes[theme];\r\n if (!themeOptions) {\r\n console.warn(`Theme \"${theme}\" not registered`);\r\n return;\r\n }\r\n\r\n let label = this.labels.get(id);\r\n if (!label) {\r\n const el = document.createElement('div');\r\n Object.assign(el.style, {\r\n position: 'absolute',\r\n transform: 'translate(0, 0)',\r\n pointerEvents: 'auto',\r\n ...(options.style || {}),\r\n });\r\n\r\n // 绑定 DOM 事件到事件总线\r\n for (const [key, domEvent] of Object.entries(DOM_EVENT_MAP)) {\r\n el.addEventListener(domEvent, (e: Event) => {\r\n e.stopPropagation();\r\n const labelData = this.labels.get(id);\r\n this.eventBus.runListener(key as MarkerEventKey, labelData, e);\r\n });\r\n\r\n // 滚轮期间禁止点击\r\n let lastTime = 0;\r\n el.addEventListener('wheel', (event) => {\r\n if (!this.openWheel) return;\r\n const dom = event.currentTarget as HTMLElement;\r\n lastTime = Date.now();\r\n const currTime = lastTime;\r\n dom.style.pointerEvents = 'none';\r\n setTimeout(() => {\r\n if (lastTime === currTime) {\r\n dom.style.pointerEvents = 'auto';\r\n }\r\n }, 2000);\r\n });\r\n }\r\n\r\n let unload = null;\r\n if (!notCreateElement || show) {\r\n try {\r\n unload = themeOptions.createElement(el, { id, theme, data }, themeOptions) || {};\r\n } catch (err) {\r\n console.error(`Error updating label element for id \"${id}\":`, err);\r\n }\r\n this.container.appendChild(el);\r\n }\r\n label = { id, el, theme, data, notCreateElement, unload: unload };\r\n this.labels.set(id, label);\r\n } else {\r\n label.theme = theme;\r\n label.data = data;\r\n label.notCreateElement = notCreateElement;\r\n\r\n // 若已存在,则更新 DOM 内容\r\n try {\r\n label.unload = themeOptions.createElement(label.el, { id, theme, data }, themeOptions);\r\n if (!notCreateElement || show) {\r\n this.container.appendChild(label.el);\r\n }\r\n } catch (err) {\r\n console.error(`Error updating label element for id \"${id}\":`, err);\r\n }\r\n }\r\n\r\n // 存储坐标用于后续位置更新\r\n label.el.dataset.lon = String(lon);\r\n label.el.dataset.lat = String(lat);\r\n label.el.dataset.height = String(height);\r\n\r\n label.el.style.zIndex = style?.zIndex || '1';\r\n label.el.style.display = show ? 'block' : 'none';\r\n if (show) {\r\n this.activeIds.add(id);\r\n }\r\n }\r\n\r\n /**\r\n * 批量添加标签\r\n */\r\n addBatch(items: Array<{ data: any; options: LabelOptions }>) {\r\n for (const { data, options } of items) {\r\n this.add(data, options);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 批量移除标签\r\n */\r\n removeByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n this.unloadByLabel(label);\r\n this.labels.delete(id);\r\n this.activeIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n unloadByLabel(label: LabelInstance) {\r\n label.el.remove();\r\n if (label?.unload && typeof label.unload === 'function') label?.unload();\r\n label.unload = null;\r\n }\r\n\r\n /**\r\n * 移除所有标签\r\n */\r\n removeAll() {\r\n for (const label of this.labels.values()) {\r\n this.unloadByLabel(label);\r\n }\r\n this.labels.clear();\r\n this.activeIds.clear();\r\n }\r\n\r\n /**\r\n * 更新标签的数据并刷新内容\r\n */\r\n update(id: string, newData: any) {\r\n const label = this.labels.get(id);\r\n if (!label) {\r\n console.warn(`Label with id \"${id}\" not found for update.`);\r\n return;\r\n }\r\n\r\n const theme = this.themes[label.theme];\r\n if (!theme) {\r\n console.warn(`Theme \"${label.theme}\" not registered.`);\r\n return;\r\n }\r\n\r\n try {\r\n theme.createElement(label.el, { id, theme: label.theme, data: newData }, theme);\r\n } catch (err) {\r\n console.error(`Failed to update label \"${id}\":`, err);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 批量隐藏标签\r\n */\r\n hideByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏所有标签\r\n */\r\n hideAll() {\r\n for (const label of this.labels.values()) {\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(label.id);\r\n }\r\n }\r\n\r\n /**\r\n * 条件过滤隐藏标签\r\n */\r\n hideFilter(filter: (data: any) => boolean) {\r\n for (const label of this.labels.values()) {\r\n if (!filter(label.data)) continue;\r\n if (label.notCreateElement) {\r\n this.unloadByLabel(label);\r\n }\r\n label.el.style.display = 'none';\r\n this.activeIds.delete(label.id);\r\n }\r\n }\r\n\r\n /**\r\n * 根据 ID 显示标签\r\n */\r\n showByIds(ids: string[]) {\r\n for (const id of ids) {\r\n const label = this.labels.get(id);\r\n if (label) {\r\n if (label.notCreateElement || !label.el.parentNode) {\r\n this.container.appendChild(label.el);\r\n }\r\n if (!label.unload) {\r\n try {\r\n const themeOptions = this.themes[label.theme];\r\n if (!themeOptions) {\r\n console.warn(`Theme \"${label.theme}\" not registered`);\r\n return;\r\n }\r\n label.unload =\r\n themeOptions.createElement(\r\n label.el,\r\n { id, theme: label.theme, data: label.data },\r\n themeOptions,\r\n ) || {};\r\n } catch (err) {\r\n console.error(`Error creating label element for theme \"${label.theme}\":`, err);\r\n return;\r\n }\r\n }\r\n\r\n label.el.style.display = 'block';\r\n this.activeIds.add(id);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 检查标签是否存在\r\n */\r\n has(id: string): boolean {\r\n return this.labels.has(id);\r\n }\r\n\r\n /**\r\n * 清空活跃 ID 列表(不影响 DOM)\r\n */\r\n reset() {\r\n for (const id of this.activeIds.values()) {\r\n let label = this.labels.get(id);\r\n label && this.unloadByLabel(label);\r\n }\r\n this.activeIds.clear();\r\n }\r\n\r\n /**\r\n * 清理当前未活跃的标签(隐藏而不移除 DOM)\r\n */\r\n cleanup() {\r\n for (const [id, label] of this.labels.entries()) {\r\n if (!this.activeIds.has(id)) {\r\n label.el.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 经纬度 -> 自动地形高度修正 -> Cartesian3 -> 屏幕坐标\r\n */\r\n async toWindowPositionByLonLat(lon: number, lat: number): Promise<any> {\r\n const Cesium = this.Cesium;\r\n const scene = this.viewer.scene;\r\n\r\n // 1. 经纬度列表\r\n const positions = [Cesium.Cartographic.fromDegrees(lon, lat)];\r\n\r\n // 2. 使用 clampToHeightMostDetailed 获取真实地形高度\r\n let heightResult;\r\n try {\r\n heightResult = await scene.clampToHeightMostDetailed(positions);\r\n } catch (e) {\r\n console.warn('clampToHeightMostDetailed failed, fallback to ellipsoid height.');\r\n }\r\n\r\n let finalHeight = 0;\r\n if (heightResult && heightResult[0] && heightResult[0].height != null) {\r\n finalHeight = heightResult[0].height; // 用户偏好:height[0].height\r\n } else {\r\n // 如果地形未开启,则 fallback 椭球高度\r\n finalHeight = 0;\r\n }\r\n\r\n // 3. 生成真实位置 Cartesian3\r\n const worldPos = Cesium.Cartesian3.fromDegrees(lon, lat, finalHeight);\r\n\r\n // 4. 转屏幕像素坐标\r\n return this.toWindowCoordinates(worldPos);\r\n }\r\n\r\n /**\r\n * 坐标转换:经纬度 -> 屏幕像素坐标\r\n */\r\n toWindowCoordinates(position: any): any {\r\n const scene = this.viewer.scene;\r\n const st = this.Cesium.SceneTransforms;\r\n if (typeof st?.wgs84ToWindowCoordinates === 'function') {\r\n return st.wgs84ToWindowCoordinates(scene, position);\r\n }\r\n if (typeof st?.worldToWindowCoordinates === 'function') {\r\n return st.worldToWindowCoordinates(scene, position);\r\n }\r\n\r\n console.warn('No compatible window coordinate transform function found.');\r\n return undefined;\r\n }\r\n\r\n /**\r\n * 每帧刷新所有活跃标签的位置\r\n */\r\n private async _update() {\r\n const scene = this.viewer.scene;\r\n\r\n for (const id of this.activeIds) {\r\n const label = this.labels.get(id);\r\n if (!label) continue;\r\n\r\n const lon = parseFloat(label.el.dataset.lon!);\r\n const lat = parseFloat(label.el.dataset.lat!);\r\n const height = parseFloat(label.el.dataset.height || '0');\r\n\r\n const position = this.Cesium.Cartesian3.fromDegrees(lon, lat, height);\r\n const screenPosition = this.toWindowCoordinates(position);\r\n\r\n if (this.Cesium.defined(screenPosition)) {\r\n const theme = this.themes[label.theme];\r\n const offset = theme.options?.offset || {};\r\n const offsetX = offset.x || 0;\r\n const offsetY = offset.y || 0;\r\n\r\n label.el.style.left = `${screenPosition.x}px`;\r\n label.el.style.top = `${screenPosition.y}px`;\r\n label.el.style.transform = `translate(${offsetX}px, ${offsetY}px)`;\r\n label.el.style.display = 'block';\r\n } else {\r\n label.el.style.display = 'none';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 销毁标签池,清理监听器和 DOM\r\n */\r\n destroy() {\r\n this.viewer.scene.postRender.removeEventListener(this._updateFn);\r\n // this.container.remove();\r\n this.labels.clear();\r\n this.activeIds.clear();\r\n }\r\n}\r\n","export class TooltipManager {\r\n private tooltipEl: HTMLDivElement;\r\n private visible: boolean = false;\r\n private offsetX = 10;\r\n private offsetY = -20;\r\n private onMouseMove: ((e: MouseEvent) => void) | null = null;\r\n\r\n constructor() {\r\n this.tooltipEl = document.createElement(\"div\");\r\n this.tooltipEl.style.position = \"fixed\";\r\n this.tooltipEl.style.pointerEvents = \"none\";\r\n this.tooltipEl.style.zIndex = \"10000\";\r\n this.tooltipEl.style.padding = \"4px 8px\";\r\n this.tooltipEl.style.borderRadius = \"4px\";\r\n this.tooltipEl.style.background = \"rgba(0, 0, 0, 0.7)\";\r\n this.tooltipEl.style.color = \"#fff\";\r\n this.tooltipEl.style.fontSize = \"13px\";\r\n this.tooltipEl.style.transition = \"opacity 0.1s ease\";\r\n this.tooltipEl.style.opacity = \"0\";\r\n\r\n document.body.appendChild(this.tooltipEl);\r\n\r\n this.onMouseMove = (e: MouseEvent) => {\r\n if (!this.visible) return;\r\n this.tooltipEl.style.left = `${e.clientX + this.offsetX}px`;\r\n this.tooltipEl.style.top = `${e.clientY + this.offsetY}px`;\r\n };\r\n\r\n window.addEventListener(\"mousemove\", this.onMouseMove);\r\n }\r\n\r\n show(text: string) {\r\n this.tooltipEl.innerText = text;\r\n this.tooltipEl.style.opacity = \"1\";\r\n this.visible = true;\r\n }\r\n\r\n hide() {\r\n this.tooltipEl.style.opacity = \"0\";\r\n this.visible = false;\r\n }\r\n\r\n destroy() {\r\n if (this.onMouseMove) {\r\n window.removeEventListener(\"mousemove\", this.onMouseMove);\r\n this.onMouseMove = null;\r\n }\r\n if (this.tooltipEl.parentElement) {\r\n this.tooltipEl.parentElement.removeChild(this.tooltipEl);\r\n }\r\n }\r\n}\r\n","import { TooltipManager } from '../../TooltipManager';\r\nimport { DrawOptions, IDrawer, DrawResult } from '../types';\r\n\r\nexport default class PointDrawer implements IDrawer {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private tooltip: TooltipManager | null = null;\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n startDrawing(options: DrawOptions) {\r\n const { Cesium, viewer } = this;\r\n this.tooltip = new TooltipManager();\r\n this.tooltip.show('左键添加点');\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n\r\n this.handler.setInputAction((movement: any) => {\r\n const position = viewer.scene.pickPosition(movement.position);\r\n if (!position) return;\r\n\r\n const cartographic = Cesium.Cartographic.fromCartesian(position);\r\n const lng = Cesium.Math.toDegrees(cartographic.longitude);\r\n const lat = Cesium.Math.toDegrees(cartographic.latitude);\r\n const height = cartographic.height;\r\n\r\n const entity = viewer.entities.add({\r\n position,\r\n point: {\r\n pixelSize: 10,\r\n color: options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n\r\n this.entity = entity;\r\n\r\n const result: DrawResult = {\r\n entity,\r\n position,\r\n lnglat: { lng, lat, height },\r\n clear: () => {\r\n this.clear();\r\n },\r\n };\r\n\r\n options.onComplete?.(result);\r\n\r\n this.stopDrawing();\r\n this.tooltip?.hide();\r\n this.tooltip = null;\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n }\r\n\r\n stopDrawing() {\r\n this.handler?.destroy();\r\n this.handler = null;\r\n }\r\n\r\n clear() {\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n this.stopDrawing();\r\n }\r\n}\r\n","import { DrawOptions, DrawResult, IDrawer } from '../types';\r\nimport { TooltipManager } from '../../TooltipManager';\r\n\r\nexport default class LineDrawer implements IDrawer {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private positions: any[] = [];\r\n private entity: any = null;\r\n private tooltip: TooltipManager | null = null;\r\n private tempPoints: any[] = [];\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n startDrawing(options: DrawOptions) {\r\n const { Cesium, viewer } = this;\r\n this.positions = [];\r\n this.tempPoints = [];\r\n this.tooltip = new TooltipManager();\r\n this.tooltip.show('单击左键添加点,双击左键结束');\r\n\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n\r\n // 左键点击添加点\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n\r\n this.positions.push(pos);\r\n\r\n // 添加点标记\r\n const point = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(point);\r\n\r\n // 第一次点击时初始化线段 entity\r\n if (!this.entity) {\r\n this.entity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => this.positions, false),\r\n width: 3,\r\n material: options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n depthFailMaterial:\r\n options.color?.withAlpha?.(0.5) || Cesium.Color.YELLOW.withAlpha(0.5),\r\n },\r\n });\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n\r\n // 右键完成绘制\r\n this.handler.setInputAction(() => {\r\n this.stopDrawing();\r\n\r\n this.tooltip?.hide();\r\n this.tooltip = null;\r\n\r\n if (this.positions.length < 2) return;\r\n this.positions.length = this.positions.length - 1;\r\n const lnglats = this.positions.map((p) => {\r\n const carto = Cesium.Cartographic.fromCartesian(p);\r\n return {\r\n lng: Cesium.Math.toDegrees(carto.longitude),\r\n lat: Cesium.Math.toDegrees(carto.latitude),\r\n height: carto.height,\r\n };\r\n });\r\n\r\n const result: DrawResult = {\r\n entity: this.entity,\r\n positions: this.positions,\r\n lnglats,\r\n clear: () => {\r\n this.clear();\r\n },\r\n };\r\n\r\n options.onComplete?.(result);\r\n }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\r\n }\r\n\r\n stopDrawing() {\r\n this.handler?.destroy();\r\n this.handler = null;\r\n }\r\n\r\n clear() {\r\n const { viewer } = this;\r\n\r\n if (this.entity) {\r\n viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n\r\n this.tempPoints.forEach((p) => viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n\r\n this.tooltip?.hide();\r\n this.tooltip = null;\r\n\r\n this.positions = [];\r\n this.stopDrawing();\r\n }\r\n}\r\n","import { DrawOptions, DrawResult, IDrawer } from '../types';\r\n\r\nexport default class RectangleDrawer implements IDrawer {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private startPoint: any = null;\r\n private endPoint: any = null;\r\n private entity: any = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n startDrawing(options: DrawOptions) {\r\n const { Cesium, viewer } = this;\r\n\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n\r\n if (!this.startPoint) {\r\n this.startPoint = pos;\r\n\r\n // 初始化实体,使用 CallbackProperty 安全包装\r\n this.entity = viewer.entities.add({\r\n rectangle: {\r\n coordinates: new Cesium.CallbackProperty(() => {\r\n if (!this.startPoint || !this.endPoint) return undefined;\r\n\r\n try {\r\n const c1 = Cesium.Cartographic.fromCartesian(this.startPoint);\r\n const c2 = Cesium.Cartographic.fromCartesian(this.endPoint);\r\n\r\n const west = Math.min(c1.longitude, c2.longitude);\r\n const east = Math.max(c1.longitude, c2.longitude);\r\n const south = Math.min(c1.latitude, c2.latitude);\r\n const north = Math.max(c1.latitude, c2.latitude);\r\n\r\n return new Cesium.Rectangle(west, south, east, north);\r\n } catch (e) {\r\n console.warn('Rectangle calculation error:', e);\r\n return undefined;\r\n }\r\n }, false),\r\n material: options.color || Cesium.Color.YELLOW.withAlpha(0.5),\r\n outline: true,\r\n outlineColor: Cesium.Color.BLACK,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n } else {\r\n this.stopDrawing();\r\n\r\n const c1 = Cesium.Cartographic.fromCartesian(this.startPoint);\r\n const c2 = Cesium.Cartographic.fromCartesian(this.endPoint);\r\n\r\n const sw = {\r\n lng: Cesium.Math.toDegrees(Math.min(c1.longitude, c2.longitude)),\r\n lat: Cesium.Math.toDegrees(Math.min(c1.latitude, c2.latitude)),\r\n height: 0,\r\n };\r\n const ne = {\r\n lng: Cesium.Math.toDegrees(Math.max(c1.longitude, c2.longitude)),\r\n lat: Cesium.Math.toDegrees(Math.max(c1.latitude, c2.latitude)),\r\n height: 0,\r\n };\r\n\r\n const result: DrawResult = {\r\n entity: this.entity,\r\n position: this.startPoint,\r\n lnglat: {\r\n lng: Cesium.Math.toDegrees(c1.longitude),\r\n lat: Cesium.Math.toDegrees(c1.latitude),\r\n height: c1.height,\r\n },\r\n positions: [this.startPoint, this.endPoint],\r\n lnglats: [sw, ne],\r\n clear: () => {\r\n this.clear();\r\n },\r\n };\r\n\r\n options.onComplete?.(result);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n\r\n this.handler.setInputAction((movement: any) => {\r\n if (!this.startPoint) return;\r\n\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (pos) {\r\n this.endPoint = pos;\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stopDrawing() {\r\n this.handler?.destroy();\r\n this.handler = null;\r\n }\r\n\r\n clear() {\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n this.startPoint = null;\r\n this.endPoint = null;\r\n this.stopDrawing();\r\n }\r\n}\r\n","import { DrawOptions, IDrawer } from '../types';\r\n\r\nexport default class CircleDrawer implements IDrawer {\r\n private viewer: any;\r\n private Cesium: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private positions: any[] = [];\r\n private _isDrawing: boolean = false;\r\n private currentRadius: number = 0;\r\n\r\n constructor(CesiumInstance: any, viewerInstance: any) {\r\n this.Cesium = CesiumInstance;\r\n this.viewer = viewerInstance;\r\n }\r\n\r\n public startDrawing(options: DrawOptions): void {\r\n this.clear();\r\n this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.canvas);\r\n this._isDrawing = true;\r\n\r\n // 第一次点击:确定圆心\r\n this.handler.setInputAction((click: any) => {\r\n const position = this.viewer.scene.pickPosition(click.position);\r\n if (!position) return;\r\n\r\n this.positions.push(position);\r\n\r\n // 如果已经有两个点,则绘制最终图形\r\n if (this.positions.length === 2) {\r\n this.stopDrawing();\r\n this.drawFinalCircle(options);\r\n }\r\n }, this.Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n\r\n // 鼠标移动:实时预览圆\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length !== 1) return;\r\n\r\n const center = this.positions[0];\r\n const ray = this.viewer.camera.getPickRay(movement.endPosition);\r\n const edge = this.viewer.scene.globe.pick(ray, this.viewer.scene);\r\n\r\n if (edge) {\r\n this.drawPreviewCircle(center, edge, options);\r\n }\r\n }, this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n private drawPreviewCircle(center: any, edge: any, options: DrawOptions): void {\r\n const radius = this.Cesium.Cartesian3.distance(center, edge);\r\n\r\n // 若未添加 entity,先添加并使用 CallbackProperty\r\n if (!this.entity) {\r\n this.currentRadius = radius;\r\n const dynamicRadius = new this.Cesium.CallbackProperty(() => this.currentRadius, false);\r\n\r\n this.entity = this.viewer.entities.add({\r\n position: center,\r\n ellipse: {\r\n semiMajorAxis: dynamicRadius,\r\n semiMinorAxis: dynamicRadius,\r\n material: options.color || this.Cesium.Color.YELLOW.withAlpha(0.5),\r\n outline: true,\r\n outlineColor: options.color || this.Cesium.Color.YELLOW,\r\n heightReference: this.Cesium.HeightReference.NONE,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n } else {\r\n // 控制最小变动阈值,避免频繁更新\r\n if (Math.abs(this.currentRadius - radius) > 0.5) {\r\n this.currentRadius = radius;\r\n }\r\n }\r\n }\r\n\r\n private drawFinalCircle(options: DrawOptions): void {\r\n const [center, edge] = this.positions;\r\n const radius = this.Cesium.Cartesian3.distance(center, edge);\r\n const centerCarto = this.Cesium.Cartographic.fromCartesian(center);\r\n\r\n const centerLngLat = {\r\n lng: this.Cesium.Math.toDegrees(centerCarto.longitude),\r\n lat: this.Cesium.Math.toDegrees(centerCarto.latitude),\r\n height: centerCarto.height,\r\n };\r\n\r\n const step = options?.step || 1;\r\n const circlePoints: any[] = [];\r\n const circleLnglats: { lng: number; lat: number; height: number }[] = [];\r\n\r\n for (let angle = 0; angle < 360; angle += step) {\r\n const angleRad = this.Cesium.Math.toRadians(angle);\r\n const geodesic = new this.Cesium.EllipsoidGeodesic();\r\n\r\n geodesic.setEndPoints(\r\n centerCarto,\r\n new this.Cesium.Cartographic(\r\n centerCarto.longitude + 0.0001 * Math.cos(angleRad),\r\n centerCarto.latitude + 0.0001 * Math.sin(angleRad),\r\n ),\r\n );\r\n\r\n const interpolated = geodesic.interpolateUsingSurfaceDistance(radius);\r\n const destCartesian = this.Cesium.Ellipsoid.WGS84.cartographicToCartesian(interpolated);\r\n circlePoints.push(destCartesian);\r\n\r\n const carto = this.Cesium.Cartographic.fromCartesian(destCartesian);\r\n circleLnglats.push({\r\n lng: this.Cesium.Math.toDegrees(carto.longitude),\r\n lat: this.Cesium.Math.toDegrees(carto.latitude),\r\n height: carto.height,\r\n });\r\n }\r\n circleLnglats.push(circleLnglats[0]);\r\n const lnglats = this.positions.map((p) => {\r\n const carto = this.Cesium.Cartographic.fromCartesian(p);\r\n return {\r\n lng: this.Cesium.Math.toDegrees(carto.longitude),\r\n lat: this.Cesium.Math.toDegrees(carto.latitude),\r\n height: carto.height,\r\n };\r\n });\r\n\r\n options.onComplete?.({\r\n entity: this.entity,\r\n positions: this.positions,\r\n lnglats,\r\n circlePoints,\r\n circleLnglats,\r\n center: centerLngLat,\r\n radius,\r\n clear: () => {\r\n this.clear();\r\n },\r\n });\r\n }\r\n\r\n public stopDrawing(): void {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n this._isDrawing = false;\r\n }\r\n\r\n public clear(): void {\r\n this.stopDrawing();\r\n\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n\r\n this.positions = [];\r\n this.currentRadius = 0;\r\n }\r\n}\r\n","import { DrawOptions, DrawResult, IDrawer } from '../types';\r\nimport { TooltipManager } from '../../TooltipManager';\r\n\r\nexport default class PolygonDrawer implements IDrawer {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private positions: any[] = [];\r\n private entity: any = null;\r\n private tooltip: TooltipManager | null = null;\r\n private tempPoints: any[] = [];\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n startDrawing(options: DrawOptions) {\r\n const { Cesium, viewer } = this;\r\n this.positions = [];\r\n this.tempPoints = [];\r\n this.tooltip = new TooltipManager();\r\n this.tooltip.show('单击左键添加点,双击左键结束');\r\n\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n\r\n // 左键点击添加点\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n\r\n this.positions.push(pos);\r\n\r\n const point = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n });\r\n this.tempPoints.push(point);\r\n\r\n if (!this.entity) {\r\n this.entity = viewer.entities.add({\r\n polygon: {\r\n hierarchy: new Cesium.CallbackProperty(\r\n () => ({\r\n positions: this.positions,\r\n }),\r\n false,\r\n ),\r\n material: options.color || Cesium.Color.YELLOW.withAlpha(0.5),\r\n },\r\n });\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n\r\n // 右键完成绘制\r\n this.handler.setInputAction(() => {\r\n this.stopDrawing();\r\n this.tooltip?.hide();\r\n this.tooltip = null;\r\n\r\n if (this.positions.length < 3) return;\r\n this.positions.length = this.positions.length - 1;\r\n const lnglats = this.positions.map((p) => {\r\n const carto = Cesium.Cartographic.fromCartesian(p);\r\n return {\r\n lng: Cesium.Math.toDegrees(carto.longitude),\r\n lat: Cesium.Math.toDegrees(carto.latitude),\r\n height: carto.height,\r\n };\r\n });\r\n\r\n const result: DrawResult = {\r\n entity: this.entity,\r\n positions: this.positions,\r\n lnglats,\r\n clear: () => {\r\n this.clear();\r\n },\r\n };\r\n\r\n options.onComplete?.(result);\r\n }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\r\n }\r\n\r\n stopDrawing() {\r\n this.handler?.destroy();\r\n this.handler = null;\r\n }\r\n\r\n clear() {\r\n const { viewer } = this;\r\n\r\n if (this.entity) {\r\n viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n\r\n this.tempPoints.forEach((p) => viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n\r\n this.tooltip?.hide();\r\n this.tooltip = null;\r\n\r\n this.positions = [];\r\n this.stopDrawing();\r\n }\r\n}\r\n","import { DrawType, DrawOptions, IDrawer } from './types';\r\nimport PointDrawer from './handlers/PointDrawer';\r\nimport LineDrawer from './handlers/LineDrawer';\r\nimport RectangleDrawer from './handlers/RectangleDrawer';\r\nimport CircleDrawer from './handlers/CircleDrawer';\r\nimport PolygonDrawer from './handlers/PolygonDrawer';\r\n\r\nexport class DrawTool {\r\n private viewer;\r\n private Cesium;\r\n private activeDrawer: IDrawer | null = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.viewer = viewer;\r\n this.Cesium = Cesium;\r\n }\r\n\r\n draw(type: DrawType, options: DrawOptions) {\r\n this.clear();\r\n\r\n switch (type) {\r\n case 'point':\r\n this.activeDrawer = new PointDrawer(this.Cesium, this.viewer);\r\n break;\r\n case 'line':\r\n this.activeDrawer = new LineDrawer(this.Cesium, this.viewer);\r\n break;\r\n case 'rectangle':\r\n this.activeDrawer = new RectangleDrawer(this.Cesium, this.viewer);\r\n break;\r\n case 'circle':\r\n this.activeDrawer = new CircleDrawer(this.Cesium, this.viewer);\r\n break;\r\n case 'polygon':\r\n this.activeDrawer = new PolygonDrawer(this.Cesium, this.viewer);\r\n break;\r\n default:\r\n throw new Error(`Unsupported draw type: ${type}`);\r\n }\r\n\r\n this.activeDrawer?.startDrawing(options);\r\n }\r\n\r\n clear() {\r\n if (this.activeDrawer) {\r\n this.activeDrawer.stopDrawing();\r\n this.activeDrawer.clear();\r\n this.activeDrawer = null;\r\n }\r\n }\r\n\r\n cancel() {\r\n this.clear();\r\n }\r\n}\r\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nexport default isArray;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","import baseGetTag from './_baseGetTag.js';\nimport isObject from './isObject.js';\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nexport default isFunction;\n","import root from './_root.js';\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nexport default coreJsData;\n","import coreJsData from './_coreJsData.js';\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nexport default isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nexport default toSource;\n","import isFunction from './isFunction.js';\nimport isMasked from './_isMasked.js';\nimport isObject from './isObject.js';\nimport toSource from './_toSource.js';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nexport default baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nexport default getValue;\n","import baseIsNative from './_baseIsNative.js';\nimport getValue from './_getValue.js';\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nexport default getNative;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nexport default WeakMap;\n","import isObject from './isObject.js';\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nexport default baseCreate;\n","import getNative from './_getNative.js';\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nexport default defineProperty;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nexport default arrayEach;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nexport default isIndex;\n","import defineProperty from './_defineProperty.js';\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nexport default baseAssignValue;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nexport default eq;\n","import baseAssignValue from './_baseAssignValue.js';\nimport eq from './eq.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nexport default assignValue;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nexport default isLength;\n","import isFunction from './isFunction.js';\nimport isLength from './isLength.js';\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nexport default isArrayLike;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nexport default isPrototype;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nexport default baseTimes;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nexport default baseIsArguments;\n","import baseIsArguments from './_baseIsArguments.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nexport default isArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nexport default stubFalse;\n","import root from './_root.js';\nimport stubFalse from './stubFalse.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nexport default isBuffer;\n","import baseGetTag from './_baseGetTag.js';\nimport isLength from './isLength.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nexport default baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nexport default baseUnary;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nexport default nodeUtil;\n","import baseIsTypedArray from './_baseIsTypedArray.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nexport default isTypedArray;\n","import baseTimes from './_baseTimes.js';\nimport isArguments from './isArguments.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isIndex from './_isIndex.js';\nimport isTypedArray from './isTypedArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default arrayLikeKeys;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nexport default overArg;\n","import overArg from './_overArg.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nexport default nativeKeys;\n","import isPrototype from './_isPrototype.js';\nimport nativeKeys from './_nativeKeys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nexport default baseKeys;\n","import arrayLikeKeys from './_arrayLikeKeys.js';\nimport baseKeys from './_baseKeys.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nexport default keys;\n","import getNative from './_getNative.js';\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nexport default nativeCreate;\n","import nativeCreate from './_nativeCreate.js';\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nexport default hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default hashDelete;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nexport default hashGet;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nexport default hashHas;\n","import nativeCreate from './_nativeCreate.js';\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nexport default hashSet;\n","import hashClear from './_hashClear.js';\nimport hashDelete from './_hashDelete.js';\nimport hashGet from './_hashGet.js';\nimport hashHas from './_hashHas.js';\nimport hashSet from './_hashSet.js';\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nexport default Hash;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nexport default listCacheClear;\n","import eq from './eq.js';\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nexport default assocIndexOf;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nexport default listCacheDelete;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nexport default listCacheGet;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nexport default listCacheHas;\n","import assocIndexOf from './_assocIndexOf.js';\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nexport default listCacheSet;\n","import listCacheClear from './_listCacheClear.js';\nimport listCacheDelete from './_listCacheDelete.js';\nimport listCacheGet from './_listCacheGet.js';\nimport listCacheHas from './_listCacheHas.js';\nimport listCacheSet from './_listCacheSet.js';\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nexport default ListCache;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nexport default Map;\n","import Hash from './_Hash.js';\nimport ListCache from './_ListCache.js';\nimport Map from './_Map.js';\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nexport default mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nexport default isKeyable;\n","import isKeyable from './_isKeyable.js';\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nexport default getMapData;\n","import getMapData from './_getMapData.js';\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nexport default mapCacheDelete;\n","import getMapData from './_getMapData.js';\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nexport default mapCacheGet;\n","import getMapData from './_getMapData.js';\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nexport default mapCacheHas;\n","import getMapData from './_getMapData.js';\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nexport default mapCacheSet;\n","import mapCacheClear from './_mapCacheClear.js';\nimport mapCacheDelete from './_mapCacheDelete.js';\nimport mapCacheGet from './_mapCacheGet.js';\nimport mapCacheHas from './_mapCacheHas.js';\nimport mapCacheSet from './_mapCacheSet.js';\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nexport default MapCache;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nexport default arrayPush;\n","import overArg from './_overArg.js';\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nexport default getPrototype;\n","import ListCache from './_ListCache.js';\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nexport default stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nexport default stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nexport default stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nexport default stackHas;\n","import ListCache from './_ListCache.js';\nimport Map from './_Map.js';\nimport MapCache from './_MapCache.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nexport default stackSet;\n","import ListCache from './_ListCache.js';\nimport stackClear from './_stackClear.js';\nimport stackDelete from './_stackDelete.js';\nimport stackGet from './_stackGet.js';\nimport stackHas from './_stackHas.js';\nimport stackSet from './_stackSet.js';\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nexport default Stack;\n","import root from './_root.js';\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nexport default cloneBuffer;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nexport default arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nexport default stubArray;\n","import arrayFilter from './_arrayFilter.js';\nimport stubArray from './stubArray.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nexport default getSymbols;\n","import arrayPush from './_arrayPush.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nexport default baseGetAllKeys;\n","import baseGetAllKeys from './_baseGetAllKeys.js';\nimport getSymbols from './_getSymbols.js';\nimport keys from './keys.js';\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nexport default getAllKeys;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nexport default DataView;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nexport default Promise;\n","import getNative from './_getNative.js';\nimport root from './_root.js';\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nexport default Set;\n","import DataView from './_DataView.js';\nimport Map from './_Map.js';\nimport Promise from './_Promise.js';\nimport Set from './_Set.js';\nimport WeakMap from './_WeakMap.js';\nimport baseGetTag from './_baseGetTag.js';\nimport toSource from './_toSource.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nexport default getTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nexport default initCloneArray;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nexport default Uint8Array;\n","import Uint8Array from './_Uint8Array.js';\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nexport default cloneArrayBuffer;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nexport default cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nexport default cloneRegExp;\n","import Symbol from './_Symbol.js';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nexport default cloneSymbol;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nexport default cloneTypedArray;\n","import cloneArrayBuffer from './_cloneArrayBuffer.js';\nimport cloneDataView from './_cloneDataView.js';\nimport cloneRegExp from './_cloneRegExp.js';\nimport cloneSymbol from './_cloneSymbol.js';\nimport cloneTypedArray from './_cloneTypedArray.js';\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nexport default initCloneByTag;\n","import baseCreate from './_baseCreate.js';\nimport getPrototype from './_getPrototype.js';\nimport isPrototype from './_isPrototype.js';\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nexport default initCloneObject;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nexport default baseIsMap;\n","import baseIsMap from './_baseIsMap.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nexport default isMap;\n","import getTag from './_getTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nexport default baseIsSet;\n","import baseIsSet from './_baseIsSet.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nexport default isSet;\n","import Stack from './_Stack.js';\nimport arrayEach from './_arrayEach.js';\nimport assignValue from './_assignValue.js';\nimport baseAssign from './_baseAssign.js';\nimport baseAssignIn from './_baseAssignIn.js';\nimport cloneBuffer from './_cloneBuffer.js';\nimport copyArray from './_copyArray.js';\nimport copySymbols from './_copySymbols.js';\nimport copySymbolsIn from './_copySymbolsIn.js';\nimport getAllKeys from './_getAllKeys.js';\nimport getAllKeysIn from './_getAllKeysIn.js';\nimport getTag from './_getTag.js';\nimport initCloneArray from './_initCloneArray.js';\nimport initCloneByTag from './_initCloneByTag.js';\nimport initCloneObject from './_initCloneObject.js';\nimport isArray from './isArray.js';\nimport isBuffer from './isBuffer.js';\nimport isMap from './isMap.js';\nimport isObject from './isObject.js';\nimport isSet from './isSet.js';\nimport keys from './keys.js';\nimport keysIn from './keysIn.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nexport default baseClone;\n","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nexport default cloneDeep;\n","import { isArray } from 'lodash-es';\r\n\r\nexport enum EditMode {\r\n Rotate = 'rotate',\r\n Move = 'move',\r\n Scale = 'scale',\r\n MoveHeight = 'moveHeight',\r\n Empty = '',\r\n}\r\n\r\nexport enum GLTFManageEventKey {\r\n Scale = 'addScale',\r\n Rotate = 'rotate',\r\n Translation = 'translation',\r\n Remove = 'removeById',\r\n Add = 'add',\r\n}\r\nexport class GLTFManage {\r\n primitives = new Map<string, any>();\r\n eventListener = new Map<string, Array<Object>>();\r\n Cesium: any;\r\n viewer: any;\r\n handler: any;\r\n rotationRing: any;\r\n translationSquare: any;\r\n heightArrow: any;\r\n editMode: EditMode = EditMode.Empty; // 默认是移动模式\r\n dragEndCallbackMap = new Map<string, any>();\r\n\r\n constructor(options: { Cesium: any; viewer: any }) {\r\n this.Cesium = options.Cesium;\r\n this.viewer = options.viewer;\r\n this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);\r\n }\r\n\r\n /**\r\n * @description: 初始化模型\r\n * @param {Array<any>} models 模型数据列表\r\n * @return {*}\r\n */\r\n init(models: Array<any>, show = false) {\r\n const viewer = this.viewer;\r\n // 移除现有的所有模型\r\n this.primitives.forEach((gltf) => {\r\n viewer.scene.primitives.remove(gltf);\r\n });\r\n\r\n // 遍历传入的模型数据并添加到场景中\r\n models.forEach((model: any) => {\r\n if (!this.primitives.has(model.id)) {\r\n this.add(model, show); // 调用 add 方法添加模型\r\n }\r\n });\r\n }\r\n get(id: string) {\r\n return this.primitives.get(id);\r\n }\r\n\r\n /**\r\n * @description: 添加模型\r\n * @param {*} info 模型信息\r\n * @return {*}\r\n */\r\n add(info: any, show = true) {\r\n const viewer = this.viewer;\r\n const Cesium = this.Cesium;\r\n // 转换 Heading, Pitch, Roll 为弧度\r\n const newHeading = Cesium.Math.toRadians(info.headingPitchRoll?.heading || 0);\r\n const newPitch = Cesium.Math.toRadians(info.headingPitchRoll?.pitch || 0);\r\n const newRoll = Cesium.Math.toRadians(info.headingPitchRoll?.roll || 0);\r\n const headingPitchRoll = new Cesium.HeadingPitchRoll(newHeading, newPitch, newRoll);\r\n\r\n // 计算模型的模型矩阵\r\n const modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(\r\n info.position,\r\n headingPitchRoll,\r\n viewer.scene.globe.ellipsoid,\r\n Cesium.Transforms.eastNorthUpToFixedFrame,\r\n new Cesium.Matrix4(),\r\n );\r\n\r\n // 创建模型并添加到场景\r\n let gltf = viewer.scene.primitives.add(\r\n Cesium.Model.fromGltf({\r\n id: info.id,\r\n ...info.model, // 模型的地址\r\n modelMatrix,\r\n }),\r\n );\r\n gltf.scale = info.scale || 1; // 设置缩放\r\n this.primitives.set(info.id, gltf); // 存储在 primitives 中\r\n gltf.show = show;\r\n // 触发 add 事件监听\r\n this.runEventListener(GLTFManageEventKey.Add, { info: info, gltf: gltf });\r\n }\r\n\r\n flyTo(id: string) {\r\n const viewer = this.viewer;\r\n const Cesium = this.Cesium;\r\n let model = this.primitives.get(id);\r\n const boundingSphere = model.boundingSphere;\r\n\r\n // 如果模型有模型矩阵,转换到世界坐标\r\n const center = Cesium.Matrix4.multiplyByPoint(\r\n model.modelMatrix,\r\n boundingSphere.center,\r\n new Cesium.Cartesian3(),\r\n );\r\n\r\n // 创建世界坐标下的包围球\r\n const worldBoundingSphere = new Cesium.BoundingSphere(center, boundingSphere.radius);\r\n\r\n // 摄像机飞到模型位置\r\n viewer.camera.flyToBoundingSphere(worldBoundingSphere, {\r\n duration: 1.5, // 飞行时间\r\n offset: new Cesium.HeadingPitchRange(0, -0.5, boundingSphere.radius * 2.0), // 调整视角\r\n });\r\n }\r\n\r\n /**\r\n * @description: 根据模型的 ID 移除模型\r\n * @param {string} id 模型的 ID\r\n * @return {*}\r\n */\r\n removeById(id: string) {\r\n const viewer = this.viewer;\r\n let g = this.primitives.get(id); // 获取对应 ID 的模型\r\n\r\n if (!g) {\r\n console.error(`No model found with id: ${id}`);\r\n return;\r\n }\r\n\r\n // 从场景中移除模型\r\n viewer.scene.primitives.remove(g);\r\n this.primitives.delete(id); // 从 primitives 中删除模型\r\n if (!this.rotationRing?._instanceIds.includes(`rotationRing_${id}`) || !this.rotationRing) {\r\n this.removeTool();\r\n }\r\n // 触发 removeById 事件监听\r\n this.runEventListener(GLTFManageEventKey.Remove, { id: id, gltf: g });\r\n }\r\n\r\n // 显示模型\r\n show(id: string) {\r\n let g = this.primitives.get(id); // 获取对应 ID 的模型\r\n if (g) g.show = true;\r\n }\r\n // 隐藏模型\r\n hide(id: string) {\r\n let g = this.primitives.get(id); // 获取对应 ID 的模型\r\n if (g) g.show = false;\r\n }\r\n\r\n /**\r\n * @description: 修改模型的缩放因子\r\n * @param {*} info 模型信息\r\n * @param {number} num 缩放因子\r\n * @return {*}\r\n */\r\n addScale(info: any, num = 0.1) {\r\n let curModel = this.primitives.get(info.id); // 获取对应 ID 的模型\r\n\r\n if (curModel) {\r\n curModel.scale = curModel.scale + num; // 增加或减少模型的缩放因子\r\n this.updatedTool(curModel.modelMatrix);\r\n this.runEventListener(GLTFManageEventKey.Scale, { id: info.id, scale: curModel.scale }); // 触发 addScale 事件监听\r\n }\r\n }\r\n /**\r\n * @description: 修改模型的缩放因子\r\n * @param {*} info 模型信息\r\n * @param {number} num 缩放因子\r\n * @return {*}\r\n */\r\n setScale(id: any, scale = 0.1) {\r\n let curModel = this.primitives.get(id); // 获取对应 ID 的模型\r\n if (curModel) {\r\n curModel.scale = scale; // 增加或减少模型的缩放因子\r\n this.updatedTool(curModel.modelMatrix);\r\n this.runEventListener(GLTFManageEventKey.Scale, { id: id, scale: curModel.scale }); // 触发 addScale 事件监听\r\n }\r\n }\r\n\r\n setEditMode(mode: EditMode) {\r\n this.editMode = mode;\r\n }\r\n // 公共锁定/解锁视角函数\r\n lockCamera() {\r\n const cameraController = this.viewer.scene.screenSpaceCameraController;\r\n cameraController.enableRotate = false;\r\n cameraController.enableTranslate = false;\r\n cameraController.enableZoom = false;\r\n }\r\n\r\n unlockCamera() {\r\n const cameraController = this.viewer.scene.screenSpaceCameraController;\r\n cameraController.enableRotate = true;\r\n cameraController.enableTranslate = true;\r\n cameraController.enableZoom = true;\r\n }\r\n\r\n // 公共函数:将世界坐标转换为经纬度(忽略高度)\r\n toCartographic(cartesian: any) {\r\n const cartographic = this.Cesium.Cartographic.fromCartesian(cartesian);\r\n return { longitude: cartographic.longitude, latitude: cartographic.latitude };\r\n }\r\n\r\n // 公共函数:计算两点之间的方向角\r\n calculateHeading(from: any, to: any): number {\r\n const deltaLongitude = to.longitude - from.longitude;\r\n const deltaLatitude = to.latitude - from.latitude;\r\n return Math.atan2(deltaLatitude, deltaLongitude);\r\n }\r\n\r\n /**\r\n * @description: 获取模型的 Heading, Pitch, Roll\r\n * @param {any} modelMatrix 模型的变换矩阵\r\n * @return {*}\r\n */\r\n getModelHeadingPitchRoll(modelMatrix: any) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n\r\n const m1 = Cesium.Transforms.eastNorthUpToFixedFrame(\r\n Cesium.Matrix4.getTranslation(modelMatrix, new Cesium.Cartesian3()),\r\n viewer.scene.globe.ellipsoid,\r\n new Cesium.Matrix4(),\r\n );\r\n\r\n const m2 = Cesium.Matrix4.multiply(\r\n Cesium.Matrix4.inverse(m1, new Cesium.Matrix4()),\r\n modelMatrix,\r\n new Cesium.Matrix4(),\r\n );\r\n\r\n const mat3 = Cesium.Matrix4.getRotation(m2, new Cesium.Matrix3());\r\n const q = Cesium.Quaternion.fromRotationMatrix(mat3);\r\n return Cesium.HeadingPitchRoll.fromQuaternion(q); // 返回 HeadingPitchRoll\r\n }\r\n\r\n /**\r\n * @description: 添加事件监听\r\n * @param {string} key\r\n * @param {Function} f\r\n * @param {any} options\r\n * @return {*}\r\n */\r\n addEventListener(key: string, f: Function, options?: any): { f: Function; options: any } {\r\n let instantiation = { f: f, options: options };\r\n if (this.eventListener.get(key)) {\r\n (this.eventListener.get(key) || []).push(instantiation);\r\n } else {\r\n this.eventListener.set(key, [instantiation]);\r\n }\r\n return instantiation;\r\n }\r\n\r\n /**\r\n * @description: 移除事件监听\r\n * @param {string} key\r\n * @param {any} instantiation\r\n * @return {*}\r\n */\r\n removeEventListener(key: string, instantiation: any) {\r\n let list = this.eventListener.get(key);\r\n if (!list) return console.error('key不存在');\r\n let index = list.findIndex((n) => n == instantiation);\r\n if (index >= 0) {\r\n list.splice(index, 1);\r\n } else {\r\n console.error('instantiation不存在');\r\n }\r\n }\r\n\r\n /**\r\n * @description: 执行监听\r\n * @param {*} key\r\n * @param {any} parameter\r\n * @return {*}\r\n */\r\n runEventListener(key: string, parameter: any): boolean {\r\n let list = this.eventListener.get(key);\r\n if (!list) return false;\r\n list.forEach((item: any) => {\r\n if (typeof item.f === 'function') {\r\n item.f(parameter);\r\n }\r\n });\r\n return true; // 返回事件是否成功执行\r\n }\r\n\r\n // ... (Add, remove, scale functions here remain the same)\r\n\r\n /**\r\n * @description: 初始化拖拽模型编辑功能(平移)\r\n * @return {*}\r\n */\r\n initEditBox(getEditState: Function) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const scene = viewer.scene;\r\n\r\n let draggedModel: any = null;\r\n let startModelMatrix: any = null;\r\n let startModelCartographic: any = null;\r\n let startMouseCartographic: any = null;\r\n let startMousePosition: any = null;\r\n\r\n // 清除拖拽状态\r\n const clearStatus = () => {\r\n draggedModel = null;\r\n startModelMatrix = null;\r\n startModelCartographic = null;\r\n startMousePosition = null;\r\n startMouseCartographic = null;\r\n this.setEditMode(EditMode.Empty);\r\n this.unlockCamera();\r\n };\r\n\r\n //初始化拖拽状态\r\n const initDragged = (modelId: any, movement: any) => {\r\n draggedModel = this.primitives.get(modelId);\r\n if (draggedModel) {\r\n startModelMatrix = Cesium.Matrix4.clone(draggedModel.modelMatrix);\r\n const modelPosition = Cesium.Matrix4.getTranslation(\r\n startModelMatrix,\r\n new Cesium.Cartesian3(),\r\n );\r\n startModelCartographic = this.toCartographic(modelPosition);\r\n startMousePosition = movement.position;\r\n const rayHit: any = scene.globe.pick(viewer.camera.getPickRay(movement.position), scene);\r\n startMouseCartographic = this.toCartographic(rayHit);\r\n\r\n this.lockCamera();\r\n }\r\n };\r\n\r\n // 点击事件处理,获取被点击的模型对象\r\n this.handler.setInputAction((movement: any) => {\r\n let isEdit = getEditState();\r\n if (!isEdit) return;\r\n const hit: any = scene.pick(movement.position);\r\n if (hit && hit.id && hit.id?.includes('rotationRing')) {\r\n let modelId = hit.id.split('rotationRing_')[1];\r\n this.setEditMode(EditMode.Rotate);\r\n initDragged(modelId, movement);\r\n } else if (hit && hit.id && hit.id?.includes('translationSquare_')) {\r\n let modelId = hit.id.split('translationSquare_')[1];\r\n this.setEditMode(EditMode.Move);\r\n initDragged(modelId, movement);\r\n } else if (hit && hit.id && hit.id?.includes('heightArrow-line_')) {\r\n let modelId = hit.id.split('heightArrow-line_')[1];\r\n this.setEditMode(EditMode.MoveHeight);\r\n initDragged(modelId, movement);\r\n } else if (hit && hit.id && hit.id?.includes('heightArrow-arrow_')) {\r\n let modelId = hit.id.split('heightArrow-arrow_')[1];\r\n this.setEditMode(EditMode.MoveHeight);\r\n initDragged(modelId, movement);\r\n } else if (hit && hit.id) {\r\n draggedModel = this.primitives.get(hit.id);\r\n if (!draggedModel) return;\r\n // 创建旋转环\r\n if (\r\n !this.rotationRing ||\r\n !this.rotationRing?._instanceIds?.includes(`rotationRing_${draggedModel.id}`)\r\n ) {\r\n this.createRotationRing(draggedModel);\r\n }\r\n //创建平移方块\r\n if (\r\n !this.translationSquare ||\r\n !this.translationSquare?._instanceIds?.includes(`translationSquare_${draggedModel.id}`)\r\n ) {\r\n this.createTranslationSquare(draggedModel);\r\n }\r\n //创建平移方块\r\n if (\r\n !this.heightArrow ||\r\n !this.heightArrow?._instanceIds?.includes(`heightArrow_${draggedModel.id}`)\r\n ) {\r\n this.createHeightArrow(draggedModel);\r\n }\r\n } else {\r\n clearStatus();\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_DOWN);\r\n\r\n // 拖拽过程中更新模型位置或旋转\r\n this.handler.setInputAction((movement: any) => {\r\n let isEdit = getEditState();\r\n if (!isEdit) return;\r\n if (this.editMode != EditMode.Empty && draggedModel) {\r\n const rayHit: any = scene.globe.pick(viewer.camera.getPickRay(movement.endPosition), scene);\r\n const currentMouseCartographic = this.toCartographic(rayHit);\r\n let angleDelta = 0;\r\n\r\n // 更新模型的位置或者旋转\r\n if (this.editMode === EditMode.Rotate) {\r\n let currAngle = this.calculateHeading(startModelCartographic, currentMouseCartographic);\r\n let startAngle = this.calculateHeading(startModelCartographic, startMouseCartographic);\r\n angleDelta = startAngle - currAngle;\r\n this.rotateModel(draggedModel, startModelMatrix, angleDelta);\r\n } else if (this.editMode === EditMode.Move) {\r\n this.moveModel(draggedModel, startModelMatrix, movement);\r\n } else if (this.editMode === EditMode.MoveHeight) {\r\n this.moveModelHeight(draggedModel, startModelMatrix, movement, startMousePosition);\r\n }\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n\r\n // 拖拽结束\r\n this.handler.setInputAction(() => {\r\n let isEdit = getEditState();\r\n if (!isEdit) return;\r\n let map = this.dragEndCallbackMap.get(draggedModel?.id);\r\n if (map && (this.editMode === EditMode.Move || this.editMode === EditMode.MoveHeight)) {\r\n let callbackInfo = map.get(GLTFManageEventKey.Translation);\r\n if (callbackInfo) {\r\n this.runEventListener(GLTFManageEventKey.Translation, callbackInfo);\r\n map.delete(GLTFManageEventKey.Translation);\r\n }\r\n } else if (map && this.editMode === EditMode.Rotate) {\r\n let callbackInfo = map.get(GLTFManageEventKey.Rotate);\r\n if (callbackInfo) {\r\n this.runEventListener(GLTFManageEventKey.Rotate, callbackInfo);\r\n map.delete(GLTFManageEventKey.Rotate);\r\n }\r\n }\r\n clearStatus();\r\n }, Cesium.ScreenSpaceEventType.LEFT_UP);\r\n this.handler.setInputAction(() => {\r\n this.removeTool();\r\n }, Cesium.ScreenSpaceEventType.RIGHT_UP);\r\n }\r\n\r\n // 创建圆环表示旋转区域\r\n createRotationRing(model: any) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (this.rotationRing) {\r\n viewer.scene.primitives.remove(this.rotationRing); // 如果已存在,先移除\r\n }\r\n //创建圆\r\n const position = [] as any;\r\n for (let i = 0; i <= 360; i += 3) {\r\n const sin = Math.sin(Cesium.Math.toRadians(i));\r\n const cos = Math.cos(Cesium.Math.toRadians(i));\r\n const x = model.boundingSphere.radius * cos;\r\n const y = model.boundingSphere.radius * sin;\r\n position.push(new Cesium.Cartesian3(x, y, 0));\r\n }\r\n const geometry = new Cesium.PolylineGeometry({\r\n positions: position,\r\n width: Math.max(model.boundingSphere.radius * 0.05, 1),\r\n });\r\n const instnce = new Cesium.GeometryInstance({\r\n id: `rotationRing_${model.id}`,\r\n geometry: geometry,\r\n attributes: {\r\n color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.RED),\r\n },\r\n });\r\n this.rotationRing = new Cesium.Primitive({\r\n geometryInstances: instnce,\r\n appearance: new Cesium.PolylineColorAppearance({\r\n translucent: true,\r\n }),\r\n depthFailAppearance: new Cesium.PolylineMaterialAppearance({\r\n material: Cesium.Material.fromType('Color', {\r\n color: Cesium.Color.RED.withAlpha(0.3),\r\n }),\r\n translucent: true,\r\n }),\r\n modelMatrix: model.modelMatrix,\r\n cull: false,\r\n });\r\n viewer.scene.primitives.add(this.rotationRing);\r\n }\r\n\r\n // 创建平移方块\r\n createTranslationSquare(model: any) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (this.translationSquare) {\r\n viewer.scene.primitives.remove(this.translationSquare); // 如果已存在,先移除\r\n }\r\n\r\n // 创建正方形\r\n const sideLength = Math.max(model.boundingSphere.radius * 0.2, 1); // 正方形的边长,根据模型的半径确定\r\n const halfSide = sideLength / 2;\r\n // 创建正方体的几何体\r\n const boxGeometry = new Cesium.BoxGeometry({\r\n maximum: new Cesium.Cartesian3(halfSide, halfSide, halfSide),\r\n minimum: new Cesium.Cartesian3(-halfSide, -halfSide, -halfSide),\r\n });\r\n\r\n const instnce = new Cesium.GeometryInstance({\r\n id: `translationSquare_${model.id}`,\r\n geometry: boxGeometry,\r\n attributes: {\r\n color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE),\r\n },\r\n });\r\n\r\n this.translationSquare = new Cesium.Primitive({\r\n geometryInstances: instnce,\r\n appearance: new Cesium.PolylineColorAppearance({\r\n translucent: true,\r\n }),\r\n depthFailAppearance: new Cesium.PolylineMaterialAppearance({\r\n material: Cesium.Material.fromType('Color', {\r\n color: Cesium.Color.BLUE.withAlpha(0.3),\r\n }),\r\n translucent: true,\r\n }),\r\n cull: false,\r\n modelMatrix: model.modelMatrix,\r\n });\r\n\r\n viewer.scene.primitives.add(this.translationSquare);\r\n }\r\n\r\n // 创建高度调整箭头\r\n createHeightArrow(model: any) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n\r\n if (this.heightArrow) {\r\n viewer.scene.primitives.remove(this.heightArrow); // 如果已存在,先移除\r\n }\r\n let color = Cesium.Color.GREEN;\r\n let width = Math.max(model.boundingSphere.radius * 0.025, 1);\r\n let headWidth = 2 * width;\r\n let length = model.boundingSphere.radius + 50;\r\n let headLength = length * 0.1;\r\n const sideLength = Math.max(model.boundingSphere.radius * 0.2, 1);\r\n let inverse = false;\r\n\r\n //这里用的是圆锥几何对象,当topRadius和bottomRadius相同时,它就是一个圆柱\r\n const line = Cesium.CylinderGeometry.createGeometry(\r\n new Cesium.CylinderGeometry({\r\n length: length,\r\n topRadius: width,\r\n bottomRadius: width,\r\n }),\r\n );\r\n const arrow = Cesium.CylinderGeometry.createGeometry(\r\n new Cesium.CylinderGeometry({\r\n length: headLength,\r\n topRadius: 0,\r\n bottomRadius: headWidth,\r\n }),\r\n );\r\n let arrowOffset = length + sideLength;\r\n let lineOffset = (length + sideLength) / 2;\r\n if (inverse) {\r\n lineOffset = -lineOffset;\r\n arrowOffset = -arrowOffset;\r\n }\r\n\r\n this.translate(line, [0, 0, lineOffset]);\r\n this.translate(arrow, [0, 0, arrowOffset]);\r\n\r\n // 创建箭头的组合(圆柱 + 圆锥)\r\n this.heightArrow = new Cesium.Primitive({\r\n modelMatrix: model.modelMatrix,\r\n geometryInstances: [\r\n new Cesium.GeometryInstance({\r\n id: `heightArrow-line_${model.id}`,\r\n geometry: line,\r\n }),\r\n new Cesium.GeometryInstance({\r\n id: `heightArrow-arrow_${model.id}`,\r\n geometry: arrow,\r\n }),\r\n ],\r\n appearance: new Cesium.PolylineMaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color: color }),\r\n translucent: true,\r\n }),\r\n depthFailAppearance: new Cesium.PolylineMaterialAppearance({\r\n material: Cesium.Material.fromType('Color', {\r\n color: color.withAlpha(0.3),\r\n }),\r\n translucent: true,\r\n }),\r\n cull: false,\r\n });\r\n\r\n viewer.scene.primitives.add(this.heightArrow);\r\n }\r\n\r\n translate(geometry: any, offset: any) {\r\n let Cesium = this.Cesium;\r\n const scratchOffset = new Cesium.Cartesian3();\r\n if (isArray(offset)) {\r\n scratchOffset.x = offset[0];\r\n scratchOffset.y = offset[1];\r\n scratchOffset.z = offset[2];\r\n } else {\r\n Cesium.Cartesian3.clone(offset, scratchOffset);\r\n }\r\n\r\n for (let i = 0; i < geometry.attributes.position.values.length; i += 3) {\r\n geometry.attributes.position.values[i] += scratchOffset.x;\r\n geometry.attributes.position.values[i + 1] += scratchOffset.y;\r\n geometry.attributes.position.values[i + 2] += scratchOffset.z;\r\n }\r\n }\r\n\r\n //移除工具\r\n removeTool() {\r\n if (this.rotationRing) {\r\n this.viewer.scene.primitives.remove(this.rotationRing);\r\n }\r\n if (this.translationSquare) {\r\n this.viewer.scene.primitives.remove(this.translationSquare);\r\n }\r\n if (this.heightArrow) {\r\n this.viewer.scene.primitives.remove(this.heightArrow);\r\n }\r\n }\r\n\r\n //更新工具矩阵\r\n updatedTool(newModelMatrix: any) {\r\n if (this.rotationRing) {\r\n this.rotationRing.modelMatrix = newModelMatrix;\r\n }\r\n if (this.translationSquare) {\r\n this.translationSquare.modelMatrix = newModelMatrix;\r\n }\r\n if (this.heightArrow) {\r\n this.heightArrow.modelMatrix = newModelMatrix;\r\n }\r\n }\r\n /**\r\n * @description: 平移模型\r\n * @param {*} draggedModel\r\n * @param {*} startModelMatrix\r\n * @param {*} movement\r\n * @return {*}\r\n */\r\n moveModel(draggedModel: any, startModelMatrix: any, movement: any) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const scene = viewer.scene;\r\n const rayHit: any = scene.globe.pick(viewer.camera.getPickRay(movement.endPosition), scene);\r\n\r\n if (rayHit) {\r\n const startPosition: any = Cesium.Matrix4.getTranslation(\r\n startModelMatrix,\r\n new Cesium.Cartesian3(),\r\n );\r\n const startCartographic = Cesium.Cartographic.fromCartesian(startPosition);\r\n const cartographic = Cesium.Cartographic.fromCartesian(rayHit);\r\n\r\n const newCartographic = new Cesium.Cartographic(\r\n cartographic.longitude,\r\n cartographic.latitude,\r\n startCartographic.height,\r\n );\r\n\r\n const newPosition = Cesium.Cartographic.toCartesian(newCartographic);\r\n const rotationMatrix = Cesium.Matrix4.getRotation(startModelMatrix, new Cesium.Matrix3());\r\n const newModelMatrix = Cesium.Matrix4.fromRotationTranslation(rotationMatrix, newPosition);\r\n\r\n draggedModel.modelMatrix = newModelMatrix;\r\n\r\n this.updatedTool(newModelMatrix);\r\n let position = new Cesium.Cartesian3(\r\n newModelMatrix[12],\r\n newModelMatrix[13],\r\n newModelMatrix[14],\r\n );\r\n let dragEndCallback = this.dragEndCallbackMap.get(draggedModel.id);\r\n if (!dragEndCallback) {\r\n dragEndCallback = new Map();\r\n this.dragEndCallbackMap.set(draggedModel.id, dragEndCallback);\r\n }\r\n dragEndCallback.set(GLTFManageEventKey.Translation, {\r\n id: draggedModel.id,\r\n position: position,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @description: 平移模型高度\r\n * @param {*} draggedModel\r\n * @param {*} startModelMatrix\r\n * @param {*} movement\r\n * @return {*}\r\n */\r\n moveModelHeight(\r\n draggedModel: any,\r\n startModelMatrix: any,\r\n movement: any,\r\n startMousePosition: any,\r\n ) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const scene = viewer.scene;\r\n const deltaY = startMousePosition.y - movement.endPosition.y; // 竖直方向的移动量\r\n\r\n const rayHit: any = scene.globe.pick(viewer.camera.getPickRay(movement.endPosition), scene);\r\n\r\n if (rayHit) {\r\n const startPosition: any = Cesium.Matrix4.getTranslation(\r\n startModelMatrix,\r\n new Cesium.Cartesian3(),\r\n );\r\n const startCartographic = Cesium.Cartographic.fromCartesian(startPosition);\r\n\r\n const newCartographic = new Cesium.Cartographic(\r\n startCartographic.longitude,\r\n startCartographic.latitude,\r\n startCartographic.height +\r\n deltaY * 0.001 * Math.max(viewer.camera.positionCartographic.height, 1),\r\n );\r\n\r\n const newPosition = Cesium.Cartographic.toCartesian(newCartographic);\r\n const rotationMatrix = Cesium.Matrix4.getRotation(startModelMatrix, new Cesium.Matrix3());\r\n const newModelMatrix = Cesium.Matrix4.fromRotationTranslation(rotationMatrix, newPosition);\r\n\r\n draggedModel.modelMatrix = newModelMatrix;\r\n\r\n this.updatedTool(newModelMatrix);\r\n let position = new Cesium.Cartesian3(\r\n newModelMatrix[12],\r\n newModelMatrix[13],\r\n newModelMatrix[14],\r\n );\r\n let dragEndCallback = this.dragEndCallbackMap.get(draggedModel.id);\r\n if (!dragEndCallback) {\r\n dragEndCallback = new Map();\r\n this.dragEndCallbackMap.set(draggedModel.id, dragEndCallback);\r\n }\r\n dragEndCallback.set(GLTFManageEventKey.Translation, {\r\n id: draggedModel.id,\r\n position: position,\r\n });\r\n // this.runEventListener(GLTFManageEventKey.Translation, {\r\n // id: draggedModel.id,\r\n // position: position,\r\n // });\r\n }\r\n }\r\n\r\n /**\r\n * @description: 旋转模型\r\n * @param {*} draggedModel\r\n * @param {*} startModelMatrix\r\n * @param {*} angleDelta\r\n * @return {*}\r\n */\r\n rotateModel(draggedModel: any, startModelMatrix: any, angleDelta: number) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const modelHeadingPitchRoll = this.getModelHeadingPitchRoll(startModelMatrix);\r\n const newHeading = modelHeadingPitchRoll.heading + angleDelta;\r\n\r\n const headingPitchRoll = new Cesium.HeadingPitchRoll(\r\n newHeading,\r\n modelHeadingPitchRoll.pitch,\r\n modelHeadingPitchRoll.roll,\r\n );\r\n\r\n const modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(\r\n Cesium.Matrix4.getTranslation(draggedModel.modelMatrix, new Cesium.Cartesian3()),\r\n headingPitchRoll,\r\n viewer.scene.globe.ellipsoid,\r\n Cesium.Transforms.eastNorthUpToFixedFrame,\r\n new Cesium.Matrix4(),\r\n );\r\n\r\n draggedModel.modelMatrix = modelMatrix;\r\n let dragEndCallback = this.dragEndCallbackMap.get(draggedModel.id);\r\n if (!dragEndCallback) {\r\n dragEndCallback = new Map();\r\n this.dragEndCallbackMap.set(draggedModel.id, dragEndCallback);\r\n }\r\n dragEndCallback.set(GLTFManageEventKey.Rotate, {\r\n id: draggedModel.id,\r\n headingPitchRoll: {\r\n heading: Cesium.Math.toDegrees(newHeading),\r\n pitch: Cesium.Math.toDegrees(modelHeadingPitchRoll.pitch),\r\n roll: Cesium.Math.toDegrees(modelHeadingPitchRoll.roll),\r\n },\r\n });\r\n }\r\n\r\n cleanup() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n}\r\n","interface DynamicImgMaterialOptions {\r\n color?: any; // 通常是 Cesium.Color | Cesium.Property\r\n duration?: number;\r\n image: string;\r\n count: number;\r\n freely?: 'vertical' | 'horizontal';\r\n direction: string; // 例如 '+' 或 '-',传给 GLSL\r\n isCustomColor?: boolean;\r\n materialType?: string;\r\n}\r\n\r\n/**\r\n * 注册动态图片材质并返回 TrailLineMaterialProperty 实例\r\n */\r\nexport function getDynamicImgMaterial(Cesium: any, options: DynamicImgMaterialOptions): any {\r\n const MaterialType =\r\n options.materialType || 'DynamicImgMaterial' + Date.now() + Math.floor(Math.random() * 1000);\r\n\r\n // 构造材质属性的构造函数 —— 保留 function + prototype 形式\r\n function TrailLineMaterialProperty(this: any, opts: DynamicImgMaterialOptions) {\r\n this._definitionChanged = new Cesium.Event();\r\n this._color = opts.color;\r\n this._colorSubscription = undefined;\r\n this.color = opts.color;\r\n this.duration = opts.duration;\r\n this._time = Date.now();\r\n }\r\n\r\n Object.defineProperties(TrailLineMaterialProperty.prototype, {\r\n isConstant: {\r\n get(): boolean {\r\n return false;\r\n },\r\n },\r\n definitionChanged: {\r\n get(): any {\r\n return this._definitionChanged;\r\n },\r\n },\r\n color: Cesium.createPropertyDescriptor('color'),\r\n });\r\n\r\n TrailLineMaterialProperty.prototype.getType = function (): string {\r\n return MaterialType;\r\n };\r\n\r\n TrailLineMaterialProperty.prototype.getValue = function (time: any, result?: any): any {\r\n if (!Cesium.defined(result)) {\r\n result = {};\r\n }\r\n result.color = Cesium.Property.getValueOrClonedDefault(\r\n this._color,\r\n time,\r\n Cesium.Color.WHITE,\r\n result.color,\r\n );\r\n result.image = options.image;\r\n // if (this.duration) {\r\n // result.time = ((Date.now() - this._time) % this.duration) / this.duration;\r\n // }\r\n return result;\r\n };\r\n\r\n TrailLineMaterialProperty.prototype.equals = function (other: any): boolean {\r\n return (\r\n this === other ||\r\n (other instanceof TrailLineMaterialProperty &&\r\n Cesium.Property.equals(this._color, (other as any)._color))\r\n );\r\n };\r\n\r\n // 着色器源码生成\r\n const _getWallShader = function (opts: {\r\n count: number;\r\n freely: string;\r\n direction: string;\r\n duration: number;\r\n isCustomColor?: boolean;\r\n }): string {\r\n let material = `\r\n czm_material czm_getMaterial(czm_materialInput materialInput)\r\n {\r\n czm_material material = czm_getDefaultMaterial(materialInput);\r\n vec2 st = materialInput.st;\r\n float time = fract(mod(float(czm_frameNumber * 33.0) , float(${opts.duration})) / float(${opts.duration}));\r\n ${\r\n opts.freely === 'vertical'\r\n ? `vec4 colorImage = texture(image, vec2(fract(float(${opts.count}) *st.t ${opts.direction} time), fract(st.s)));`\r\n : `vec4 colorImage = texture(image, vec2(fract(float(${opts.count}) *st.s ${opts.direction} time), fract(st.t)));`\r\n }\r\n ${opts.isCustomColor ? 'material.diffuse = color.rgb;' : 'material.diffuse = colorImage.rgb;'}\r\n material.alpha = colorImage.a;\\n\\\r\n return material;\\n\\\r\n }`;\r\n return material;\r\n };\r\n\r\n Cesium.Material._materialCache.addMaterial(MaterialType, {\r\n fabric: {\r\n type: MaterialType,\r\n uniforms: {\r\n color: options.color,\r\n image: options.image,\r\n time: 1000,\r\n },\r\n source: _getWallShader({\r\n count: options.count,\r\n freely: options.freely || '',\r\n direction: options.direction,\r\n duration: options.duration || 100,\r\n isCustomColor: options.isCustomColor,\r\n }),\r\n },\r\n translucent(): boolean {\r\n return true;\r\n },\r\n });\r\n\r\n return new (TrailLineMaterialProperty as any)(options);\r\n}\r\n\r\nexport function getWallMaterial(Cesium: any, options: any) {\r\n const MaterialType =\r\n options.MaterialType || 'wallType' + new Date().getTime() + parseInt(Math.random() * 1000 + '');\r\n function TrailLineMaterialProperty(this: any, options: any) {\r\n // 默认参数设置\r\n this._definitionChanged = new Cesium.Event();\r\n this._color = undefined;\r\n this._colorSubscription = undefined;\r\n this.color = options.color;\r\n this.duration = options.duration;\r\n this._time = new Date().getTime();\r\n }\r\n Object.defineProperties(TrailLineMaterialProperty.prototype, {\r\n isConstant: {\r\n get: function () {\r\n return false;\r\n },\r\n },\r\n definitionChanged: {\r\n get: function (this: any) {\r\n return this._definitionChanged;\r\n },\r\n },\r\n color: Cesium.createPropertyDescriptor('color'),\r\n });\r\n TrailLineMaterialProperty.prototype.getType = function () {\r\n return MaterialType;\r\n };\r\n TrailLineMaterialProperty.prototype.getValue = function (this: any, time: any, result: any) {\r\n if (!Cesium.defined(result)) {\r\n result = {};\r\n }\r\n // result.color = Cesium.Property.getValueOrClonedDefault(\r\n // this._color,\r\n // time,\r\n // Cesium.Color.WHITE,\r\n // result.color,\r\n // );\r\n result.image = options.image;\r\n if (this.duration) {\r\n result.time = ((new Date().getTime() - this._time) % this.duration) / this.duration;\r\n }\r\n return result;\r\n };\r\n TrailLineMaterialProperty.prototype.equals = function (this: any, other: any) {\r\n return (\r\n this === other ||\r\n (other instanceof TrailLineMaterialProperty &&\r\n Cesium.Property.equals(this._color, (other as any)._color))\r\n );\r\n };\r\n\r\n const _getWallShader = function (options: any) {\r\n let materail =\r\n 'czm_material czm_getMaterial(czm_materialInput materialInput)\\n\\\r\n {\\n\\\r\n czm_material material = czm_getDefaultMaterial(materialInput);\\n\\\r\n vec2 st = materialInput.st;\\n\\\r\n \\n ';\r\n if (options.freely == 'vertical') {\r\n //(由下到上)\r\n\r\n materail +=\r\n 'vec4 colorImage = texture(image, vec2(fract(float(' +\r\n options.count +\r\n ')*st.t ' +\r\n options.direction +\r\n ' time), fract(st.s)));\\n ';\r\n } else {\r\n //(逆时针)\r\n\r\n materail +=\r\n 'vec4 colorImage = texture(image, vec2(fract(float(' +\r\n options.count +\r\n ')*st.s ' +\r\n options.direction +\r\n ' time), fract(st.t)));\\n ';\r\n }\r\n //泛光\r\n materail +=\r\n 'vec4 fragColor;\\n\\\r\n fragColor.rgb = (colorImage.rgb) / 1.0;\\n\\\r\n fragColor = czm_gammaCorrect(fragColor);\\n ';\r\n\r\n materail +=\r\n ' material.diffuse = colorImage.rgb;\\n\\\r\n material.alpha = colorImage.a;\\n\\\r\n material.emission = fragColor.rgb;\\n\\\r\n \\n\\\r\n return material;\\n\\\r\n }\\n\\\r\n ';\r\n return materail;\r\n };\r\n\r\n Cesium.Material._materialCache.addMaterial(MaterialType, {\r\n fabric: {\r\n type: MaterialType,\r\n uniforms: {\r\n color: new Cesium.Color(1.0, 0.0, 0.0, 0.5),\r\n image: options.image,\r\n time: 0,\r\n },\r\n source: _getWallShader({\r\n count: options.count,\r\n freely: options.freely,\r\n direction: options.direction,\r\n }),\r\n },\r\n translucent: function () {\r\n return true;\r\n },\r\n });\r\n return new (TrailLineMaterialProperty as any)(options);\r\n}\r\n","interface PolylineFlowMaterialOptions {\r\n color?: any; // 一般是 Cesium.Color | Cesium.Property\r\n duration?: number; // 流动持续时间\r\n materialType?: string;\r\n}\r\n\r\n/**\r\n * 注册 polyline 流动材质并返回对应的 MaterialProperty\r\n */\r\nexport function getPolylineFlowMaterialProperty(\r\n Cesium: any,\r\n options: PolylineFlowMaterialOptions,\r\n): any {\r\n const Color = Cesium.Color;\r\n const defineProperties = Object.defineProperties;\r\n const Event = Cesium.Event;\r\n const createPropertyDescriptor = Cesium.createPropertyDescriptor;\r\n const Property = Cesium.Property;\r\n const defaultValue = <T>(value: T | undefined, defaultVal: T): T =>\r\n value === undefined ? defaultVal : value;\r\n const DEFAULT_EMPTY_OBJECT: any = {};\r\n \r\n let _materialType =\r\n options.materialType || 'PolylineFlow' + Date.now() + Math.floor(Math.random() * 1000);\r\n\r\n // 构造函数保持 function + prototype 形式\r\n function PolylineFlowMaterialProperty(this: any, opts: PolylineFlowMaterialOptions) {\r\n opts = defaultValue(opts, DEFAULT_EMPTY_OBJECT);\r\n this._definitionChanged = new Event();\r\n this._color = undefined;\r\n this._colorSubscription = undefined;\r\n this.color = opts.color || Color.fromBytes(0, 255, 255, 255);\r\n this._duration = undefined;\r\n this._durationSubscription = undefined;\r\n this.duration = defaultValue(opts.duration, 45);\r\n }\r\n\r\n defineProperties(PolylineFlowMaterialProperty.prototype, {\r\n isConstant: {\r\n get(): boolean {\r\n return false;\r\n },\r\n },\r\n definitionChanged: {\r\n get(): any {\r\n return this._definitionChanged;\r\n },\r\n },\r\n });\r\n\r\n PolylineFlowMaterialProperty.prototype.getType = function (_time: any): string {\r\n return _materialType;\r\n };\r\n\r\n PolylineFlowMaterialProperty.prototype.getValue = function (time: any, result?: any): any {\r\n if (!result) {\r\n result = {};\r\n }\r\n result.color = Property.getValueOrClonedDefault(\r\n this._color,\r\n time,\r\n Cesium.Color.WHITE,\r\n result.color,\r\n );\r\n result.duration = this._duration;\r\n return result;\r\n };\r\n\r\n PolylineFlowMaterialProperty.prototype.equals = function (other?: any): boolean {\r\n return (\r\n this === other ||\r\n (other instanceof PolylineFlowMaterialProperty &&\r\n Property.equals(this._color, (other as any)._color))\r\n );\r\n };\r\n\r\n defineProperties(PolylineFlowMaterialProperty.prototype, {\r\n color: createPropertyDescriptor('color'),\r\n duration: createPropertyDescriptor('duration'),\r\n });\r\n\r\n // 挂到 Cesium 方便外部直接使用\r\n Cesium.PolylineFlowMaterialProperty = PolylineFlowMaterialProperty;\r\n\r\n Cesium.Material._materialCache.addMaterial(_materialType, {\r\n fabric: {\r\n type: _materialType,\r\n uniforms: {\r\n color: new Color(1.0, 1.0, 1.0, 1),\r\n duration: 45,\r\n },\r\n source: (function () {\r\n return `uniform vec4 color;\r\n uniform float duration;\r\n czm_material czm_getMaterial(czm_materialInput materialInput){\r\n czm_material material = czm_getDefaultMaterial(materialInput);\r\n vec2 st = materialInput.st;\r\n float t = fract(czm_frameNumber / duration);\r\n t *= 1.03;\r\n float alpha = smoothstep(t - 0.03, t, st.s) * step(-t, -st.s);\r\n alpha += 0.2;\r\n vec4 fragColor;\r\n fragColor.rgb = color.rgb;\r\n fragColor = czm_gammaCorrect(fragColor);\r\n material.diffuse = fragColor.rgb;\r\n material.alpha = alpha;\r\n material.emission = fragColor.rgb;\r\n return material;\r\n }`;\r\n })(),\r\n },\r\n translucent(): boolean {\r\n return true;\r\n },\r\n });\r\n\r\n return new (PolylineFlowMaterialProperty as any)(options);\r\n}\r\n","interface RegisterOptions {\r\n themeKey: string;\r\n material: any;\r\n force?: boolean; // 可选,默认 false\r\n category?: string; // 可选,默认 'default'\r\n}\r\n\r\nexport class MaterialManager {\r\n private categoryMap: Map<string, Map<string, any>> = new Map();\r\n\r\n private CategoryGet = {} as { [key: string]: Function };\r\n constructor() {}\r\n\r\n registerCategoryGet(category: string, fn: Function): void {\r\n if (!category) return console.warn('分类不能为空');\r\n this.CategoryGet[category] = fn;\r\n }\r\n /**\r\n * 注册材质\r\n */\r\n register(options: RegisterOptions): void {\r\n const { themeKey, material, force = false, category = 'default' } = options;\r\n\r\n if (!this.categoryMap.has(category)) {\r\n this.categoryMap.set(category, new Map());\r\n }\r\n const materialMap = this.categoryMap.get(category)!;\r\n\r\n if (materialMap.has(themeKey)) {\r\n if (!force) {\r\n console.warn(\r\n `[MaterialManager] 已存在 themeKey '${themeKey}' 在分类 '${category}',如需覆盖请设置 force = true`,\r\n );\r\n return;\r\n } else {\r\n console.info(`[MaterialManager] themeKey '${themeKey}' 在分类 '${category}' 已被覆盖`);\r\n }\r\n }\r\n materialMap.set(themeKey, material);\r\n }\r\n\r\n /**\r\n * 获取材质\r\n */\r\n get({\r\n themeKey,\r\n category,\r\n options,\r\n }: {\r\n themeKey: string;\r\n category?: string;\r\n options?: any;\r\n }): any | undefined {\r\n category = category || 'default';\r\n if (this.CategoryGet[category]) {\r\n return this.CategoryGet[category]({\r\n themeKey,\r\n materialMap: this.categoryMap,\r\n options: options || {},\r\n });\r\n }\r\n return this.categoryMap.get(category)?.get(themeKey);\r\n }\r\n\r\n /**\r\n * 是否存在\r\n */\r\n has(themeKey: string, category: string = 'default'): boolean {\r\n return this.categoryMap.get(category)?.has(themeKey) ?? false;\r\n }\r\n\r\n /**\r\n * 移除材质\r\n */\r\n remove(themeKey: string, category: string = 'default'): void {\r\n const materialMap = this.categoryMap.get(category);\r\n if (!materialMap) return;\r\n\r\n const material = materialMap.get(themeKey);\r\n if (material?.destroy) {\r\n material.destroy();\r\n }\r\n materialMap.delete(themeKey);\r\n\r\n if (materialMap.size === 0) {\r\n this.categoryMap.delete(category);\r\n }\r\n }\r\n\r\n /**\r\n * 获取某分类下的所有 keys\r\n */\r\n keys(category: string = 'default'): string[] {\r\n return [...(this.categoryMap.get(category)?.keys() || [])];\r\n }\r\n\r\n /**\r\n * 清空某个分类\r\n */\r\n clearCategory(category: string = 'default'): void {\r\n const materialMap = this.categoryMap.get(category);\r\n if (!materialMap) return;\r\n\r\n for (const material of materialMap.values()) {\r\n material?.destroy?.();\r\n }\r\n materialMap.clear();\r\n this.categoryMap.delete(category);\r\n }\r\n\r\n /**\r\n * 清空所有\r\n */\r\n clearAll(): void {\r\n for (const materialMap of this.categoryMap.values()) {\r\n for (const material of materialMap.values()) {\r\n material?.destroy?.();\r\n }\r\n }\r\n this.categoryMap.clear();\r\n }\r\n\r\n /**\r\n * 获取所有分类\r\n */\r\n categories(): string[] {\r\n return [...this.categoryMap.keys()];\r\n }\r\n}\r\n","import { BufferedHierarchicalAggregator } from '../BufferedHierarchicalAggregator';\r\nimport { HtmlOverlayLabelPool } from '../HtmlOverlayLabelPool';\r\nimport { MarkerEventKey } from '../MarkerEvent';\r\nimport { MaterialManager } from '../Material/MaterialManager';\r\n\r\ninterface EntityGroupOptions {\r\n id: string;\r\n entities?: any[]; // 默认值为空数组\r\n primitives?: any[]; // 默认值为空数组\r\n dataItem?: any; // 默认值为空对象\r\n aggregator?: BufferedHierarchicalAggregator;\r\n cardPool: HtmlOverlayLabelPool;\r\n}\r\n\r\nexport class EntityGroup {\r\n id: string;\r\n entities: any[] = [];\r\n primitives: any[] = [];\r\n dataItem: any = {};\r\n aggregator?: BufferedHierarchicalAggregator;\r\n cardPool: HtmlOverlayLabelPool;\r\n\r\n constructor(options: EntityGroupOptions) {\r\n // 从 options 中解构参数并设置默认值\r\n const { id, entities = [], primitives = [], dataItem = {}, aggregator, cardPool } = options;\r\n\r\n this.id = id;\r\n this.entities = entities;\r\n this.primitives = primitives;\r\n this.dataItem = dataItem;\r\n this.aggregator = aggregator;\r\n this.cardPool = cardPool;\r\n }\r\n\r\n // 改造 setVisible 方法,支持 Entity 和 Primitive 的可见性控制\r\n setVisible(visible: boolean) {\r\n // 控制 Cesium 原生实体\r\n this.entities.forEach((entity) => {\r\n if (entity) {\r\n entity.show = visible;\r\n }\r\n });\r\n\r\n // 控制 Cesium 原生 Primitive\r\n this.primitives.forEach((primitive) => {\r\n if (primitive) {\r\n primitive.show = visible;\r\n }\r\n });\r\n\r\n // 控制 billboard 聚合点(通过 aggregator)\r\n if (this.aggregator && Array.isArray(this.dataItem.billboard)) {\r\n const updated = this.dataItem.billboard.map((bill: any, index: number) => {\r\n const id = this.dataItem.id;\r\n return {\r\n id,\r\n data: {\r\n ...this.dataItem,\r\n show: visible && (bill.data?.show ?? true),\r\n },\r\n };\r\n });\r\n updated.forEach((p: any) => {\r\n this.aggregator?.updatePoint(p);\r\n });\r\n }\r\n\r\n // 控制 HTML 标签池\r\n if (this.cardPool && this.dataItem.card) {\r\n visible\r\n ? this.cardPool.showByIds([this.dataItem.id])\r\n : this.cardPool.hideByIds([this.dataItem.id]);\r\n }\r\n }\r\n\r\n // 改造 removeAll 方法,支持 Entity 和 Primitive 的移除\r\n removeAll(viewer: any, immediately = true) {\r\n // 移除 Entity\r\n this.entities.forEach((entity) => {\r\n if (entity) viewer.entities.remove(entity);\r\n });\r\n this.entities = [];\r\n\r\n // 移除 Primitive\r\n this.primitives.forEach((primitive) => {\r\n if (primitive) viewer.scene.primitives.remove(primitive);\r\n });\r\n this.primitives = [];\r\n\r\n // 移除 billboard 聚合点\r\n if (immediately && this.aggregator && Array.isArray(this.dataItem.billboard)) {\r\n this.aggregator.removePointsById([this.dataItem.id]);\r\n }\r\n\r\n // 移除 HTML 标签池中的卡片\r\n if (immediately && this.cardPool && this.dataItem.card) {\r\n this.cardPool.removeByIds([this.dataItem.id]);\r\n }\r\n\r\n return this.dataItem.id;\r\n }\r\n}\r\n\r\nexport class EntityLayer {\r\n id: string;\r\n groupMap: Map<string, EntityGroup> = new Map();\r\n Cesium: any;\r\n viewer: any;\r\n materialManager: MaterialManager;\r\n aggregator: BufferedHierarchicalAggregator;\r\n cardPool: HtmlOverlayLabelPool;\r\n constructor(\r\n id: string,\r\n Cesium: any,\r\n viewer: any,\r\n materialManager: MaterialManager,\r\n aggregator: BufferedHierarchicalAggregator,\r\n cardPool: HtmlOverlayLabelPool,\r\n ) {\r\n this.id = id;\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n this.materialManager = materialManager;\r\n this.aggregator = aggregator;\r\n this.cardPool = cardPool;\r\n\r\n this.aggregator.labelPool.eventBus.addListener(MarkerEventKey.Click, {\r\n name: 'BufferedHierarchicalAggregator_maker_click',\r\n fn: (info, e) => {\r\n this.cardPool.showByIds([info.data.id]);\r\n },\r\n });\r\n\r\n const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);\r\n\r\n handler.setInputAction(() => {\r\n this.cardPool.hideFilter((data) => {\r\n if (data.initShow) return false;\r\n return true;\r\n });\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n }\r\n\r\n /** ====== 下面是抽出的创建函数 ====== */\r\n private createPolyline(line: any, show: boolean) {\r\n if (!line.positions || line.positions.length < 1) return null;\r\n const material = this.materialManager.get({\r\n themeKey: line.theme,\r\n category: 'polyline',\r\n options: line,\r\n });\r\n const positions = Array.isArray(line.positions[0]) ? line.positions.flat() : line.positions;\r\n let opt = {\r\n ...line,\r\n };\r\n if (material) opt.material = material;\r\n return this.viewer.entities.add({\r\n polyline: {\r\n ...opt,\r\n positions: this.Cesium.Cartesian3.fromDegreesArrayHeights(positions),\r\n },\r\n show: (line.show ?? true) && show,\r\n });\r\n }\r\n\r\n private createWall(wall: any, show: boolean) {\r\n if (!wall.positions || wall.positions.length < 1) return null;\r\n const material = this.materialManager.get({\r\n themeKey: wall.theme,\r\n category: 'wall',\r\n options: wall,\r\n });\r\n\r\n const minHeights =\r\n wall.positions.length === wall.minimumHeights?.length\r\n ? wall.minimumHeights.map((n: any) => n - Number(wall.minHeight || 0))\r\n : wall.positions.map((n: any) => (n[2] || 0) - Number(wall.minHeight || 0));\r\n\r\n const maxHeights =\r\n wall.positions.length === wall.maximumHeights?.length\r\n ? wall.maximumHeights.map((n: any) => n + Number(wall.maxHeight || 0))\r\n : wall.positions.map((n: any) => (n[2] || 0) + Number(wall.maxHeight || 0));\r\n\r\n const pos = wall.positions.map((p: any) =>\r\n this.Cesium.Cartesian3.fromDegrees(p[0], p[1], p[2] || 0),\r\n );\r\n let opt = {\r\n ...wall,\r\n };\r\n if (material) opt.material = material;\r\n return this.viewer.entities.add({\r\n wall: {\r\n ...opt,\r\n positions: pos,\r\n minimumHeights: minHeights,\r\n maximumHeights: maxHeights,\r\n },\r\n show: (wall.show ?? true) && show,\r\n });\r\n }\r\n\r\n private createPolygon(poly: any, show: boolean) {\r\n // 确保多边形数据有效\r\n if (!poly.hierarchy || poly.hierarchy.length < 1) return null;\r\n\r\n // 获取材质\r\n const material = this.materialManager.get({\r\n themeKey: poly.theme,\r\n category: 'polygon',\r\n options: poly,\r\n });\r\n\r\n // 处理外环(外环是第一个元素)\r\n const outerRing = Array.isArray(poly.hierarchy[0]) ? poly.hierarchy.flat() : poly.hierarchy;\r\n const outerCartesian = this.Cesium.Cartesian3.fromDegreesArrayHeights(outerRing);\r\n\r\n // 处理孔数据(如果有孔数据)\r\n const holes =\r\n poly.holes?.map((hole: any) => {\r\n let _hole = Array.isArray(hole[0]) ? poly.hierarchy.flat() : poly.hole;\r\n return this.Cesium.Cartesian3.fromDegreesArrayHeights(_hole.flat());\r\n }) || [];\r\n\r\n // 使用 PolygonHierarchy 来构建多边形\r\n const polygonHierarchy = new this.Cesium.PolygonHierarchy(outerCartesian, holes);\r\n let opt = {\r\n ...poly,\r\n };\r\n if (material) opt.material = material;\r\n // 创建并返回实体\r\n return this.viewer.entities.add({\r\n polygon: {\r\n ...opt,\r\n hierarchy: polygonHierarchy, // 使用构建好的 PolygonHierarchy\r\n },\r\n show: (poly.show ?? true) && show,\r\n });\r\n }\r\n\r\n private createBillboardPoints(dataItem: any) {\r\n if (!dataItem.billboard?.length || !this.aggregator) return [];\r\n return dataItem.billboard.map((bill: any) => {\r\n const [lon, lat, height = 0] = bill.position || [0, 0, 0];\r\n return {\r\n id: dataItem.id,\r\n lon,\r\n lat,\r\n height,\r\n name: bill.options?.text || '',\r\n data: dataItem,\r\n style: { zIndex: dataItem.zIndex || '1' },\r\n };\r\n });\r\n }\r\n\r\n private createCard(dataItem: any) {\r\n if (!dataItem.card?.data?.length) return;\r\n this.cardPool.add(dataItem.card, {\r\n id: dataItem.id,\r\n lon: dataItem.card.position[0],\r\n lat: dataItem.card.position[1],\r\n height: dataItem.card.position[3] || 0,\r\n theme: dataItem.card.theme,\r\n show: dataItem.show ? (dataItem.card.initShow ?? false) : false,\r\n notCreateElement: true,\r\n style: { width: '0', height: '0', zIndex: dataItem?.card?.zIndex || '110' },\r\n });\r\n }\r\n\r\n /** ====== 主入口:仅保留循环,内部调用独立函数 ====== */\r\n addGroup(dataItem: any, isAppendPoints = true) {\r\n const groupId = dataItem.id || `${Date.now()}`;\r\n this.removeGroup(groupId);\r\n const entities: any[] = [];\r\n const show = dataItem.show !== false;\r\n\r\n (dataItem.polyline || []).forEach((l: any) => {\r\n const e = this.createPolyline(l, show);\r\n if (e) entities.push(e);\r\n });\r\n\r\n (dataItem.wall || []).forEach((w: any) => {\r\n const e = this.createWall(w, show);\r\n if (e) entities.push(e);\r\n });\r\n\r\n (dataItem.polygon || []).forEach((p: any) => {\r\n const e = this.createPolygon(p, show);\r\n if (e) entities.push(e);\r\n });\r\n\r\n const pointList = this.createBillboardPoints(dataItem);\r\n if (pointList.length && isAppendPoints) this.aggregator.appendPoints(pointList, false);\r\n\r\n this.createCard(dataItem);\r\n\r\n const group = new EntityGroup({\r\n id: groupId,\r\n entities,\r\n primitives: [],\r\n dataItem,\r\n aggregator: this.aggregator,\r\n cardPool: this.cardPool,\r\n });\r\n this.groupMap.set(groupId, group);\r\n return pointList;\r\n }\r\n\r\n async addGroups(dataItemList: any) {\r\n let dataLists = dataItemList.map((dataItem: any) => {\r\n return this.addGroup(dataItem, false);\r\n });\r\n\r\n // 拉平二维数组\r\n const allPoints = dataLists.flat();\r\n if (allPoints.length > 0 && this.aggregator) {\r\n this.aggregator.appendPoints(allPoints, false);\r\n }\r\n }\r\n\r\n removeGroup(groupId: string) {\r\n const group = this.groupMap.get(groupId);\r\n if (group) {\r\n group.removeAll(this.viewer);\r\n this.groupMap.delete(groupId);\r\n }\r\n }\r\n removeGroups(groupIds: string[]) {\r\n let ids = [];\r\n for (const groupId of groupIds) {\r\n const group = this.groupMap.get(groupId);\r\n if (group) {\r\n let id = group.removeAll(this.viewer, false);\r\n this.groupMap.delete(groupId);\r\n ids.push(id);\r\n }\r\n }\r\n this.aggregator.removePointsById(ids);\r\n this.cardPool.removeByIds(ids);\r\n }\r\n updateGroup(dataItem: any) {\r\n const group = this.groupMap.get(dataItem.id);\r\n if (group) {\r\n group.removeAll(this.viewer);\r\n this.groupMap.delete(dataItem.id);\r\n }\r\n this.addGroup(dataItem);\r\n }\r\n\r\n async updateGroups(dataItemList: Array<any>) {\r\n this.aggregator.removePointsById(dataItemList.map((n: any) => n.id));\r\n this.cardPool.removeByIds(dataItemList.map((n: any) => n.id));\r\n let dataLists = dataItemList.map((dataItem: any) => {\r\n const group = this.groupMap.get(dataItem.id);\r\n if (group) {\r\n group.removeAll(this.viewer, false);\r\n this.groupMap.delete(dataItem.id);\r\n }\r\n return this.addGroup(dataItem, false);\r\n });\r\n\r\n // 拉平二维数组\r\n const allPoints = dataLists.flat();\r\n if (allPoints.length > 0 && this.aggregator) {\r\n this.aggregator.appendPoints(allPoints, false);\r\n }\r\n }\r\n\r\n setGroupVisible(groupId: string, visible: boolean) {\r\n this.groupMap.get(groupId)?.setVisible(visible);\r\n }\r\n\r\n clearAllGroups() {\r\n this.groupMap.forEach((group) => group.removeAll(this.viewer));\r\n this.groupMap.clear();\r\n }\r\n}\r\n\r\nexport class EntityLayerManager {\r\n Cesium: any;\r\n viewer: any;\r\n layerMap: Map<string, EntityLayer> = new Map();\r\n materialManager: MaterialManager;\r\n aggregator: BufferedHierarchicalAggregator;\r\n cardPool: HtmlOverlayLabelPool;\r\n constructor(\r\n Cesium: any,\r\n viewer: any,\r\n materialManager: MaterialManager,\r\n aggregator: BufferedHierarchicalAggregator,\r\n cardPool: HtmlOverlayLabelPool,\r\n ) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n this.materialManager = materialManager;\r\n this.aggregator = aggregator;\r\n this.cardPool = cardPool;\r\n }\r\n\r\n addLayer(layerId: string) {\r\n if (!this.layerMap.has(layerId)) {\r\n this.layerMap.set(\r\n layerId,\r\n new EntityLayer(\r\n layerId,\r\n this.Cesium,\r\n this.viewer,\r\n this.materialManager,\r\n this.aggregator,\r\n this.cardPool,\r\n ),\r\n );\r\n }\r\n }\r\n\r\n removeLayer(layerId: string) {\r\n const layer = this.layerMap.get(layerId);\r\n if (layer) {\r\n layer.clearAllGroups();\r\n this.layerMap.delete(layerId);\r\n }\r\n }\r\n\r\n getLayer(layerId: string): EntityLayer | undefined {\r\n return this.layerMap.get(layerId);\r\n }\r\n\r\n async addGroupsToLayer(layerId: string, dataList: any[]) {\r\n const layer = this.layerMap.get(layerId);\r\n if (!layer) return;\r\n // dataList.forEach((data) => layer.addGroup(data));\r\n layer.addGroups(dataList);\r\n this.aggregator.refresh();\r\n }\r\n updateGroupToLayer(layerId: string, dataList: any[]) {\r\n const layer = this.layerMap.get(layerId);\r\n if (!layer) return;\r\n\r\n layer.updateGroups(dataList);\r\n this.aggregator.refresh();\r\n }\r\n\r\n setGroupVisible(layerId: string, groupId: string, visible: boolean) {\r\n this.layerMap.get(layerId)?.setGroupVisible(groupId, visible);\r\n }\r\n\r\n removeGroup(layerId: string, groupId: string) {\r\n this.layerMap.get(layerId)?.removeGroup(groupId);\r\n }\r\n removeGroups(layerId: string, groupIds: string[]) {\r\n this.layerMap.get(layerId)?.removeGroups(groupIds);\r\n }\r\n}\r\n","export function convertGeoJsonToEntityData(geoJson: any): any[] {\r\n const dataList: any[] = [];\r\n\r\n // 遍历 GeoJSON 中的所有特性\r\n geoJson.features.forEach((feature: any, index: number) => {\r\n if (feature.geometry && feature.properties) {\r\n const geometry = feature.geometry;\r\n const properties = feature.properties;\r\n\r\n // 初始化数据项\r\n const dataItem: any = {\r\n id: properties.id || `${Date.now()}`,\r\n show: true, // 默认为显示\r\n zIndex: properties.zIndex || 1, // 默认为 1\r\n name: `${properties.layer}_${index}` || '',\r\n billboard: [],\r\n polyline: [],\r\n wall: [],\r\n polygon: [],\r\n card: properties.card || null, // 如果存在 card 数据则加入\r\n };\r\n\r\n // 根据几何类型转换数据\r\n switch (geometry.type) {\r\n case 'Point':\r\n // 处理 Point 类型\r\n dataItem.billboard.push({\r\n position: geometry.coordinates, // GeoJSON 的坐标格式 [lon, lat]\r\n options: properties, // 可以传递一些附加属性\r\n name: `${properties.layer}_${index}`,\r\n });\r\n break;\r\n\r\n case 'LineString':\r\n // 处理 LineString 类型\r\n dataItem.polyline.push({\r\n positions: geometry.coordinates, // GeoJSON 的坐标数组\r\n theme: properties.theme || 'default', // 传递 theme 信息\r\n });\r\n break;\r\n\r\n case 'Polygon':\r\n // 处理 Polygon 类型\r\n dataItem.polygon.push({\r\n hierarchy: geometry.coordinates[0], // GeoJSON 的多边形坐标数组\r\n theme: properties.theme || 'default',\r\n });\r\n break;\r\n\r\n case 'MultiLineString':\r\n // 处理 MultiLineString 类型\r\n geometry.coordinates.forEach((line: any[]) => {\r\n dataItem.polyline.push({\r\n positions: line,\r\n });\r\n });\r\n break;\r\n\r\n case 'MultiPolygon':\r\n // 处理 MultiPolygon 类型\r\n geometry.coordinates.forEach((polygon: any[]) => {\r\n dataItem.polygon.push({\r\n hierarchy: polygon[0], // 多个多边形时,取第一个\r\n });\r\n });\r\n break;\r\n\r\n case 'GeometryCollection':\r\n // 处理 GeometryCollection 类型(多种几何类型组合)\r\n geometry.geometries.forEach((geom: any) => {\r\n if (geom.type === 'Point') {\r\n dataItem.billboard.push({\r\n position: geom.coordinates,\r\n });\r\n } else if (geom.type === 'LineString') {\r\n dataItem.polyline.push({\r\n positions: geom.coordinates,\r\n });\r\n } else if (geom.type === 'Polygon') {\r\n dataItem.polygon.push({\r\n hierarchy: geom.coordinates[0],\r\n });\r\n }\r\n });\r\n break;\r\n\r\n default:\r\n console.warn(`Unsupported geometry type: ${geometry.type}`);\r\n break;\r\n }\r\n\r\n // 将转换后的数据项添加到数据列表\r\n dataList.push(dataItem);\r\n }\r\n });\r\n\r\n return dataList;\r\n}\r\n","import { EntityLayerManager } from '../entity/EntityLayer';\r\nimport { MaterialManager } from '../Material/MaterialManager';\r\nimport { cloneDeep } from 'lodash-es';\r\nexport class PrimitiveManager {\r\n private Cesium: any;\r\n private viewer: any; // Cesium.Viewer\r\n private layerMap: Map<string, Map<string, any>>;\r\n private hideLayerMap: Map<string, Set<string>>;\r\n entityLayerManager: EntityLayerManager;\r\n private PrimitiveThemeMap: Map<\r\n string,\r\n {\r\n Primitive: any;\r\n ids: Map<string, any>;\r\n geometryInstances: Map<string, any>;\r\n appearance: any;\r\n }\r\n >; // theme -> 合并后的 Primitive 和图元 ID 的映射\r\n materialManager: MaterialManager;\r\n\r\n constructor(options: {\r\n Cesium: any;\r\n viewer: any;\r\n materialManager: MaterialManager;\r\n entityLayerManager: EntityLayerManager;\r\n }) {\r\n let { Cesium, viewer, materialManager, entityLayerManager } = options;\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n this.layerMap = new Map();\r\n this.PrimitiveThemeMap = new Map(); // 存储 theme -> { Primitive, ids, geometryInstances }\r\n this.hideLayerMap = new Map();\r\n this.materialManager = materialManager;\r\n this.entityLayerManager = entityLayerManager;\r\n }\r\n\r\n //创建图元\r\n private createGeometryInstance(item: any): any {\r\n let geometryInstance: any;\r\n if (item.category === 'polyline' && item.positions) {\r\n geometryInstance = this.createPolyline(item);\r\n } else if (item.category === 'polygon' && item.hierarchy) {\r\n geometryInstance = this.createPolygon(item);\r\n }\r\n return geometryInstance;\r\n }\r\n\r\n // 创建或获取 材质图元组\r\n private carateThemePrimitive(_item: any) {\r\n let item = cloneDeep(_item);\r\n let themePrimitive = this.PrimitiveThemeMap.get(item.theme);\r\n if (!themePrimitive) {\r\n this.initTheme(item);\r\n // 如果没有,则初始化一个新的 entry\r\n let appearance = this.createAppearance(item);\r\n themePrimitive = {\r\n Primitive: null,\r\n ids: new Map(),\r\n appearance: appearance,\r\n geometryInstances: new Map(),\r\n };\r\n this.PrimitiveThemeMap.set(item.theme, themePrimitive);\r\n }\r\n return themePrimitive;\r\n }\r\n\r\n //注册主题\r\n initTheme(item: any) {\r\n let materialManager = this.materialManager;\r\n let Cesium = this.Cesium;\r\n if (item.category == 'polyline') {\r\n const isDashed =\r\n item.properties?.lineType?.pattern && item.properties?.lineType?.patternLength;\r\n let lineMaterialKey = '';\r\n if (isDashed) {\r\n const dashPattern = item.properties?.lineType?.pattern || [0.25, -0.125];\r\n const dashLength = item.properties?.lineType?.patternLength || 0.375;\r\n let cesiumDash = this.convertCadPatternToCesiumDash(dashPattern, dashLength);\r\n lineMaterialKey = `DashedLineMaterial_pattern_${cesiumDash.dashPattern}_dashLength_${cesiumDash.dashLength}_color_${item.properties?.color}`;\r\n if (!materialManager.has(lineMaterialKey)) {\r\n materialManager.register({\r\n themeKey: lineMaterialKey,\r\n material: Cesium.Material.fromType('PolylineDash', {\r\n color: Cesium.Color.fromCssColorString(item.properties.color || '#FFFFFF').withAlpha(\r\n 0.8,\r\n ),\r\n dashLength: cesiumDash.dashLength, // ← 注意,这里填总长度\r\n dashPattern: cesiumDash.dashPattern, // ← 这里才是 16-bit 掩码\r\n }),\r\n });\r\n }\r\n } else {\r\n lineMaterialKey = `LineMaterial_color_${item.properties?.color}`;\r\n if (!materialManager.has(lineMaterialKey)) {\r\n materialManager.register({\r\n themeKey: lineMaterialKey,\r\n material: Cesium.Material.fromType('Color', {\r\n color: Cesium.Color.fromCssColorString(item.properties.color || '#FFFFFF').withAlpha(\r\n 0.8,\r\n ),\r\n }),\r\n });\r\n }\r\n }\r\n } else if (item.category == 'polygon') {\r\n let polygonMaterialKey = `polygonMaterial_color_${item.properties?.color}`;\r\n if (!materialManager.has(polygonMaterialKey)) {\r\n materialManager.register({\r\n themeKey: polygonMaterialKey,\r\n material: Cesium.Material.fromType('Color', {\r\n color: Cesium.Color.fromCssColorString(item.properties?.color || '#FFFFFF').withAlpha(\r\n 0.8,\r\n ),\r\n }),\r\n });\r\n }\r\n }\r\n }\r\n\r\n convertCadPatternToCesiumDash(pattern: Array<number>, patternLength: number) {\r\n const segmentCount = 16;\r\n const unitLength = patternLength / segmentCount;\r\n\r\n // 第一步:先用 floor 分配位数,统计已经分配的位数\r\n let dashBits = [] as Array<number>;\r\n let assigned = 0;\r\n for (let len of pattern) {\r\n const count = Math.floor(Math.abs(len) / unitLength);\r\n const bit = len >= 0 ? 1 : 0;\r\n for (let i = 0; i < count; i++) {\r\n dashBits.push(bit);\r\n assigned++;\r\n if (assigned >= segmentCount) break;\r\n }\r\n if (assigned >= segmentCount) break;\r\n }\r\n\r\n // 如果分配不到 16 位,用 “空” 填满;如果多了,则截断\r\n while (dashBits.length < segmentCount) {\r\n dashBits.push(0);\r\n }\r\n if (dashBits.length > segmentCount) {\r\n dashBits.length = segmentCount;\r\n }\r\n\r\n // 第二步:把 16 位数组变成一个整数\r\n let dashPattern = 0;\r\n for (let i = 0; i < segmentCount; i++) {\r\n dashPattern = (dashPattern << 1) | dashBits[i];\r\n }\r\n\r\n return {\r\n dashPattern: dashPattern,\r\n dashLength: patternLength,\r\n };\r\n }\r\n\r\n // 创建或更新图层并添加几何体\r\n public async processBatch(data: Array<{ layerId: string; dataList: any[] }>): Promise<void> {\r\n const materialThemes = new Map(); // 用于记录所有出现的材质 theme\r\n data.forEach((item) => {\r\n let { layerId, dataList } = item;\r\n let batch = cloneDeep(dataList);\r\n batch.forEach((item) => {\r\n let geometryInstance = this.createGeometryInstance(item);\r\n\r\n if (geometryInstance) {\r\n // 检查是否已有相同 theme 的 Primitive\r\n let themePrimitive = this.carateThemePrimitive(item);\r\n\r\n // 将当前 item 的 id 添加到 themePrimitive.ids 中\r\n themePrimitive.ids.set(item.id, item);\r\n themePrimitive.geometryInstances.set(item.id, geometryInstance); // 添加到几何实例集合中\r\n\r\n const layer = this.layerMap.get(layerId);\r\n if (layer) {\r\n layer.set(item.id, item);\r\n } else {\r\n let map = new Map();\r\n this.layerMap.set(layerId, map);\r\n map.set(item.id, item);\r\n }\r\n\r\n // 记录 materialTheme\r\n materialThemes.set(item.theme, item);\r\n }\r\n });\r\n });\r\n // 循环结束后,统一调用 updatePrimitive\r\n materialThemes.forEach((item) => {\r\n this.updatePrimitive(item);\r\n });\r\n }\r\n\r\n // 创建折线几何体(不再获取材质)\r\n private createPolyline(item: any): any {\r\n const positions = Array.isArray(item.positions[0]) ? item.positions.flat() : item.positions;\r\n return new this.Cesium.GeometryInstance({\r\n id: item.id,\r\n geometry: new this.Cesium.GroundPolylineGeometry({\r\n positions: this.Cesium.Cartesian3.fromDegreesArrayHeights(positions),\r\n // width: 10,\r\n width: Math.max(item.width || 2, 2),\r\n }),\r\n });\r\n }\r\n\r\n // 创建多边形几何体(不再获取材质)\r\n private createPolygon(item: any): any {\r\n const outerRing = Array.isArray(item.hierarchy[0]) ? item.hierarchy.flat() : item.hierarchy;\r\n const outerCartesian = this.Cesium.Cartesian3.fromDegreesArrayHeights(outerRing);\r\n const holes =\r\n item.holes?.map((hole: any) => {\r\n let _hole = Array.isArray(hole[0]) ? hole.flat() : hole;\r\n let _holeDegrees = this.Cesium.Cartesian3.fromDegreesArrayHeights(_hole.flat());\r\n return new this.Cesium.PolygonHierarchy(_holeDegrees);\r\n }) || [];\r\n\r\n const polygonHierarchy = new this.Cesium.PolygonHierarchy(outerCartesian, holes);\r\n\r\n return new this.Cesium.GeometryInstance({\r\n id: item.id,\r\n geometry: new this.Cesium.PolygonGeometry({\r\n polygonHierarchy: polygonHierarchy,\r\n }),\r\n });\r\n }\r\n\r\n // 获取材质(在 updatePrimitive 中处理)\r\n private getMaterial(item: any): any {\r\n let material = this.materialManager.get({\r\n themeKey: item.theme,\r\n options: item,\r\n });\r\n\r\n if (!material) {\r\n material = this.Cesium.Material.fromType('Color', {\r\n color: new this.Cesium.Color(1.0, 0.0, 0.0, 1.0), // 默认红色\r\n });\r\n }\r\n\r\n return material;\r\n }\r\n\r\n // 更新图元\r\n public updateGeometryInstance(_item: any): void {\r\n let item = cloneDeep(_item);\r\n\r\n const layer = this.layerMap.get(item.layerId);\r\n if (!layer) {\r\n console.warn(`没有找到图层 ${item.layerId}`);\r\n return;\r\n }\r\n\r\n let geometryInstanceInfo = layer.get(item.id);\r\n layer.set(item.id, item);\r\n if (!geometryInstanceInfo) {\r\n console.warn(`没有找到图元 ${item.id} 在图层 ${item.layerId} 中`);\r\n return;\r\n }\r\n if (geometryInstanceInfo.theme !== item.theme) {\r\n //更新旧的主题\r\n let oldThemePrimitive = this.PrimitiveThemeMap.get(geometryInstanceInfo.theme);\r\n oldThemePrimitive?.geometryInstances.delete(item.id);\r\n oldThemePrimitive?.ids.delete(item.id);\r\n this.updatePrimitive(geometryInstanceInfo);\r\n }\r\n //更新新的主题\r\n let themePrimitive = this.carateThemePrimitive(item);\r\n if (themePrimitive) {\r\n const geometryInstance = this.createGeometryInstance(item);\r\n themePrimitive.geometryInstances.set(item.id, geometryInstance);\r\n themePrimitive.ids.set(item.id, item);\r\n // 调用更新图元的方法\r\n this.updatePrimitive(item);\r\n }\r\n }\r\n\r\n // 删除图元\r\n public deleteGeometryInstance(data: Array<{ layerId: string; ids: string[] }>): void {\r\n let themeMap = new Set();\r\n data.forEach((item) => {\r\n let { layerId, ids } = item;\r\n const layer = this.layerMap.get(layerId);\r\n if (!layer) {\r\n console.warn(`没有找到图层 ${layerId}`);\r\n return;\r\n }\r\n ids.forEach((id) => {\r\n let geometryInstanceInfo = layer.get(id);\r\n\r\n if (!geometryInstanceInfo) {\r\n console.warn(`没有找到图元 ${id} 在图层 ${layerId} 中`);\r\n return;\r\n }\r\n\r\n //更新新的主题\r\n let themePrimitive = this.PrimitiveThemeMap.get(geometryInstanceInfo.theme);\r\n if (themePrimitive) {\r\n themePrimitive.geometryInstances.delete(geometryInstanceInfo.id);\r\n themePrimitive.ids.delete(geometryInstanceInfo.id);\r\n // 调用更新图元的方法\r\n themeMap.add(geometryInstanceInfo);\r\n }\r\n });\r\n });\r\n Array.from(themeMap.values()).forEach((item) => {\r\n this.updatePrimitive(item);\r\n });\r\n }\r\n // 添加图元\r\n public addGeometryInstance(_item: any): void {\r\n let item = cloneDeep(_item);\r\n\r\n const layer = this.layerMap.get(item.layerId);\r\n if (!layer) {\r\n console.warn(`没有找到图层 ${item.layerId}`);\r\n return;\r\n }\r\n\r\n let geometryInstanceInfo = layer.get(item.id);\r\n\r\n if (geometryInstanceInfo) {\r\n console.warn(`图元 ${item.id} 已经存在图层 ${item.layerId} 中`);\r\n return;\r\n }\r\n layer.set(item.id, item);\r\n //更新新的主题\r\n let themePrimitive = this.carateThemePrimitive(item);\r\n if (themePrimitive) {\r\n const geometryInstance = this.createGeometryInstance(item);\r\n themePrimitive.geometryInstances.set(item.id, geometryInstance);\r\n themePrimitive.ids.set(item.id, item);\r\n // 调用更新图元的方法\r\n this.updatePrimitive(item);\r\n }\r\n }\r\n\r\n // 创建外观\r\n private createAppearance(item: any) {\r\n let material = this.getMaterial({ theme: item.theme });\r\n let appearance;\r\n if (item.category === 'polyline') {\r\n appearance = new this.Cesium.PolylineMaterialAppearance({\r\n material: material, // 传入材质\r\n translucent: true,\r\n });\r\n } else if (item.category === 'polygon') {\r\n appearance = new this.Cesium.MaterialAppearance({\r\n material: material,\r\n translucent: true,\r\n });\r\n }\r\n return appearance;\r\n }\r\n\r\n // 根据 theme 更新对应的 Primitive\r\n private updatePrimitive(item: any): void {\r\n const themePrimitive = this.PrimitiveThemeMap.get(item.theme);\r\n if (!themePrimitive) {\r\n return;\r\n }\r\n\r\n // 如果当前没有创建 Primitive,则创建新的\r\n if (themePrimitive.Primitive) {\r\n this.viewer.scene.primitives.remove(themePrimitive.Primitive);\r\n themePrimitive.Primitive = null;\r\n }\r\n // 更新已存在的 Primitive\r\n let arrayFromMap = Array.from(themePrimitive.geometryInstances, ([key, value]) => ({\r\n key,\r\n value,\r\n }));\r\n // let layer = this.hideLayerMap.get(item.layerId);\r\n let geometryInstances = arrayFromMap\r\n .filter((n) => {\r\n return !Array.from(this.hideLayerMap.values()).some((layer) => layer.has(n.key));\r\n })\r\n .map((n) => {\r\n return n.value;\r\n });\r\n if (geometryInstances.length <= 0) return;\r\n if (item.category === 'polyline') {\r\n themePrimitive.Primitive = new this.Cesium.GroundPolylinePrimitive({\r\n geometryInstances: geometryInstances, // 使用所有的 GeometryInstance\r\n appearance: themePrimitive.appearance,\r\n });\r\n this.viewer.scene.primitives.add(themePrimitive.Primitive); // 添加到场景\r\n } else {\r\n themePrimitive.Primitive = new this.Cesium.GroundPrimitive({\r\n geometryInstances: geometryInstances, // 使用所有的 GeometryInstance\r\n appearance: themePrimitive.appearance,\r\n });\r\n\r\n this.viewer.scene.primitives.add(themePrimitive.Primitive); // 添加到场景\r\n }\r\n }\r\n\r\n //隐藏\r\n public hideByLayerAndId(data: Array<{ layerId: string; ids: string[] }>) {\r\n let themeMap = new Map();\r\n\r\n data.forEach((item) => {\r\n let { layerId, ids } = item;\r\n let layer = this.hideLayerMap.get(layerId);\r\n if (!layer) {\r\n layer = new Set();\r\n this.hideLayerMap.set(layerId, layer);\r\n }\r\n ids.forEach((value) => {\r\n layer.add(value);\r\n let info = this.getGeometryInstanceInfo(layerId, value);\r\n if (info) themeMap.set(info.theme, info);\r\n });\r\n });\r\n Array.from(themeMap.values()).forEach((item) => {\r\n this.updatePrimitive(item);\r\n });\r\n }\r\n\r\n //显示\r\n public showByLayerAndId(data: Array<{ layerId: string; ids: string[] }>) {\r\n let themeMap = new Map();\r\n data.forEach((item) => {\r\n let { layerId, ids } = item;\r\n let layer = this.hideLayerMap.get(layerId);\r\n if (!layer) {\r\n layer = new Set();\r\n this.hideLayerMap.set(layerId, layer);\r\n }\r\n ids.forEach((value) => {\r\n layer.delete(value);\r\n let info = this.getGeometryInstanceInfo(layerId, value);\r\n if (info) themeMap.set(info.theme, info);\r\n });\r\n });\r\n Array.from(themeMap.values()).forEach((item) => {\r\n this.updatePrimitive(item);\r\n });\r\n }\r\n\r\n //查询是否存在图元\r\n public hasGeometryInstance(layerId: string, id: string) {\r\n // 获取图层\r\n const layer = this.layerMap.get(layerId);\r\n if (!layer) {\r\n return false;\r\n }\r\n\r\n // 获取图元\r\n const geometryInstanceInfo = layer.get(id);\r\n if (!geometryInstanceInfo) {\r\n return false;\r\n }\r\n\r\n let themePrimitive = this.PrimitiveThemeMap.get(geometryInstanceInfo.theme);\r\n if (!themePrimitive) {\r\n return false;\r\n }\r\n // 获取图元的几何体\r\n const geometryInstance = themePrimitive.geometryInstances.get(id);\r\n if (!geometryInstance) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n //查询图元信息\r\n public getGeometryInstanceInfo(layerId: string, id: string) {\r\n // 获取图层\r\n const layer = this.layerMap.get(layerId);\r\n if (!layer) {\r\n return null;\r\n }\r\n\r\n // 获取图元\r\n const geometryInstanceInfo = layer.get(id);\r\n return geometryInstanceInfo;\r\n }\r\n\r\n public focusOnGeometryInstance(layerId: string, id: string): void {\r\n // 获取图层\r\n const layer = this.layerMap.get(layerId);\r\n if (!layer) {\r\n console.warn(`图层 ${layerId} 不存在`);\r\n return;\r\n }\r\n\r\n // 获取图元\r\n const geometryInstanceInfo = layer.get(id);\r\n if (!geometryInstanceInfo) {\r\n console.warn(`没有找到图元 ${id} 在图层 ${layerId} 中`);\r\n return;\r\n }\r\n\r\n let themePrimitive = this.PrimitiveThemeMap.get(geometryInstanceInfo.theme);\r\n if (!themePrimitive) {\r\n console.warn(`没有找到 ${id} 图元相关的Primitive`);\r\n return;\r\n }\r\n // 获取图元的几何体\r\n const geometryInstance = themePrimitive.geometryInstances.get(id);\r\n if (!geometryInstance) {\r\n console.warn(`没有找到图元的几何体 ${id}`);\r\n return;\r\n }\r\n\r\n const geometry = geometryInstance.geometry;\r\n const positions = geometry._positions || geometry._polygonHierarchy.positions;\r\n\r\n if (positions && positions.length > 0) {\r\n // 计算包围盒的最小和最大点\r\n let minX = positions[0].x,\r\n minY = positions[0].y,\r\n minZ = positions[0].z;\r\n let maxX = positions[0].x,\r\n maxY = positions[0].y,\r\n maxZ = positions[0].z;\r\n\r\n positions.forEach((position: any) => {\r\n minX = Math.min(minX, position.x);\r\n minY = Math.min(minY, position.y);\r\n minZ = Math.min(minZ, position.z);\r\n\r\n maxX = Math.max(maxX, position.x);\r\n maxY = Math.max(maxY, position.y);\r\n maxZ = Math.max(maxZ, position.z);\r\n });\r\n\r\n // 计算包围盒的中心和尺寸\r\n const center = new this.Cesium.Cartesian3(\r\n (minX + maxX) / 2,\r\n (minY + maxY) / 2,\r\n (minZ + maxZ) / 2,\r\n );\r\n const dimensions = new this.Cesium.Cartesian3(maxX - minX, maxY - minY, maxZ - minZ);\r\n\r\n // 计算偏移量(使用包围盒的高度作为偏移)\r\n const height = dimensions.z; // 高度对应 Z 轴\r\n const offsetHeight = Math.abs(height || 1) * 1.5; // 使用包围盒高度的 1.5 倍作为偏移量\r\n\r\n // 使用摄像机平滑定位到包围盒中心\r\n this.viewer.camera.flyTo({\r\n destination: center,\r\n duration: 2, // 平滑移动的持续时间(秒)\r\n complete: () => {\r\n console.log(`已定位到图元 ${id}`);\r\n },\r\n offset: new this.Cesium.Cartesian3(0, 0, offsetHeight), // 使用动态计算的偏移高度\r\n });\r\n } else {\r\n console.warn(`无法获取图元 ${id} 的顶点信息`);\r\n }\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class HorizontalMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private positions: any[] = [];\r\n private tempPoints: any[] = [];\r\n private segmentEntities: any[] = [];\r\n private segmentLabelIds: string[] = [];\r\n private previewEntity: any = null;\r\n private previewGroundEntity: any = null;\r\n private hoverPos: any = null;\r\n private htmlLabelPool: any = null;\r\n private totalLabelId: string | null = null;\r\n private previewLabelId: string | null = null;\r\n private labelEntity: any = null;\r\n private firstHeight: number | null = null;\r\n private groundLineEntities: any[] = [];\r\n private previewPos: any = null;\r\n private previewGroundPos: any = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-horizontal-total', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-horizontal-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n const carto = Cesium.Cartographic.fromCartesian(pos);\r\n const lng = Cesium.Math.toDegrees(carto.longitude);\r\n const lat = Cesium.Math.toDegrees(carto.latitude);\r\n if (this.positions.length === 0) {\r\n this.firstHeight = carto.height || 0;\r\n }\r\n const clampedPos = Cesium.Cartesian3.fromDegrees(lng, lat, this.firstHeight || 0);\r\n this.positions.push(clampedPos);\r\n const point = viewer.entities.add({\r\n position: clampedPos,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(point);\r\n const terrainHeight =\r\n viewer.scene.globe.getHeight(new Cesium.Cartographic(carto.longitude, carto.latitude, 0)) || 0;\r\n const groundPos = Cesium.Cartesian3.fromDegrees(lng, lat, terrainHeight);\r\n const groundDashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n const groundLine = viewer.entities.add({\r\n polyline: {\r\n positions: [groundPos, clampedPos],\r\n width: options.width || 3,\r\n material: new Cesium.PolylineDashMaterialProperty({\r\n color: groundDashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n this.groundLineEntities.push(groundLine);\r\n if (this.positions.length >= 2) {\r\n const p1 = this.positions[this.positions.length - 2];\r\n const p2 = this.positions[this.positions.length - 1];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const entity = viewer.entities.add({\r\n polyline: {\r\n positions: [p1, p2],\r\n width: options.width || 3,\r\n material: options.lineColor || options.color || Cesium.Color.YELLOW,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color:\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n this.segmentEntities.push(entity);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3(\r\n (p1.x + p2.x) / 2,\r\n (p1.y + p2.y) / 2,\r\n (p1.z + p2.z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const id = `measure_horizontal_seg_${this.segmentLabelIds.length}_${Date.now()}`;\r\n this.segmentLabelIds.push(id);\r\n this.htmlLabelPool.add(\r\n { text: `${d.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || (this.firstHeight || 0),\r\n theme: 'measure-horizontal-seg',\r\n show: true,\r\n },\r\n );\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction(() => {\r\n if (this.positions.length < 2) {\r\n this.stop();\r\n return;\r\n }\r\n this.stop();\r\n if (this.previewLabelId) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.hoverPos) {\r\n this.hoverPos = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewGroundEntity) {\r\n this.viewer.entities.remove(this.previewGroundEntity);\r\n this.previewGroundEntity = null;\r\n }\r\n let total = 0;\r\n for (let i = 1; i < this.positions.length; i++) {\r\n const p1 = this.positions[i - 1];\r\n const p2 = this.positions[i];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n total += geodesic.surfaceDistance;\r\n }\r\n const last = this.positions[this.positions.length - 1];\r\n const lc = Cesium.Cartographic.fromCartesian(last);\r\n const id = this.totalLabelId || `measure_horizontal_total_${Date.now()}`;\r\n this.totalLabelId = id;\r\n this.htmlLabelPool.add(\r\n { text: `${total.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(lc.longitude),\r\n lat: Cesium.Math.toDegrees(lc.latitude),\r\n height: lc.height || (this.firstHeight || 0),\r\n theme: 'measure-horizontal-total',\r\n show: true,\r\n },\r\n );\r\n this.labelEntity = this.totalLabelId;\r\n const result = {\r\n entity: this.segmentEntities,\r\n label: this.labelEntity,\r\n segmentLabels: this.segmentLabelIds,\r\n positions: this.positions,\r\n distance: total,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length === 0) return;\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (!pos) return;\r\n this.hoverPos = pos;\r\n const carto = Cesium.Cartographic.fromCartesian(pos);\r\n const lng = Cesium.Math.toDegrees(carto.longitude);\r\n const lat = Cesium.Math.toDegrees(carto.latitude);\r\n const clampedPos = Cesium.Cartesian3.fromDegrees(lng, lat, this.firstHeight || 0);\r\n this.previewPos = clampedPos;\r\n const terrainHeight =\r\n viewer.scene.globe.getHeight(new Cesium.Cartographic(carto.longitude, carto.latitude, 0)) || 0;\r\n const groundPos = Cesium.Cartesian3.fromDegrees(lng, lat, terrainHeight);\r\n this.previewGroundPos = groundPos;\r\n const p1 = this.positions[this.positions.length - 1];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(clampedPos);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3(\r\n (p1.x + clampedPos.x) / 2,\r\n (p1.y + clampedPos.y) / 2,\r\n (p1.z + clampedPos.z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const id = this.previewLabelId || 'measure_horizontal_preview';\r\n this.previewLabelId = id;\r\n this.htmlLabelPool.add(\r\n { text: `${d.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || (this.firstHeight || 0),\r\n theme: 'measure-horizontal-seg',\r\n show: true,\r\n },\r\n );\r\n const groundDashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n if (!this.previewGroundEntity) {\r\n this.previewGroundEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewPos || !this.previewGroundPos) return [];\r\n return [this.previewGroundPos, this.previewPos];\r\n }, false),\r\n width: options.width || 3,\r\n material: new Cesium.PolylineDashMaterialProperty({\r\n color: groundDashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n }\r\n if (!this.previewEntity) {\r\n this.previewEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewPos || !this.positions.length) return [];\r\n const last = this.positions[this.positions.length - 1];\r\n return [last, this.previewPos];\r\n }, false),\r\n width: options.width || 3,\r\n material: options.lineColor || options.color || Cesium.Color.YELLOW,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color:\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n this.segmentEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.segmentEntities = [];\r\n this.groundLineEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.groundLineEntities = [];\r\n this.tempPoints.forEach((p) => this.viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n if (this.totalLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.totalLabelId]);\r\n this.totalLabelId = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewGroundEntity) {\r\n this.viewer.entities.remove(this.previewGroundEntity);\r\n this.previewGroundEntity = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.segmentLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.segmentLabelIds.slice());\r\n }\r\n this.segmentLabelIds = [];\r\n this.positions = [];\r\n this.hoverPos = null;\r\n this.labelEntity = null;\r\n this.firstHeight = null;\r\n this.previewPos = null;\r\n this.previewGroundPos = null;\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const lineColor = opts.lineColor || opts.color || Cesium.Color.YELLOW;\r\n const dashColor = (opts.dashLineColor || opts.lineColor || opts.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n const width = opts.width || 3;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (!posList.length) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-horizontal-total', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-horizontal-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n for (const pos of posList) {\r\n const point = viewer.entities.add({ position: pos, point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.tempPoints.push(point);\r\n const carto = Cesium.Cartographic.fromCartesian(pos);\r\n const lng = Cesium.Math.toDegrees(carto.longitude);\r\n const lat = Cesium.Math.toDegrees(carto.latitude);\r\n const terrainHeight = viewer.scene.globe.getHeight(new Cesium.Cartographic(carto.longitude, carto.latitude, 0)) || 0;\r\n const groundPos = Cesium.Cartesian3.fromDegrees(lng, lat, terrainHeight);\r\n const groundLine = viewer.entities.add({\r\n polyline: {\r\n positions: [groundPos, pos],\r\n width,\r\n material: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n this.groundLineEntities.push(groundLine);\r\n }\r\n for (let i = 1; i < posList.length; i++) {\r\n const p1 = posList[i - 1];\r\n const p2 = posList[i];\r\n const seg = viewer.entities.add({\r\n polyline: {\r\n positions: [p1, p2],\r\n width,\r\n material: lineColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n this.segmentEntities.push(seg);\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = record.id + `_seg_${i - 1}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add({ text: `${d.toFixed(2)} m` }, {\r\n id: sid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-horizontal-seg',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n });\r\n }\r\n let total = 0;\r\n for (let i = 1; i < posList.length; i++) {\r\n const c1 = Cesium.Cartographic.fromCartesian(posList[i - 1]);\r\n const c2 = Cesium.Cartographic.fromCartesian(posList[i]);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n total += geodesic.surfaceDistance;\r\n }\r\n const last = posList[posList.length - 1];\r\n const lc = Cesium.Cartographic.fromCartesian(last);\r\n const id = record.id + '_total';\r\n this.totalLabelId = id;\r\n this.htmlLabelPool.add({ text: `${total.toFixed(2)} m` }, {\r\n id,\r\n lon: Cesium.Math.toDegrees(lc.longitude),\r\n lat: Cesium.Math.toDegrees(lc.latitude),\r\n height: lc.height || 0,\r\n theme: 'measure-horizontal-total',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n });\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class VerticalMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private labelEntity: any = null;\r\n private positions: any[] = [];\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n private previewLabelId: string | null = null;\r\n private baseCarto: any = null;\r\n private baseUp: any = null;\r\n private tempPoints: any[] = [];\r\n private previewPointEntity: any = null;\r\n private previewEntity: any = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-vertical', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const ray0 = viewer.camera.getPickRay(movement.position);\r\n let cart = ray0 ? viewer.scene.globe.pick(ray0, viewer.scene) : null;\r\n if (!cart) cart = viewer.camera.pickEllipsoid(movement.position, Cesium.Ellipsoid.WGS84);\r\n if (!cart) cart = viewer.scene.pickPosition(movement.position);\r\n if (!cart) return;\r\n if (this.positions.length === 0) {\r\n const c0 = Cesium.Cartographic.fromCartesian(cart);\r\n this.baseCarto = new Cesium.Cartographic(c0.longitude, c0.latitude, 0);\r\n const base = Cesium.Ellipsoid.WGS84.cartographicToCartesian(this.baseCarto);\r\n this.baseUp = Cesium.Ellipsoid.WGS84.geodeticSurfaceNormalCartographic(this.baseCarto);\r\n this.positions.push(base);\r\n const basePoint = viewer.entities.add({\r\n position: base,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(basePoint);\r\n const solidColor = options.lineColor || options.color || Cesium.Color.CYAN;\r\n const dashColor =\r\n (\r\n options.dashLineColor ||\r\n options.lineColor ||\r\n options.color ||\r\n Cesium.Color.RED\r\n ).withAlpha?.(0.9) || Cesium.Color.RED;\r\n this.previewEntity = viewer.entities.add({\r\n polyline: {\r\n positions: [base, base],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n } else {\r\n if (!this.baseCarto || !this.baseUp) return;\r\n const base = this.positions[0];\r\n const ray = viewer.camera.getPickRay(movement.position);\r\n if (!ray) return;\r\n const O = ray.origin;\r\n const D = Cesium.Cartesian3.normalize(ray.direction, new Cesium.Cartesian3());\r\n const B = base;\r\n const U = this.baseUp;\r\n const w0 = Cesium.Cartesian3.subtract(O, B, new Cesium.Cartesian3());\r\n const a = Cesium.Cartesian3.dot(D, D);\r\n const b = -Cesium.Cartesian3.dot(D, U);\r\n const c = Cesium.Cartesian3.dot(U, U);\r\n const d = -Cesium.Cartesian3.dot(D, w0);\r\n const e = Cesium.Cartesian3.dot(U, w0);\r\n const den = a * c - b * b;\r\n if (Math.abs(den) < 1e-6) return;\r\n const s = (a * e - b * d) / den;\r\n const second = Cesium.Cartesian3.add(\r\n B,\r\n Cesium.Cartesian3.multiplyByScalar(U, s, new Cesium.Cartesian3()),\r\n new Cesium.Cartesian3(),\r\n );\r\n this.positions[1] = second;\r\n this.stop();\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewPointEntity) {\r\n this.viewer.entities.remove(this.previewPointEntity);\r\n this.previewPointEntity = null;\r\n }\r\n const solidColor2 = options.lineColor || options.color || Cesium.Color.CYAN;\r\n const dashColor2 = (\r\n options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED\r\n ).withAlpha?.(0.9) || Cesium.Color.RED;\r\n this.entity = viewer.entities.add({\r\n polyline: {\r\n positions: [base, second],\r\n width: options.width || 3,\r\n material: solidColor2,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor2,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n const secondPoint = viewer.entities.add({\r\n position: second,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(secondPoint);\r\n const c1 = this.baseCarto;\r\n const c2 = Cesium.Cartographic.fromCartesian(second);\r\n const vertical = Math.abs((c2.height || 0) - (c1.height || 0));\r\n const mid = new Cesium.Cartesian3(\r\n (this.positions[0].x + this.positions[1].x) / 2,\r\n (this.positions[0].y + this.positions[1].y) / 2,\r\n (this.positions[0].z + this.positions[1].z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n const id = this.htmlLabelId || `measure_vertical_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n this.htmlLabelPool.add(\r\n { text: `${vertical.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-vertical',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n },\r\n );\r\n const result = {\r\n entity: this.entity,\r\n label: this.labelEntity,\r\n positions: this.positions,\r\n vertical,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length < 1) return;\r\n if (!this.baseCarto || !this.baseUp) {\r\n const c0 = Cesium.Cartographic.fromCartesian(this.positions[0]);\r\n this.baseCarto = new Cesium.Cartographic(c0.longitude, c0.latitude, c0.height || 0);\r\n this.baseUp = Cesium.Ellipsoid.WGS84.geodeticSurfaceNormalCartographic(this.baseCarto);\r\n }\r\n const base = this.positions[0];\r\n const ray = viewer.camera.getPickRay(movement.endPosition);\r\n if (!ray) return;\r\n const O = ray.origin;\r\n const D = Cesium.Cartesian3.normalize(ray.direction, new Cesium.Cartesian3());\r\n const B = base;\r\n const U = this.baseUp;\r\n const w0 = Cesium.Cartesian3.subtract(O, B, new Cesium.Cartesian3());\r\n const a = Cesium.Cartesian3.dot(D, D);\r\n const b = -Cesium.Cartesian3.dot(D, U);\r\n const c = Cesium.Cartesian3.dot(U, U);\r\n const d = -Cesium.Cartesian3.dot(D, w0);\r\n const e = Cesium.Cartesian3.dot(U, w0);\r\n const den = a * c - b * b;\r\n if (Math.abs(den) < 1e-6) return;\r\n const s = (a * e - b * d) / den;\r\n const second = Cesium.Cartesian3.add(\r\n B,\r\n Cesium.Cartesian3.multiplyByScalar(U, s, new Cesium.Cartesian3()),\r\n new Cesium.Cartesian3(),\r\n );\r\n this.positions[1] = second;\r\n if (!this.previewEntity) {\r\n const solidColor = options.lineColor || options.color || Cesium.Color.CYAN;\r\n const dashColor =\r\n (\r\n options.dashLineColor ||\r\n options.lineColor ||\r\n options.color ||\r\n Cesium.Color.RED\r\n ).withAlpha?.(0.9) || Cesium.Color.RED;\r\n this.previewEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (this.positions.length < 2) return [];\r\n return [this.positions[0], this.positions[1]];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n }\r\n if (!this.previewPointEntity) {\r\n this.previewPointEntity = viewer.entities.add({\r\n position: second,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n } else {\r\n this.previewPointEntity.position = second;\r\n }\r\n const c1 = this.baseCarto;\r\n const c2 = Cesium.Cartographic.fromCartesian(second);\r\n const vertical = Math.abs((c2.height || 0) - (c1.height || 0));\r\n const mid = new Cesium.Cartesian3(\r\n (this.positions[0].x + second.x) / 2,\r\n (this.positions[0].y + second.y) / 2,\r\n (this.positions[0].z + second.z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const pid = this.previewLabelId || 'measure_vertical_preview';\r\n this.previewLabelId = pid;\r\n this.htmlLabelPool.add(\r\n { text: `${vertical.toFixed(2)} m` },\r\n {\r\n id: pid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-vertical',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n },\r\n );\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n if (this.labelEntity) {\r\n this.viewer.entities.remove(this.labelEntity);\r\n this.labelEntity = null;\r\n }\r\n this.tempPoints.forEach((p) => this.viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n if (this.previewPointEntity) {\r\n this.viewer.entities.remove(this.previewPointEntity);\r\n this.previewPointEntity = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.htmlLabelPool && this.htmlLabelId) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n this.positions = [];\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const lineColor = opts.lineColor || opts.color || Cesium.Color.CYAN;\r\n const dashColor = (opts.dashLineColor || opts.lineColor || opts.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n const width = opts.width || 3;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 2) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-vertical', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n const base = posList[0];\r\n const second = posList[1];\r\n const basePoint = viewer.entities.add({ position: base, point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n const secondPoint = viewer.entities.add({ position: second, point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.tempPoints.push(basePoint);\r\n this.tempPoints.push(secondPoint);\r\n this.entity = viewer.entities.add({ polyline: { positions: [base, second], width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) } });\r\n const c1 = Cesium.Cartographic.fromCartesian(base);\r\n const c2 = Cesium.Cartographic.fromCartesian(second);\r\n const vertical = Math.abs((c2.height || 0) - (c1.height || 0));\r\n const mid = new Cesium.Cartesian3((base.x + second.x) / 2, (base.y + second.y) / 2, (base.z + second.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const id = record.id + '_label';\r\n this.htmlLabelId = id;\r\n this.htmlLabelPool.add({ text: `${vertical.toFixed(2)} m` }, {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-vertical',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n });\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class TriangleMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private positions: any[] = [];\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n private segmentEntities: any[] = [];\r\n private angleMarkerEntities: any[] = [];\r\n private pointEntities: any[] = [];\r\n private segmentLabelIds: string[] = [];\r\n private angleLabelIds: string[] = [];\r\n private previewLabelId: string | null = null;\r\n private previewSegmentEntities: any[] = [];\r\n private previewAngleMarkerEntities: any[] = [];\r\n private previewPointEntity: any = null;\r\n private previewLow: any = null;\r\n private previewHigh: any = null;\r\n private previewThird: any = null;\r\n private previewMarkerP1: any = null;\r\n private previewMarkerP2: any = null;\r\n private previewMarkerCorner: any = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-triangle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-triangle-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-triangle-angle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n this.positions.push(pos);\r\n const p = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.pointEntities.push(p);\r\n if (this.positions.length === 2) {\r\n this.stop();\r\n this.previewSegmentEntities.forEach((e) => viewer.entities.remove(e));\r\n this.previewSegmentEntities = [];\r\n this.previewAngleMarkerEntities.forEach((e) => viewer.entities.remove(e));\r\n this.previewAngleMarkerEntities = [];\r\n if (this.previewPointEntity) {\r\n viewer.entities.remove(this.previewPointEntity);\r\n this.previewPointEntity = null;\r\n }\r\n const c1 = Cesium.Cartographic.fromCartesian(this.positions[0]);\r\n const c2 = Cesium.Cartographic.fromCartesian(this.positions[1]);\r\n const h1 = c1.height || 0;\r\n const h2 = c2.height || 0;\r\n const low = h1 <= h2 ? this.positions[0] : this.positions[1];\r\n const high = h1 > h2 ? this.positions[0] : this.positions[1];\r\n const cl = Cesium.Cartographic.fromCartesian(low);\r\n const ch = Cesium.Cartographic.fromCartesian(high);\r\n const maxH = Math.max(h1, h2);\r\n const third = Cesium.Cartesian3.fromDegrees(\r\n Cesium.Math.toDegrees(cl.longitude),\r\n Cesium.Math.toDegrees(cl.latitude),\r\n maxH,\r\n );\r\n const solidColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor = (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n const vertical = viewer.entities.add({\r\n polyline: {\r\n positions: [low, third],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const horizontal = viewer.entities.add({\r\n polyline: {\r\n positions: [third, high],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const hypotenuse = viewer.entities.add({\r\n polyline: {\r\n positions: [low, high],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n this.segmentEntities.push(vertical, horizontal, hypotenuse);\r\n const lenV = Cesium.Cartesian3.distance(low, third);\r\n const lenH = Cesium.Cartesian3.distance(third, high);\r\n const lenHyp = Cesium.Cartesian3.distance(low, high);\r\n const midV = new Cesium.Cartesian3((low.x + third.x) / 2, (low.y + third.y) / 2, (low.z + third.z) / 2);\r\n const midH = new Cesium.Cartesian3((third.x + high.x) / 2, (third.y + high.y) / 2, (third.z + high.z) / 2);\r\n const midHyp = new Cesium.Cartesian3((low.x + high.x) / 2, (low.y + high.y) / 2, (low.z + high.z) / 2);\r\n const mV = Cesium.Cartographic.fromCartesian(midV);\r\n const mH = Cesium.Cartographic.fromCartesian(midH);\r\n const mHyp = Cesium.Cartographic.fromCartesian(midHyp);\r\n const idV = 'measure_triangle_seg_v';\r\n const idH = 'measure_triangle_seg_h';\r\n const idHyp = 'measure_triangle_seg_hyp';\r\n this.segmentLabelIds = [idV, idH, idHyp];\r\n this.htmlLabelPool.add({ text: `${lenV.toFixed(2)} m` }, { id: idV, lon: Cesium.Math.toDegrees(mV.longitude), lat: Cesium.Math.toDegrees(mV.latitude), height: mV.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${lenH.toFixed(2)} m` }, { id: idH, lon: Cesium.Math.toDegrees(mH.longitude), lat: Cesium.Math.toDegrees(mH.latitude), height: mH.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${lenHyp.toFixed(2)} m` }, { id: idHyp, lon: Cesium.Math.toDegrees(mHyp.longitude), lat: Cesium.Math.toDegrees(mHyp.latitude), height: mHyp.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n const vLowToHigh = Cesium.Cartesian3.subtract(high, low, new Cesium.Cartesian3());\r\n const vLowToThird = Cesium.Cartesian3.subtract(third, low, new Cesium.Cartesian3());\r\n const vHighToThird = Cesium.Cartesian3.subtract(third, high, new Cesium.Cartesian3());\r\n const vHighToLow = Cesium.Cartesian3.subtract(low, high, new Cesium.Cartesian3());\r\n const dotA = Cesium.Cartesian3.dot(vLowToHigh, vLowToThird);\r\n const magA = Math.sqrt(Cesium.Cartesian3.dot(vLowToHigh, vLowToHigh)) * Math.sqrt(Cesium.Cartesian3.dot(vLowToThird, vLowToThird));\r\n const dotB = Cesium.Cartesian3.dot(vHighToThird, vHighToLow);\r\n const magB = Math.sqrt(Cesium.Cartesian3.dot(vHighToThird, vHighToThird)) * Math.sqrt(Cesium.Cartesian3.dot(vHighToLow, vHighToLow));\r\n const angleA = Math.acos(Math.min(Math.max(dotA / (magA || 1), -1), 1));\r\n const angleB = Math.acos(Math.min(Math.max(dotB / (magB || 1), -1), 1));\r\n const cLow = Cesium.Cartographic.fromCartesian(low);\r\n const cHigh = Cesium.Cartographic.fromCartesian(high);\r\n const idAngA = 'measure_triangle_angle_a';\r\n const idAngB = 'measure_triangle_angle_b';\r\n this.angleLabelIds = [idAngA, idAngB];\r\n this.htmlLabelPool.add({ text: `${(angleA * 180 / Math.PI).toFixed(2)}°` }, { id: idAngA, lon: Cesium.Math.toDegrees(cLow.longitude), lat: Cesium.Math.toDegrees(cLow.latitude), height: cLow.height || 0, theme: 'measure-triangle-angle', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${(angleB * 180 / Math.PI).toFixed(2)}°` }, { id: idAngB, lon: Cesium.Math.toDegrees(cHigh.longitude), lat: Cesium.Math.toDegrees(cHigh.latitude), height: cHigh.height || 0, theme: 'measure-triangle-angle', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n const ratio = Math.max(0.01, Math.min(0.5, options.angleMarkerRatio ?? 0.2));\r\n const markerLen = Math.min(lenV, lenH) * ratio;\r\n if (lenV > 0.001 && lenH > 0.001) {\r\n const dirV = Cesium.Cartesian3.normalize(\r\n Cesium.Cartesian3.subtract(low, third, new Cesium.Cartesian3()),\r\n new Cesium.Cartesian3(),\r\n );\r\n const dirH = Cesium.Cartesian3.normalize(\r\n Cesium.Cartesian3.subtract(high, third, new Cesium.Cartesian3()),\r\n new Cesium.Cartesian3(),\r\n );\r\n const pOffV = new Cesium.Cartesian3(\r\n third.x + dirV.x * markerLen,\r\n third.y + dirV.y * markerLen,\r\n third.z + dirV.z * markerLen,\r\n );\r\n const pOffH = new Cesium.Cartesian3(\r\n third.x + dirH.x * markerLen,\r\n third.y + dirH.y * markerLen,\r\n third.z + dirH.z * markerLen,\r\n );\r\n const pCorner = new Cesium.Cartesian3(\r\n third.x + dirV.x * markerLen + dirH.x * markerLen,\r\n third.y + dirV.y * markerLen + dirH.y * markerLen,\r\n third.z + dirV.z * markerLen + dirH.z * markerLen,\r\n );\r\n const rightMarkerSeg1 = viewer.entities.add({\r\n polyline: {\r\n positions: [pOffV, pCorner],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const rightMarkerSeg2 = viewer.entities.add({\r\n polyline: {\r\n positions: [pOffH, pCorner],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n this.angleMarkerEntities.push(rightMarkerSeg1, rightMarkerSeg2);\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n const result = {\r\n entity: this.segmentEntities,\r\n positions: [low, high, third],\r\n lengths: { vertical: lenV, horizontal: lenH, hypotenuse: lenHyp },\r\n angles: { acuteA: angleA, acuteB: angleB },\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length !== 1) return;\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (!pos) return;\r\n const c1 = Cesium.Cartographic.fromCartesian(this.positions[0]);\r\n const c2 = Cesium.Cartographic.fromCartesian(pos);\r\n const h1 = c1.height || 0;\r\n const h2 = c2.height || 0;\r\n const low = h1 <= h2 ? this.positions[0] : pos;\r\n const high = h1 > h2 ? this.positions[0] : pos;\r\n const cl = Cesium.Cartographic.fromCartesian(low);\r\n const maxH = Math.max(h1, h2);\r\n const third = Cesium.Cartesian3.fromDegrees(\r\n this.Cesium.Math.toDegrees(cl.longitude),\r\n this.Cesium.Math.toDegrees(cl.latitude),\r\n maxH,\r\n );\r\n this.previewLow = low;\r\n this.previewHigh = high;\r\n this.previewThird = third;\r\n const solidColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor = (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n if (!this.previewPointEntity) {\r\n this.previewPointEntity = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n } else {\r\n this.previewPointEntity.position = pos;\r\n }\r\n if (!this.previewSegmentEntities.length) {\r\n const pv = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewLow || !this.previewThird) return [];\r\n return [this.previewLow, this.previewThird];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const ph = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewThird || !this.previewHigh) return [];\r\n return [this.previewThird, this.previewHigh];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const phyp = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewLow || !this.previewHigh) return [];\r\n return [this.previewLow, this.previewHigh];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n this.previewSegmentEntities.push(pv, ph, phyp);\r\n }\r\n const lenV = Cesium.Cartesian3.distance(low, third);\r\n const lenH = Cesium.Cartesian3.distance(third, high);\r\n const lenHyp = Cesium.Cartesian3.distance(low, high);\r\n const vLowToHigh = Cesium.Cartesian3.subtract(high, low, new Cesium.Cartesian3());\r\n const vLowToThird = Cesium.Cartesian3.subtract(third, low, new Cesium.Cartesian3());\r\n const vHighToThird = Cesium.Cartesian3.subtract(third, high, new Cesium.Cartesian3());\r\n const vHighToLow = Cesium.Cartesian3.subtract(low, high, new Cesium.Cartesian3());\r\n const dotA = Cesium.Cartesian3.dot(vLowToHigh, vLowToThird);\r\n const magA = Math.sqrt(Cesium.Cartesian3.dot(vLowToHigh, vLowToHigh)) * Math.sqrt(Cesium.Cartesian3.dot(vLowToThird, vLowToThird));\r\n const dotB = Cesium.Cartesian3.dot(vHighToThird, vHighToLow);\r\n const magB = Math.sqrt(Cesium.Cartesian3.dot(vHighToThird, vHighToThird)) * Math.sqrt(Cesium.Cartesian3.dot(vHighToLow, vHighToLow));\r\n const angleA = Math.acos(Math.min(Math.max((dotA / (magA || 1)), -1), 1));\r\n const angleB = Math.acos(Math.min(Math.max((dotB / (magB || 1)), -1), 1));\r\n const midV = new Cesium.Cartesian3((low.x + third.x) / 2, (low.y + third.y) / 2, (low.z + third.z) / 2);\r\n const midH = new Cesium.Cartesian3((third.x + high.x) / 2, (third.y + high.y) / 2, (third.z + high.z) / 2);\r\n const midHyp = new Cesium.Cartesian3((low.x + high.x) / 2, (low.y + high.y) / 2, (low.z + high.z) / 2);\r\n const mV = Cesium.Cartographic.fromCartesian(midV);\r\n const mH = Cesium.Cartographic.fromCartesian(midH);\r\n const mHyp = Cesium.Cartographic.fromCartesian(midHyp);\r\n const cLow = Cesium.Cartographic.fromCartesian(low);\r\n const cHigh = Cesium.Cartographic.fromCartesian(high);\r\n const idV = 'measure_triangle_seg_v';\r\n const idH = 'measure_triangle_seg_h';\r\n const idHyp = 'measure_triangle_seg_hyp';\r\n const idAngA = 'measure_triangle_angle_a';\r\n const idAngB = 'measure_triangle_angle_b';\r\n if (this.segmentLabelIds.length === 0) {\r\n this.segmentLabelIds = [idV, idH, idHyp];\r\n }\r\n if (this.angleLabelIds.length === 0) {\r\n this.angleLabelIds = [idAngA, idAngB];\r\n }\r\n this.htmlLabelPool.add({ text: `${lenV.toFixed(2)} m` }, { id: idV, lon: Cesium.Math.toDegrees(mV.longitude), lat: Cesium.Math.toDegrees(mV.latitude), height: mV.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${lenH.toFixed(2)} m` }, { id: idH, lon: Cesium.Math.toDegrees(mH.longitude), lat: Cesium.Math.toDegrees(mH.latitude), height: mH.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${lenHyp.toFixed(2)} m` }, { id: idHyp, lon: Cesium.Math.toDegrees(mHyp.longitude), lat: Cesium.Math.toDegrees(mHyp.latitude), height: mHyp.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${(angleA * 180 / Math.PI).toFixed(2)}°` }, { id: idAngA, lon: Cesium.Math.toDegrees(cLow.longitude), lat: Cesium.Math.toDegrees(cLow.latitude), height: cLow.height || 0, theme: 'measure-triangle-angle', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${(angleB * 180 / Math.PI).toFixed(2)}°` }, { id: idAngB, lon: Cesium.Math.toDegrees(cHigh.longitude), lat: Cesium.Math.toDegrees(cHigh.latitude), height: cHigh.height || 0, theme: 'measure-triangle-angle', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n const ratio = Math.max(0.01, Math.min(0.5, options.angleMarkerRatio ?? 0.2));\r\n const markerLen = Math.min(lenV, lenH) * ratio;\r\n if (lenV > 0.001 && lenH > 0.001) {\r\n const dirV = Cesium.Cartesian3.normalize(\r\n Cesium.Cartesian3.subtract(low, third, new Cesium.Cartesian3()),\r\n new Cesium.Cartesian3(),\r\n );\r\n const dirH = Cesium.Cartesian3.normalize(\r\n Cesium.Cartesian3.subtract(high, third, new Cesium.Cartesian3()),\r\n new Cesium.Cartesian3(),\r\n );\r\n const pOffV = new Cesium.Cartesian3(\r\n third.x + dirV.x * markerLen,\r\n third.y + dirV.y * markerLen,\r\n third.z + dirV.z * markerLen,\r\n );\r\n const pOffH = new Cesium.Cartesian3(\r\n third.x + dirH.x * markerLen,\r\n third.y + dirH.y * markerLen,\r\n third.z + dirH.z * markerLen,\r\n );\r\n const pCorner = new Cesium.Cartesian3(\r\n third.x + dirV.x * markerLen + dirH.x * markerLen,\r\n third.y + dirV.y * markerLen + dirH.y * markerLen,\r\n third.z + dirV.z * markerLen + dirH.z * markerLen,\r\n );\r\n this.previewMarkerP1 = pOffV;\r\n this.previewMarkerP2 = pOffH;\r\n this.previewMarkerCorner = pCorner;\r\n if (!this.previewAngleMarkerEntities.length) {\r\n const rightMarkerSeg1 = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewMarkerP1 || !this.previewMarkerCorner) return [];\r\n return [this.previewMarkerP1, this.previewMarkerCorner];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const rightMarkerSeg2 = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewMarkerP2 || !this.previewMarkerCorner) return [];\r\n return [this.previewMarkerP2, this.previewMarkerCorner];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n this.previewAngleMarkerEntities.push(rightMarkerSeg1, rightMarkerSeg2);\r\n }\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n this.segmentEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.segmentEntities = [];\r\n this.angleMarkerEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.angleMarkerEntities = [];\r\n this.pointEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.pointEntities = [];\r\n this.previewSegmentEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.previewSegmentEntities = [];\r\n this.previewAngleMarkerEntities.forEach((e) => this.viewer.entities.remove(e));\r\n this.previewAngleMarkerEntities = [];\r\n if (this.previewPointEntity) {\r\n this.viewer.entities.remove(this.previewPointEntity);\r\n this.previewPointEntity = null;\r\n }\r\n if (this.htmlLabelPool && this.htmlLabelId) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.segmentLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.segmentLabelIds.slice());\r\n }\r\n if (this.angleLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.angleLabelIds.slice());\r\n }\r\n this.segmentLabelIds = [];\r\n this.angleLabelIds = [];\r\n this.positions = [];\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const lineColor = opts.lineColor || opts.color || Cesium.Color.YELLOW;\r\n const dashColor = (opts.dashLineColor || opts.lineColor || opts.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n const width = opts.width || 3;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 2) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-triangle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-triangle-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-triangle-angle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n const c1 = Cesium.Cartographic.fromCartesian(posList[0]);\r\n const c2 = Cesium.Cartographic.fromCartesian(posList[1]);\r\n const h1 = c1.height || 0;\r\n const h2 = c2.height || 0;\r\n const low = h1 <= h2 ? posList[0] : posList[1];\r\n const high = h1 > h2 ? posList[0] : posList[1];\r\n const pLow = viewer.entities.add({ position: low, point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n const pHigh = viewer.entities.add({ position: high, point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.pointEntities.push(pLow, pHigh);\r\n const cl = Cesium.Cartographic.fromCartesian(low);\r\n const maxH = Math.max(h1, h2);\r\n const third = Cesium.Cartesian3.fromDegrees(\r\n Cesium.Math.toDegrees(cl.longitude),\r\n Cesium.Math.toDegrees(cl.latitude),\r\n maxH,\r\n );\r\n const vertical = viewer.entities.add({\r\n polyline: { positions: [low, third], width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) },\r\n });\r\n const horizontal = viewer.entities.add({\r\n polyline: { positions: [third, high], width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) },\r\n });\r\n const hypotenuse = viewer.entities.add({\r\n polyline: { positions: [low, high], width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) },\r\n });\r\n this.segmentEntities.push(vertical, horizontal, hypotenuse);\r\n const lenV = Cesium.Cartesian3.distance(low, third);\r\n const lenH = Cesium.Cartesian3.distance(third, high);\r\n const lenHyp = Cesium.Cartesian3.distance(low, high);\r\n const midV = new Cesium.Cartesian3((low.x + third.x) / 2, (low.y + third.y) / 2, (low.z + third.z) / 2);\r\n const midH = new Cesium.Cartesian3((third.x + high.x) / 2, (third.y + high.y) / 2, (third.z + high.z) / 2);\r\n const midHyp = new Cesium.Cartesian3((low.x + high.x) / 2, (low.y + high.y) / 2, (low.z + high.z) / 2);\r\n const mV = Cesium.Cartographic.fromCartesian(midV);\r\n const mH = Cesium.Cartographic.fromCartesian(midH);\r\n const mHyp = Cesium.Cartographic.fromCartesian(midHyp);\r\n const idV = record.id + '_tri_v';\r\n const idH = record.id + '_tri_h';\r\n const idHyp = record.id + '_tri_hyp';\r\n this.segmentLabelIds = [idV, idH, idHyp];\r\n this.htmlLabelPool.add({ text: `${lenV.toFixed(2)} m` }, { id: idV, lon: Cesium.Math.toDegrees(mV.longitude), lat: Cesium.Math.toDegrees(mV.latitude), height: mV.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${lenH.toFixed(2)} m` }, { id: idH, lon: Cesium.Math.toDegrees(mH.longitude), lat: Cesium.Math.toDegrees(mH.latitude), height: mH.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${lenHyp.toFixed(2)} m` }, { id: idHyp, lon: Cesium.Math.toDegrees(mHyp.longitude), lat: Cesium.Math.toDegrees(mHyp.latitude), height: mHyp.height || 0, theme: 'measure-triangle-seg', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n const vLowToHigh = Cesium.Cartesian3.subtract(high, low, new Cesium.Cartesian3());\r\n const vLowToThird = Cesium.Cartesian3.subtract(third, low, new Cesium.Cartesian3());\r\n const vHighToThird = Cesium.Cartesian3.subtract(third, high, new Cesium.Cartesian3());\r\n const vHighToLow = Cesium.Cartesian3.subtract(low, high, new Cesium.Cartesian3());\r\n const dotA = Cesium.Cartesian3.dot(vLowToHigh, vLowToThird);\r\n const magA = Math.sqrt(Cesium.Cartesian3.dot(vLowToHigh, vLowToHigh)) * Math.sqrt(Cesium.Cartesian3.dot(vLowToThird, vLowToThird));\r\n const dotB = Cesium.Cartesian3.dot(vHighToThird, vHighToLow);\r\n const magB = Math.sqrt(Cesium.Cartesian3.dot(vHighToThird, vHighToThird)) * Math.sqrt(Cesium.Cartesian3.dot(vHighToLow, vHighToLow));\r\n const angleA = Math.acos(Math.min(Math.max(dotA / (magA || 1), -1), 1));\r\n const angleB = Math.acos(Math.min(Math.max(dotB / (magB || 1), -1), 1));\r\n const cLow = Cesium.Cartographic.fromCartesian(low);\r\n const cHigh = Cesium.Cartographic.fromCartesian(high);\r\n const t = opts.labelText || { angle: '角度' };\r\n const idAngA = record.id + '_tri_angA';\r\n const idAngB = record.id + '_tri_angB';\r\n this.angleLabelIds = [idAngA, idAngB];\r\n this.htmlLabelPool.add({ text: `${t.angle}:${(angleA * 180 / Math.PI).toFixed(2)}°` }, { id: idAngA, lon: Cesium.Math.toDegrees(cLow.longitude), lat: Cesium.Math.toDegrees(cLow.latitude), height: cLow.height || 0, theme: 'measure-triangle-angle', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n this.htmlLabelPool.add({ text: `${t.angle}:${(angleB * 180 / Math.PI).toFixed(2)}°` }, { id: idAngB, lon: Cesium.Math.toDegrees(cHigh.longitude), lat: Cesium.Math.toDegrees(cHigh.latitude), height: cHigh.height || 0, theme: 'measure-triangle-angle', show: true, style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' } });\r\n const ratio = Math.max(0.01, Math.min(0.5, opts.angleMarkerRatio ?? 0.2));\r\n const markerLen = Math.min(lenV, lenH) * ratio;\r\n if (lenV > 0.001 && lenH > 0.001) {\r\n const dirV = Cesium.Cartesian3.normalize(Cesium.Cartesian3.subtract(low, third, new Cesium.Cartesian3()), new Cesium.Cartesian3());\r\n const dirH = Cesium.Cartesian3.normalize(Cesium.Cartesian3.subtract(high, third, new Cesium.Cartesian3()), new Cesium.Cartesian3());\r\n const pOffV = new Cesium.Cartesian3(third.x + dirV.x * markerLen, third.y + dirV.y * markerLen, third.z + dirV.z * markerLen);\r\n const pOffH = new Cesium.Cartesian3(third.x + dirH.x * markerLen, third.y + dirH.y * markerLen, third.z + dirH.z * markerLen);\r\n const pCorner = new Cesium.Cartesian3(third.x + dirV.x * markerLen + dirH.x * markerLen, third.y + dirV.y * markerLen + dirH.y * markerLen, third.z + dirV.z * markerLen + dirH.z * markerLen);\r\n const rightMarkerSeg1 = viewer.entities.add({ polyline: { positions: [pOffV, pCorner], width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) } });\r\n const rightMarkerSeg2 = viewer.entities.add({ polyline: { positions: [pOffH, pCorner], width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) } });\r\n this.angleMarkerEntities.push(rightMarkerSeg1, rightMarkerSeg2);\r\n }\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class SpaceMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private labelEntity: any = null;\r\n private positions: any[] = [];\r\n private tempPoints: any[] = [];\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n private previewEntity: any = null;\r\n private previewPos: any = null;\r\n private previewLabelId: string | null = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-space', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n this.positions.push(pos);\r\n const point = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(point);\r\n if (this.positions.length === 2) {\r\n this.stop();\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n const p1 = this.positions[0];\r\n const p2 = this.positions[1];\r\n const solidColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor = (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n this.entity = viewer.entities.add({\r\n polyline: {\r\n positions: [p1, p2],\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n const total = Cesium.Cartesian3.distance(p1, p2);\r\n const last = p2;\r\n const lc = Cesium.Cartographic.fromCartesian(last);\r\n const id = this.htmlLabelId || `measure_space_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n this.htmlLabelPool.add(\r\n { text: `${total.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(lc.longitude),\r\n lat: Cesium.Math.toDegrees(lc.latitude),\r\n height: lc.height || 0,\r\n theme: 'measure-space',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n },\r\n );\r\n const result = {\r\n entity: this.entity,\r\n label: this.labelEntity,\r\n positions: this.positions,\r\n distance: total,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length !== 1) return;\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (!pos) return;\r\n this.previewPos = pos;\r\n const p1 = this.positions[0];\r\n const d = Cesium.Cartesian3.distance(p1, pos);\r\n const mid = new Cesium.Cartesian3(\r\n (p1.x + pos.x) / 2,\r\n (p1.y + pos.y) / 2,\r\n (p1.z + pos.z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const pid = this.previewLabelId || 'measure_space_preview';\r\n this.previewLabelId = pid;\r\n this.htmlLabelPool.add(\r\n { text: `${d.toFixed(2)} m` },\r\n {\r\n id: pid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-space',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n },\r\n );\r\n const solidColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor = (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n if (!this.previewEntity) {\r\n this.previewEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewPos || !this.positions.length) return [];\r\n const first = this.positions[0];\r\n return [first, this.previewPos];\r\n }, false),\r\n width: options.width || 3,\r\n material: solidColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n \r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n if (this.labelEntity) {\r\n this.viewer.entities.remove(this.labelEntity);\r\n this.labelEntity = null;\r\n }\r\n if (this.htmlLabelPool && this.htmlLabelId) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n this.tempPoints.forEach((p) => this.viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n this.positions = [];\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const lineColor = opts.lineColor || opts.color || Cesium.Color.YELLOW;\r\n const dashColor = (opts.dashLineColor || opts.lineColor || opts.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n const width = opts.width || 3;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (!posList.length) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-space', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n if (posList.length >= 1) {\r\n const p0 = viewer.entities.add({ position: posList[0], point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.tempPoints.push(p0);\r\n }\r\n if (posList.length >= 2) {\r\n const p1 = viewer.entities.add({ position: posList[1], point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.tempPoints.push(p1);\r\n this.entity = viewer.entities.add({\r\n polyline: {\r\n positions: [posList[0], posList[1]],\r\n width,\r\n material: lineColor,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }),\r\n },\r\n });\r\n const total = Cesium.Cartesian3.distance(posList[0], posList[1]);\r\n const lc = Cesium.Cartographic.fromCartesian(posList[1]);\r\n const id = record.id + '_label';\r\n this.htmlLabelId = id;\r\n this.htmlLabelPool.add({ text: `${total.toFixed(2)} m` }, {\r\n id,\r\n lon: Cesium.Math.toDegrees(lc.longitude),\r\n lat: Cesium.Math.toDegrees(lc.latitude),\r\n height: lc.height || 0,\r\n theme: 'measure-space',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n });\r\n }\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class AreaMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private labelEntity: any = null;\r\n private positions: any[] = [];\r\n private tempPoints: any[] = [];\r\n private primitive: any = null;\r\n private previewEntity: any = null;\r\n private previewPos: any = null;\r\n private edgeEntities: any[] = [];\r\n private pointEntities: any[] = [];\r\n private previewEdgeEntity: any = null;\r\n private previewPointEntities: any[] = [];\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n private previewLabelId: string | null = null;\r\n private segmentLabelIds: string[] = [];\r\n private angleLabelIds: string[] = [];\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-area', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-area-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-area-angle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n this.positions.push(pos);\r\n const point = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(point);\r\n if (this.primitive) {\r\n viewer.scene.primitives.remove(this.primitive);\r\n this.primitive = null;\r\n }\r\n const hierarchy = new Cesium.PolygonHierarchy(this.positions.slice());\r\n const geom = new Cesium.PolygonGeometry({\r\n polygonHierarchy: hierarchy,\r\n vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n const occludedColor = (options.color && options.color.withAlpha)\r\n ? options.color.withAlpha(0.25)\r\n : Cesium.Color.RED.withAlpha(0.4);\r\n this.primitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color: occludedColor }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n });\r\n viewer.scene.primitives.add(this.primitive);\r\n if (this.positions.length >= 2) {\r\n if (this.edgeEntities.length) {\r\n for (const e of this.edgeEntities) {\r\n try {\r\n viewer.entities.remove(e);\r\n } catch {}\r\n }\r\n this.edgeEntities = [];\r\n }\r\n const lineColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n const polylinePositions = this.positions.concat([this.positions[0]]);\r\n const lineEntity = viewer.entities.add({\r\n polyline: {\r\n positions: polylinePositions,\r\n width: options.width || 2,\r\n material: lineColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n this.edgeEntities.push(lineEntity);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length === 0) return;\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (!pos) return;\r\n this.previewPos = pos;\r\n const pts = this.positions.concat([pos]);\r\n const center = new Cesium.Cartesian3(\r\n pts.reduce((s: number, p: any) => s + p.x, 0) / pts.length,\r\n pts.reduce((s: number, p: any) => s + p.y, 0) / pts.length,\r\n pts.reduce((s: number, p: any) => s + p.z, 0) / pts.length,\r\n );\r\n const plane = new Cesium.EllipsoidTangentPlane(center, Cesium.Ellipsoid.WGS84);\r\n const points2D = plane.projectPointsOntoPlane(pts);\r\n let area2D = 0;\r\n for (let i = 0; i < points2D.length; i++) {\r\n const j = (i + 1) % points2D.length;\r\n area2D += points2D[i].x * points2D[j].y - points2D[j].x * points2D[i].y;\r\n }\r\n area2D = Math.abs(area2D) / 2;\r\n const cc = Cesium.Cartographic.fromCartesian(center);\r\n const pid = this.previewLabelId || 'measure_area_preview';\r\n this.previewLabelId = pid;\r\n const t = options.labelText || { area: '面积' };\r\n this.htmlLabelPool.add(\r\n { text: `${t.area}:${area2D.toFixed(2)} m²` },\r\n {\r\n id: pid,\r\n lon: Cesium.Math.toDegrees(cc.longitude),\r\n lat: Cesium.Math.toDegrees(cc.latitude),\r\n height: cc.height || 0,\r\n theme: 'measure-area',\r\n show: true,\r\n },\r\n );\r\n if (!this.previewEntity) {\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n this.previewEntity = viewer.entities.add({\r\n polygon: {\r\n hierarchy: new Cesium.CallbackProperty(() => {\r\n if (!this.previewPos || !this.positions.length) return undefined;\r\n const all = this.positions.concat([this.previewPos]);\r\n return new Cesium.PolygonHierarchy(all);\r\n }, false),\r\n material: color,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n },\r\n });\r\n const lineColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n this.previewEdgeEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewPos || !this.positions.length) return [];\r\n const all = this.positions.concat([this.previewPos, this.positions[0]]);\r\n return all;\r\n }, false),\r\n width: options.width || 2,\r\n material: lineColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n const pointColor = options.pointColor || options.color || Cesium.Color.YELLOW;\r\n const hoverPoint = viewer.entities.add({\r\n position: new Cesium.CallbackProperty(() => this.previewPos || this.positions[this.positions.length - 1], false),\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.previewPointEntities.push(hoverPoint);\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n this.handler.setInputAction(() => {\r\n if (this.positions.length < 3) {\r\n this.stop();\r\n return;\r\n }\r\n if (this.positions.length >= 3) {\r\n this.positions.pop();\r\n const lastPoint = this.tempPoints.pop();\r\n if (lastPoint) this.viewer.entities.remove(lastPoint);\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewEdgeEntity) {\r\n this.viewer.entities.remove(this.previewEdgeEntity);\r\n this.previewEdgeEntity = null;\r\n }\r\n if (this.previewPointEntities.length) {\r\n for (const p of this.previewPointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.previewPointEntities = [];\r\n }\r\n this.previewPos = null;\r\n this.stop();\r\n const center = new Cesium.Cartesian3(\r\n this.positions.reduce((s: number, p: any) => s + p.x, 0) / this.positions.length,\r\n this.positions.reduce((s: number, p: any) => s + p.y, 0) / this.positions.length,\r\n this.positions.reduce((s: number, p: any) => s + p.z, 0) / this.positions.length,\r\n );\r\n const plane = new Cesium.EllipsoidTangentPlane(center, Cesium.Ellipsoid.WGS84);\r\n const points2D = plane.projectPointsOntoPlane(this.positions);\r\n let area2D = 0;\r\n for (let i = 0; i < points2D.length; i++) {\r\n const j = (i + 1) % points2D.length;\r\n area2D += points2D[i].x * points2D[j].y - points2D[j].x * points2D[i].y;\r\n }\r\n area2D = Math.abs(area2D) / 2;\r\n const cc = Cesium.Cartographic.fromCartesian(center);\r\n const id = this.htmlLabelId || `measure_area_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n const t = options.labelText || { area: '面积', side: '边长', angle: '角度' };\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n this.htmlLabelPool.add(\r\n { text: `${t.area}:${area2D.toFixed(2)} m²` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(cc.longitude),\r\n lat: Cesium.Math.toDegrees(cc.latitude),\r\n height: cc.height || 0,\r\n theme: 'measure-area',\r\n show: true,\r\n },\r\n );\r\n this.labelEntity = this.htmlLabelId;\r\n for (let i = 0; i < this.positions.length; i++) {\r\n const j = (i + 1) % this.positions.length;\r\n const p1 = this.positions[i];\r\n const p2 = this.positions[j];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = `measure_area_seg_${Date.now()}_${i}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add(\r\n { text: `${t.side}:${d.toFixed(2)} m` },\r\n {\r\n id: sid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-area-seg',\r\n show: true,\r\n },\r\n );\r\n }\r\n const p2d = points2D;\r\n for (let i = 0; i < p2d.length; i++) {\r\n const prev = p2d[(i - 1 + p2d.length) % p2d.length];\r\n const curr = p2d[i];\r\n const next = p2d[(i + 1) % p2d.length];\r\n const v1x = prev.x - curr.x;\r\n const v1y = prev.y - curr.y;\r\n const v2x = next.x - curr.x;\r\n const v2y = next.y - curr.y;\r\n const len1 = Math.sqrt(v1x * v1x + v1y * v1y);\r\n const len2 = Math.sqrt(v2x * v2x + v2y * v2y);\r\n if (!len1 || !len2) continue;\r\n const dot = (v1x / len1) * (v2x / len2) + (v1y / len1) * (v2y / len2);\r\n const ang = Math.acos(Math.min(1, Math.max(-1, dot))) * (180 / Math.PI);\r\n const pc = Cesium.Cartographic.fromCartesian(this.positions[i]);\r\n const aid = `measure_area_angle_${Date.now()}_${i}`;\r\n this.angleLabelIds.push(aid);\r\n this.htmlLabelPool.add(\r\n { text: `${t.angle}:${ang.toFixed(2)} °` },\r\n {\r\n id: aid,\r\n lon: Cesium.Math.toDegrees(pc.longitude),\r\n lat: Cesium.Math.toDegrees(pc.latitude),\r\n height: pc.height || 0,\r\n theme: 'measure-area-angle',\r\n show: true,\r\n },\r\n );\r\n }\r\n const result = {\r\n entity: this.primitive,\r\n label: this.labelEntity,\r\n positions: this.positions,\r\n area: area2D,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n if (this.primitive) {\r\n this.viewer.scene.primitives.remove(this.primitive);\r\n this.primitive = null;\r\n }\r\n if (this.edgeEntities.length) {\r\n for (const e of this.edgeEntities) {\r\n try {\r\n this.viewer.entities.remove(e);\r\n } catch {}\r\n }\r\n this.edgeEntities = [];\r\n }\r\n if (this.pointEntities.length) {\r\n for (const p of this.pointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.pointEntities = [];\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n this.previewPos = null;\r\n }\r\n if (this.previewEdgeEntity) {\r\n this.viewer.entities.remove(this.previewEdgeEntity);\r\n this.previewEdgeEntity = null;\r\n }\r\n if (this.previewPointEntities.length) {\r\n for (const p of this.previewPointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.previewPointEntities = [];\r\n }\r\n if (this.labelEntity) {\r\n this.viewer.entities.remove(this.labelEntity);\r\n this.labelEntity = null;\r\n }\r\n if (this.htmlLabelPool && this.htmlLabelId) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.segmentLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.segmentLabelIds.slice());\r\n }\r\n if (this.angleLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.angleLabelIds.slice());\r\n }\r\n this.segmentLabelIds = [];\r\n this.angleLabelIds = [];\r\n this.tempPoints.forEach((p) => this.viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n this.positions = [];\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 3) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-area', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-area-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-area-angle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n for (const pos of posList) {\r\n const point = viewer.entities.add({ position: pos, point: { pixelSize: 8, color: opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.tempPoints.push(point);\r\n }\r\n const center = new Cesium.Cartesian3(\r\n posList.reduce((s: number, p: any) => s + p.x, 0) / posList.length,\r\n posList.reduce((s: number, p: any) => s + p.y, 0) / posList.length,\r\n posList.reduce((s: number, p: any) => s + p.z, 0) / posList.length,\r\n );\r\n const plane = new Cesium.EllipsoidTangentPlane(center, Cesium.Ellipsoid.WGS84);\r\n const points2D = plane.projectPointsOntoPlane(posList);\r\n let area2D = 0;\r\n for (let i = 0; i < points2D.length; i++) {\r\n const j = (i + 1) % points2D.length;\r\n area2D += points2D[i].x * points2D[j].y - points2D[j].x * points2D[i].y;\r\n }\r\n area2D = Math.abs(area2D) / 2;\r\n const cc = Cesium.Cartographic.fromCartesian(center);\r\n const id = record.id + '_area';\r\n this.htmlLabelId = id;\r\n const t = opts.labelText || { area: '面积', side: '边长', angle: '角度' };\r\n this.htmlLabelPool.add({ text: `${t.area}:${area2D.toFixed(2)} m²` }, {\r\n id,\r\n lon: Cesium.Math.toDegrees(cc.longitude),\r\n lat: Cesium.Math.toDegrees(cc.latitude),\r\n height: cc.height || 0,\r\n theme: 'measure-area',\r\n show: true,\r\n });\r\n const hierarchy = new Cesium.PolygonHierarchy(posList);\r\n const geom = new Cesium.PolygonGeometry({ polygonHierarchy: hierarchy, vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT, perPositionHeight: true });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = opts.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n const occludedColor = (opts.color && opts.color.withAlpha) ? opts.color.withAlpha(0.25) : Cesium.Color.RED.withAlpha(0.4);\r\n const primitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color }), translucent: true, closed: true }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color: occludedColor }), translucent: true, closed: true }),\r\n });\r\n viewer.scene.primitives.add(primitive);\r\n this.primitive = primitive;\r\n for (let i = 0; i < posList.length; i++) {\r\n const j = (i + 1) % posList.length;\r\n const p1 = posList[i];\r\n const p2 = posList[j];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = record.id + `_area_seg_${i}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add({ text: `${t.side}:${d.toFixed(2)} m` }, { id: sid, lon: Cesium.Math.toDegrees(mc.longitude), lat: Cesium.Math.toDegrees(mc.latitude), height: mc.height || 0, theme: 'measure-area-seg', show: true });\r\n }\r\n const p2d = points2D;\r\n for (let i = 0; i < p2d.length; i++) {\r\n const prev = p2d[(i - 1 + p2d.length) % p2d.length];\r\n const curr = p2d[i];\r\n const next = p2d[(i + 1) % p2d.length];\r\n const v1x = prev.x - curr.x;\r\n const v1y = prev.y - curr.y;\r\n const v2x = next.x - curr.x;\r\n const v2y = next.y - curr.y;\r\n const len1 = Math.sqrt(v1x * v1x + v1y * v1y);\r\n const len2 = Math.sqrt(v2x * v2x + v2y * v2y);\r\n if (!len1 || !len2) continue;\r\n const dot = (v1x / len1) * (v2x / len2) + (v1y / len1) * (v2y / len2);\r\n const ang = Math.acos(Math.min(1, Math.max(-1, dot))) * (180 / Math.PI);\r\n const pc = Cesium.Cartographic.fromCartesian(posList[i]);\r\n const aid = record.id + `_area_angle_${i}`;\r\n this.angleLabelIds.push(aid);\r\n this.htmlLabelPool.add({ text: `${t.angle}:${ang.toFixed(2)} °` }, { id: aid, lon: Cesium.Math.toDegrees(pc.longitude), lat: Cesium.Math.toDegrees(pc.latitude), height: pc.height || 0, theme: 'measure-area-angle', show: true });\r\n }\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class CircleMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private positions: any[] = [];\r\n private currentRadius: number = 0;\r\n private labelEntity: any = null;\r\n private previewLabel: any = null;\r\n private ellipsePrimitive: any = null;\r\n private previewEntity: any = null;\r\n private isPrimitive: boolean = false;\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-circle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n const text = ctx?.data?.text || '';\r\n el.innerHTML = String(text);\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((click: any) => {\r\n const position = viewer.scene.pickPosition(click.position);\r\n if (!position) return;\r\n this.positions.push(position);\r\n if (this.positions.length === 2) {\r\n this.stop();\r\n const center = this.positions[0];\r\n const edge = this.positions[1];\r\n const radius = Cesium.Cartesian3.distance(center, edge);\r\n const area = Math.PI * radius * radius;\r\n const perimeter = 2 * Math.PI * radius;\r\n const t = options.labelText || { radius: '半径', area: '面积', circumference: '周长' };\r\n const centerLabelPos = center;\r\n if (!this.labelEntity) {\r\n this.labelEntity = viewer.entities.add({\r\n position: centerLabelPos,\r\n label: {\r\n text: `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`,\r\n font: '14px sans-serif',\r\n fillColor: Cesium.Color.WHITE,\r\n outlineColor: Cesium.Color.BLACK,\r\n outlineWidth: 2,\r\n style: Cesium.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: Cesium.VerticalOrigin.BOTTOM,\r\n pixelOffset: new Cesium.Cartesian2(0, -10),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n eyeOffset: new Cesium.Cartesian3(0, 0, -1000),\r\n showBackground: true,\r\n backgroundColor: Cesium.Color.BLACK.withAlpha(0.6),\r\n show: false,\r\n },\r\n });\r\n } else {\r\n this.labelEntity.position = centerLabelPos;\r\n this.labelEntity.label.text = `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`;\r\n }\r\n if (this.previewEntity) {\r\n viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n const cartoCenter = Cesium.Cartographic.fromCartesian(center);\r\n const geom = new Cesium.EllipseGeometry({\r\n center,\r\n semiMajorAxis: radius,\r\n semiMinorAxis: radius,\r\n height: cartoCenter.height || 0,\r\n vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT,\r\n });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.5);\r\n const occludedColor = (options.color && options.color.withAlpha)\r\n ? options.color.withAlpha(0.25)\r\n : Cesium.Color.RED.withAlpha(0.4);\r\n if (this.ellipsePrimitive) {\r\n viewer.scene.primitives.remove(this.ellipsePrimitive);\r\n this.ellipsePrimitive = null;\r\n }\r\n this.ellipsePrimitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color: occludedColor }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n });\r\n viewer.scene.primitives.add(this.ellipsePrimitive);\r\n this.entity = this.ellipsePrimitive;\r\n this.isPrimitive = true;\r\n const c = Cesium.Cartographic.fromCartesian(center);\r\n const lng = Cesium.Math.toDegrees(c.longitude);\r\n const lat = Cesium.Math.toDegrees(c.latitude);\r\n const h = c.height || 0;\r\n const id = this.htmlLabelId || `measure_circle_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n const text = `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`;\r\n this.htmlLabelPool.add({ text }, { id, lon: lng, lat, height: h, theme: 'measure-circle', show: true });\r\n const result = {\r\n entity: this.entity,\r\n label: this.labelEntity,\r\n positions: this.positions,\r\n radius,\r\n area,\r\n perimeter,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length !== 1) return;\r\n const center = this.positions[0];\r\n const ray = viewer.camera.getPickRay(movement.endPosition);\r\n const edge = viewer.scene.globe.pick(ray, viewer.scene);\r\n if (!edge) return;\r\n const radius = Cesium.Cartesian3.distance(center, edge);\r\n this.currentRadius = radius;\r\n const cartoCenter = Cesium.Cartographic.fromCartesian(center);\r\n const area = Math.PI * radius * radius;\r\n const perimeter = 2 * Math.PI * radius;\r\n const t = options.labelText || { radius: '半径', area: '面积', circumference: '周长' };\r\n const centerLabelPos = center;\r\n if (!this.labelEntity) {\r\n this.labelEntity = viewer.entities.add({\r\n position: centerLabelPos,\r\n label: {\r\n text: `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`,\r\n font: '14px sans-serif',\r\n fillColor: Cesium.Color.WHITE,\r\n outlineColor: Cesium.Color.BLACK,\r\n outlineWidth: 2,\r\n style: Cesium.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: Cesium.VerticalOrigin.BOTTOM,\r\n pixelOffset: new Cesium.Cartesian2(0, -10),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n eyeOffset: new Cesium.Cartesian3(0, 0, -1000),\r\n showBackground: true,\r\n backgroundColor: Cesium.Color.BLACK.withAlpha(0.6),\r\n show: false,\r\n },\r\n });\r\n } else {\r\n this.labelEntity.position = centerLabelPos;\r\n this.labelEntity.label.text = `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`;\r\n }\r\n const c = Cesium.Cartographic.fromCartesian(center);\r\n const lng = Cesium.Math.toDegrees(c.longitude);\r\n const lat = Cesium.Math.toDegrees(c.latitude);\r\n const h = c.height || 0;\r\n const id = this.htmlLabelId || `measure_circle_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n const text = `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`;\r\n this.htmlLabelPool.add({ text }, { id, lon: lng, lat, height: h, theme: 'measure-circle', show: true });\r\n if (!this.previewEntity) {\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.5);\r\n this.previewEntity = viewer.entities.add({\r\n position: center,\r\n ellipse: {\r\n semiMajorAxis: new Cesium.CallbackProperty(() => this.currentRadius, false),\r\n semiMinorAxis: new Cesium.CallbackProperty(() => this.currentRadius, false),\r\n height: cartoCenter.height || 0,\r\n material: color,\r\n },\r\n });\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n if (this.isPrimitive) {\r\n this.viewer.scene.primitives.remove(this.entity);\r\n } else {\r\n this.viewer.entities.remove(this.entity);\r\n }\r\n this.entity = null;\r\n this.isPrimitive = false;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.labelEntity) {\r\n this.viewer.entities.remove(this.labelEntity);\r\n this.labelEntity = null;\r\n }\r\n if (this.previewLabel) {\r\n this.viewer.entities.remove(this.previewLabel);\r\n this.previewLabel = null;\r\n }\r\n if (this.ellipsePrimitive) {\r\n this.viewer.scene.primitives.remove(this.ellipsePrimitive);\r\n this.ellipsePrimitive = null;\r\n }\r\n if (this.htmlLabelPool && this.htmlLabelId) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n this.positions = [];\r\n this.currentRadius = 0;\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 2) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-circle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n const text = ctx?.data?.text || '';\r\n el.innerHTML = String(text);\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n const center = posList[0];\r\n const edge = posList[1];\r\n const radius = Cesium.Cartesian3.distance(center, edge);\r\n const area = Math.PI * radius * radius;\r\n const perimeter = 2 * Math.PI * radius;\r\n const cartoCenter = Cesium.Cartographic.fromCartesian(center);\r\n const geom = new Cesium.EllipseGeometry({ center, semiMajorAxis: radius, semiMinorAxis: radius, height: cartoCenter.height || 0, vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = opts.color || Cesium.Color.YELLOW.withAlpha(0.5);\r\n const occludedColor = (opts.color && opts.color.withAlpha) ? opts.color.withAlpha(0.25) : Cesium.Color.RED.withAlpha(0.4);\r\n const primitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color }), translucent: true, closed: true }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color: occludedColor }), translucent: true, closed: true }),\r\n });\r\n viewer.scene.primitives.add(primitive);\r\n this.ellipsePrimitive = primitive;\r\n this.entity = primitive;\r\n this.isPrimitive = true;\r\n const c = Cesium.Cartographic.fromCartesian(center);\r\n const id = record.id + '_circle';\r\n this.htmlLabelId = id;\r\n const t = opts.labelText || { radius: '半径', area: '面积', circumference: '周长' };\r\n const text = `${t.radius}:${radius.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²\\n${t.circumference}:${perimeter.toFixed(2)} m`;\r\n this.htmlLabelPool.add({ text }, { id, lon: Cesium.Math.toDegrees(c.longitude), lat: Cesium.Math.toDegrees(c.latitude), height: c.height || 0, theme: 'measure-circle', show: true });\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class PolylineDistanceMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private labelEntity: any = null;\r\n private positions: any[] = [];\r\n private tempPoints: any[] = [];\r\n private segmentLabels: any[] = [];\r\n private hoverPos: any = null;\r\n private previewPos: any = null;\r\n private previewLabel: any = null;\r\n private previewEntity: any = null;\r\n private htmlLabelPool: any = null;\r\n private totalLabelId: string | null = null;\r\n private segmentLabelIds: string[] = [];\r\n private previewLabelId: string | null = null;\r\n \r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-polyline-total', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-polyline-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n this.positions.push(pos);\r\n const point = viewer.entities.add({\r\n position: pos,\r\n point: {\r\n pixelSize: 8,\r\n color: options.pointColor || options.color || Cesium.Color.YELLOW,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.tempPoints.push(point);\r\n if (!this.entity) {\r\n this.entity = viewer.entities.add({\r\n polyline: {\r\n positions: this.positions.slice(),\r\n width: options.width || 3,\r\n material: options.lineColor || options.color || Cesium.Color.YELLOW,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n } else {\r\n this.entity.polyline.positions = this.positions.slice();\r\n }\r\n if (this.positions.length >= 2) {\r\n const p1 = this.positions[this.positions.length - 2];\r\n const p2 = this.positions[this.positions.length - 1];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3(\r\n (p1.x + p2.x) / 2,\r\n (p1.y + p2.y) / 2,\r\n (p1.z + p2.z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const id = `measure_polyline_seg_${this.segmentLabelIds.length}_${Date.now()}`;\r\n this.segmentLabelIds.push(id);\r\n this.htmlLabelPool.add(\r\n { text: `${d.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-polyline-seg',\r\n show: true,\r\n },\r\n );\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction(() => {\r\n if (this.positions.length < 2) {\r\n this.stop();\r\n return;\r\n }\r\n this.stop();\r\n if (this.previewLabelId) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.hoverPos) {\r\n this.hoverPos = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.positions.length >= 2 && this.tempPoints.length >= 2) {\r\n const lastPoint = this.tempPoints[this.tempPoints.length - 1];\r\n this.viewer.entities.remove(lastPoint);\r\n this.tempPoints.pop();\r\n }\r\n if (this.segmentLabelIds.length >= 1) {\r\n const lastId = this.segmentLabelIds[this.segmentLabelIds.length - 1];\r\n if (lastId) {\r\n this.htmlLabelPool.removeByIds([lastId]);\r\n this.segmentLabelIds.pop();\r\n }\r\n }\r\n if (this.positions.length >= 2) {\r\n this.positions.pop();\r\n }\r\n let total = 0;\r\n for (let i = 1; i < this.positions.length; i++) {\r\n const p1 = this.positions[i - 1];\r\n const p2 = this.positions[i];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n total += d;\r\n }\r\n const last = this.positions[this.positions.length - 1];\r\n if (this.entity && this.entity.polyline) {\r\n this.entity.polyline.positions = this.positions;\r\n }\r\n const lc = Cesium.Cartographic.fromCartesian(last);\r\n const id = this.totalLabelId || `measure_polyline_total_${Date.now()}`;\r\n this.totalLabelId = id;\r\n this.htmlLabelPool.add(\r\n { text: `${total.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(lc.longitude),\r\n lat: Cesium.Math.toDegrees(lc.latitude),\r\n height: lc.height || 0,\r\n theme: 'measure-polyline-total',\r\n show: true,\r\n },\r\n );\r\n this.labelEntity = this.totalLabelId;\r\n const result = {\r\n entity: this.entity,\r\n label: this.labelEntity,\r\n segmentLabels: this.segmentLabelIds,\r\n positions: this.positions,\r\n distance: total,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length === 0) return;\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (!pos) return;\r\n this.hoverPos = pos;\r\n this.previewPos = pos;\r\n const p1 = this.positions[this.positions.length - 1];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(pos);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n const mid = new Cesium.Cartesian3(\r\n (p1.x + pos.x) / 2,\r\n (p1.y + pos.y) / 2,\r\n (p1.z + pos.z) / 2,\r\n );\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const id = this.previewLabelId || 'measure_polyline_preview';\r\n this.previewLabelId = id;\r\n this.htmlLabelPool.add(\r\n { text: `${d.toFixed(2)} m` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-polyline-seg',\r\n show: true,\r\n },\r\n );\r\n\r\n if (!this.previewEntity) {\r\n this.previewEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.previewPos || !this.positions.length) return [];\r\n const last = this.positions[this.positions.length - 1];\r\n return [last, this.previewPos];\r\n }, false),\r\n width: options.width || 3,\r\n material: options.lineColor || options.color || Cesium.Color.YELLOW,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n }\r\n\r\n \r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n if (this.totalLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.totalLabelId]);\r\n this.totalLabelId = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n this.hoverPos = null;\r\n if (this.segmentLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.segmentLabelIds.slice());\r\n }\r\n this.segmentLabelIds = [];\r\n this.tempPoints.forEach((p) => this.viewer.entities.remove(p));\r\n this.tempPoints = [];\r\n this.positions = [];\r\n }\r\n \r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const lineColor = opts.lineColor || opts.color || Cesium.Color.YELLOW;\r\n const dashColor = (opts.dashLineColor || opts.lineColor || opts.color || Cesium.Color.RED).withAlpha?.(0.9) || Cesium.Color.RED;\r\n const width = opts.width || 3;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 2) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-polyline-total', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-polyline-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n for (const pos of posList) {\r\n const point = viewer.entities.add({ position: pos, point: { pixelSize: 8, color: opts.pointColor || opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\r\n this.tempPoints.push(point);\r\n }\r\n this.entity = viewer.entities.add({ polyline: { positions: posList, width, material: lineColor, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: dashColor, dashLength: 12, dashPattern: 255 }) } });\r\n let total = 0;\r\n for (let i = 1; i < posList.length; i++) {\r\n const c1 = Cesium.Cartographic.fromCartesian(posList[i - 1]);\r\n const c2 = Cesium.Cartographic.fromCartesian(posList[i]);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n total += geodesic.surfaceDistance;\r\n const p1 = posList[i - 1];\r\n const p2 = posList[i];\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = record.id + `_seg_${i - 1}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add({ text: `${geodesic.surfaceDistance.toFixed(2)} m` }, {\r\n id: sid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-polyline-seg',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n });\r\n }\r\n const last = posList[posList.length - 1];\r\n const lc = Cesium.Cartographic.fromCartesian(last);\r\n const id = record.id + '_total';\r\n this.totalLabelId = id;\r\n this.htmlLabelPool.add({ text: `${total.toFixed(2)} m` }, {\r\n id,\r\n lon: Cesium.Math.toDegrees(lc.longitude),\r\n lat: Cesium.Math.toDegrees(lc.latitude),\r\n height: lc.height || 0,\r\n theme: 'measure-polyline-total',\r\n show: true,\r\n style: { pointerEvents: 'none', userSelect: 'none', cursor: 'default' },\r\n });\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\n\nexport default class TerrainHeightMeasure implements IMeasure {\n private Cesium: any;\n private viewer: any;\n private handler: any = null;\n private labelEntity: any = null;\n private htmlLabelPool: any = null;\n private htmlLabelId: string | null = null;\n private topPoint: any = null;\n private zeroPoint: any = null;\n private lineEntity: any = null;\n\n constructor(Cesium: any, viewer: any) {\n this.Cesium = Cesium;\n this.viewer = viewer;\n }\n\n start(options: MeasurementOptions) {\n this.clear();\n const Cesium = this.Cesium;\n const viewer = this.viewer;\n if (!this.htmlLabelPool) {\n const containerId = options.overlayContainerId || 'html-label-container';\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\n this.htmlLabelPool.registerTheme('measure-terrainHeight', {\n createElement: (el: HTMLDivElement, ctx: any) => {\n el.innerHTML = String(ctx?.data?.text || '');\n el.style.background = 'rgba(0,0,0,0.6)';\n el.style.color = '#fff';\n el.style.font = '14px sans-serif';\n el.style.padding = '4px 6px';\n el.style.borderRadius = '4px';\n el.style.whiteSpace = 'pre';\n },\n options: { offset: { x: 0, y: -10 } },\n });\n }\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\n this.handler.setInputAction((movement: any) => {\n const position = viewer.scene.pickPosition(movement.position);\n if (!position) return;\n const carto = Cesium.Cartographic.fromCartesian(position);\n const terrainHeight = viewer.scene.globe.getHeight(\n new Cesium.Cartographic(carto.longitude, carto.latitude, 0),\n ) || 0;\n const lng = Cesium.Math.toDegrees(carto.longitude);\n const lat = Cesium.Math.toDegrees(carto.latitude);\n const terrainPos = Cesium.Cartesian3.fromDegrees(lng, lat, terrainHeight);\n this.topPoint = viewer.entities.add({\n position,\n point: {\n pixelSize: 8,\n color: options.color || Cesium.Color.YELLOW,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n },\n });\n this.zeroPoint = viewer.entities.add({\n position: terrainPos,\n point: {\n pixelSize: 8,\n color: Cesium.Color.YELLOW,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n },\n });\n this.lineEntity = viewer.entities.add({\n polyline: {\n positions: [terrainPos, position],\n width: options.width || 3,\n material: options.color || Cesium.Color.YELLOW,\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\n color: Cesium.Color.RED,\n dashLength: 12,\n dashPattern: 255,\n }),\n },\n });\n const t = options.labelText || { height: '高差' };\n const heightDiff = (carto.height || 0) - terrainHeight;\n const labelText = `${t.height}:${heightDiff.toFixed(2)} m`;\n const id = this.htmlLabelId || `measure_terrain_${Date.now()}`;\n this.htmlLabelId = id;\n this.htmlLabelPool.add(\n { text: labelText },\n {\n id,\n lon: lng,\n lat: lat,\n height: carto.height || 0,\n theme: 'measure-terrainHeight',\n show: true,\n },\n );\n this.labelEntity = this.htmlLabelId;\n const result = {\n label: this.labelEntity,\n position,\n zeroPosition: terrainPos,\n line: this.lineEntity,\n terrainHeight,\n difference: heightDiff,\n clear: () => this.clear(),\n };\n options.onComplete?.(result);\n this.stop();\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\n }\n\n stop() {\n if (this.handler) {\n this.handler.destroy();\n this.handler = null;\n }\n }\n\n clear() {\n this.stop();\n if (this.lineEntity) {\n this.viewer.entities.remove(this.lineEntity);\n this.lineEntity = null;\n }\n if (this.topPoint) {\n this.viewer.entities.remove(this.topPoint);\n this.topPoint = null;\n }\n if (this.zeroPoint) {\n this.viewer.entities.remove(this.zeroPoint);\n this.zeroPoint = null;\n }\n if (this.htmlLabelId && this.htmlLabelPool) {\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\n this.htmlLabelId = null;\n }\n }\n\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\n const Cesium = this.Cesium;\n const viewer = this.viewer;\n const opts = (record.options || {}) as MeasurementOptions;\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\n if (posList.length < 1) {\n const data: any = record.data || {};\n const p = data.position;\n if (p) {\n if (Array.isArray(p) && p.length === 3) {\n posList.push(new Cesium.Cartesian3(p[0], p[1], p[2]));\n } else if (typeof p === 'object' && p && 'x' in p && 'y' in p && 'z' in p) {\n posList.push(new Cesium.Cartesian3(p.x, p.y, p.z));\n }\n }\n }\n if (posList.length < 1) return;\n if (!this.htmlLabelPool) {\n const containerId = opts.overlayContainerId || 'html-label-container';\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\n this.htmlLabelPool.registerTheme('measure-terrainHeight', {\n createElement: (el: HTMLDivElement, ctx: any) => {\n el.innerHTML = String(ctx?.data?.text || '');\n el.style.background = 'rgba(0,0,0,0.6)';\n el.style.color = '#fff';\n el.style.font = '14px sans-serif';\n el.style.padding = '4px 6px';\n el.style.borderRadius = '4px';\n el.style.whiteSpace = 'pre';\n },\n options: { offset: { x: 0, y: -10 } },\n });\n }\n const position = posList[0];\n const carto = Cesium.Cartographic.fromCartesian(position);\n const terrainHeight = viewer.scene.globe.getHeight(new Cesium.Cartographic(carto.longitude, carto.latitude, 0)) || 0;\n const lng = Cesium.Math.toDegrees(carto.longitude);\n const lat = Cesium.Math.toDegrees(carto.latitude);\n const terrainPos = Cesium.Cartesian3.fromDegrees(lng, lat, terrainHeight);\n this.topPoint = viewer.entities.add({ position, point: { pixelSize: 8, color: opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\n this.zeroPoint = viewer.entities.add({ position: terrainPos, point: { pixelSize: 8, color: Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\n this.lineEntity = viewer.entities.add({ polyline: { positions: [terrainPos, position], width: opts.width || 3, material: opts.color || Cesium.Color.YELLOW, depthFailMaterial: new Cesium.PolylineDashMaterialProperty({ color: Cesium.Color.RED, dashLength: 12, dashPattern: 255 }) } });\n const t = opts.labelText || { height: '高差' };\n const heightDiff = (carto.height || 0) - terrainHeight;\n const id = record.id + '_terrain';\n this.htmlLabelId = id;\n this.htmlLabelPool.add({ text: `${t.height}:${heightDiff.toFixed(2)} m` }, { id, lon: lng, lat, height: carto.height || 0, theme: 'measure-terrainHeight', show: true });\n }\n}\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\n\nexport default class CoordinateMeasure implements IMeasure {\n private Cesium: any;\n private viewer: any;\n private handler: any = null;\n private entity: any = null;\n private labelEntity: any = null;\n private htmlLabelPool: any = null;\n private htmlLabelId: string | null = null;\n\n constructor(Cesium: any, viewer: any) {\n this.Cesium = Cesium;\n this.viewer = viewer;\n }\n\n start(options: MeasurementOptions) {\n this.clear();\n const Cesium = this.Cesium;\n const viewer = this.viewer;\n if (!this.htmlLabelPool) {\n const containerId = options.overlayContainerId || 'html-label-container';\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\n this.htmlLabelPool.registerTheme('measure-coordinate', {\n createElement: (el: HTMLDivElement, ctx: any) => {\n el.innerHTML = String(ctx?.data?.text || '');\n el.style.background = 'rgba(0,0,0,0.6)';\n el.style.color = '#fff';\n el.style.font = '14px sans-serif';\n el.style.padding = '4px 6px';\n el.style.borderRadius = '4px';\n el.style.whiteSpace = 'pre';\n },\n options: { offset: { x: 0, y: -10 } },\n });\n }\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\n this.handler.setInputAction((movement: any) => {\n const position = viewer.scene.pickPosition(movement.position);\n if (!position) return;\n const carto = Cesium.Cartographic.fromCartesian(position);\n const lng = Cesium.Math.toDegrees(carto.longitude);\n const lat = Cesium.Math.toDegrees(carto.latitude);\n const h = carto.height || 0;\n this.entity = viewer.entities.add({\n position,\n point: {\n pixelSize: 10,\n color: options.color || Cesium.Color.YELLOW,\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\n },\n });\n const id = this.htmlLabelId || `measure_coordinate_${Date.now()}`;\n this.htmlLabelId = id;\n const t = options.labelText || { lng: '经', lat: '纬', height: '高' };\n this.htmlLabelPool.add(\n { text: `${t.lng}:${lng.toFixed(6)}\\n${t.lat}:${lat.toFixed(6)}\\n${t.height}:${h.toFixed(2)} m` },\n {\n id,\n lon: lng,\n lat,\n height: h,\n theme: 'measure-coordinate',\n show: true,\n },\n );\n this.labelEntity = this.htmlLabelId;\n const result = {\n entity: this.entity,\n label: this.labelEntity,\n lnglat: { lng, lat, height: h },\n clear: () => this.clear(),\n };\n options.onComplete?.(result);\n this.stop();\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\n }\n\n stop() {\n if (this.handler) {\n this.handler.destroy();\n this.handler = null;\n }\n }\n\n clear() {\n this.stop();\n if (this.entity) {\n this.viewer.entities.remove(this.entity);\n this.entity = null;\n }\n if (this.htmlLabelId && this.htmlLabelPool) {\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\n this.htmlLabelId = null;\n }\n }\n\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\n const Cesium = this.Cesium;\n const viewer = this.viewer;\n const opts = (record.options || {}) as MeasurementOptions;\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\n if (!posList.length) {\n const ll = (record.data as any)?.lnglat;\n if (ll && typeof ll.lng === 'number' && typeof ll.lat === 'number') {\n const c = Cesium.Cartesian3.fromDegrees(ll.lng, ll.lat, ll.height || 0);\n posList.push(c);\n }\n }\n if (!posList.length) return;\n if (!this.htmlLabelPool) {\n const containerId = opts.overlayContainerId || 'html-label-container';\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\n this.htmlLabelPool.registerTheme('measure-coordinate', {\n createElement: (el: HTMLDivElement, ctx: any) => {\n el.innerHTML = String(ctx?.data?.text || '');\n el.style.background = 'rgba(0,0,0,0.6)';\n el.style.color = '#fff';\n el.style.font = '14px sans-serif';\n el.style.padding = '4px 6px';\n el.style.borderRadius = '4px';\n el.style.whiteSpace = 'pre';\n },\n options: { offset: { x: 0, y: -10 } },\n });\n }\n const position = posList[0];\n const carto = Cesium.Cartographic.fromCartesian(position);\n const lng = Cesium.Math.toDegrees(carto.longitude);\n const lat = Cesium.Math.toDegrees(carto.latitude);\n const h = carto.height || 0;\n this.entity = viewer.entities.add({ position, point: { pixelSize: 10, color: opts.color || Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY } });\n const id = record.id + '_coord';\n this.htmlLabelId = id;\n const t = opts.labelText || { lng: '经', lat: '纬', height: '高' };\n this.htmlLabelPool.add({ text: `${t.lng}:${lng.toFixed(6)}\\n${t.lat}:${lat.toFixed(6)}\\n${t.height}:${h.toFixed(2)} m` }, { id, lon: lng, lat, height: h, theme: 'measure-coordinate', show: true });\n }\n}\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class RectangleMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private startPoint: any = null;\r\n private endPoint: any = null;\r\n private secondPoint: any = null;\r\n private currentCorners: any[] = [];\r\n private edgeEntities: any[] = [];\r\n private pointEntities: any[] = [];\r\n private previewEdgeEntity: any = null;\r\n private previewPointEntities: any[] = [];\r\n private entity: any = null;\r\n private labelEntity: any = null;\r\n private primitive: any = null;\r\n private previewEntity: any = null;\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n private segmentLabelIds: string[] = [];\r\n private previewLabelId: string | null = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-rectangle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-rectangle-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.position);\r\n if (!pos) return;\r\n if (!this.startPoint) {\r\n this.startPoint = pos;\r\n return;\r\n }\r\n if (!this.secondPoint) {\r\n this.secondPoint = pos;\r\n this.endPoint = pos;\r\n return;\r\n }\r\n const thirdPoint = pos;\r\n const rect = this.computeRectangle(this.startPoint, this.secondPoint, thirdPoint);\r\n if (!rect) {\r\n this.stop();\r\n return;\r\n }\r\n this.stop();\r\n const { corners, center, width, height, area } = rect;\r\n if (this.previewEntity) {\r\n viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.primitive) {\r\n viewer.scene.primitives.remove(this.primitive);\r\n this.primitive = null;\r\n }\r\n if (this.entity) {\r\n viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n const id = this.htmlLabelId || `measure_rectangle_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n const mc = Cesium.Cartographic.fromCartesian(center);\r\n const t = options.labelText || { width: '宽', heightLabel: '高', area: '面积', side: '边长' };\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n this.htmlLabelPool.add(\r\n { text: `${t.width}:${width.toFixed(2)} m\\n${t.heightLabel}:${height.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-rectangle',\r\n show: true,\r\n },\r\n );\r\n const edges = [\r\n [corners[0], corners[1]],\r\n [corners[1], corners[2]],\r\n [corners[2], corners[3]],\r\n [corners[3], corners[0]],\r\n ];\r\n for (let i = 0; i < edges.length; i++) {\r\n const [p1, p2] = edges[i];\r\n const d = i === 0 || i === 2 ? width : height;\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc2 = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = `measure_rectangle_seg_${Date.now()}_${i}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add(\r\n { text: `${t.side}:${Number(d).toFixed(2)} m` },\r\n {\r\n id: sid,\r\n lon: Cesium.Math.toDegrees(mc2.longitude),\r\n lat: Cesium.Math.toDegrees(mc2.latitude),\r\n height: mc2.height || 0,\r\n theme: 'measure-rectangle-seg',\r\n show: true,\r\n },\r\n );\r\n }\r\n const surfacePositions = this.buildSurfaceRectanglePositions(corners);\r\n const hierarchy = new Cesium.PolygonHierarchy(surfacePositions);\r\n const geom = new Cesium.PolygonGeometry({\r\n polygonHierarchy: hierarchy,\r\n vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n const occludedColor = (options.color && options.color.withAlpha)\r\n ? options.color.withAlpha(0.25)\r\n : Cesium.Color.RED.withAlpha(0.4);\r\n this.primitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color: occludedColor }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n });\r\n viewer.scene.primitives.add(this.primitive);\r\n const lineColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n const polylinePositions = [...surfacePositions, surfacePositions[0]];\r\n const lineEntity = viewer.entities.add({\r\n polyline: {\r\n positions: polylinePositions,\r\n width: options.width || 2,\r\n material: lineColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n this.edgeEntities.push(lineEntity);\r\n const pointColor = options.pointColor || options.color || Cesium.Color.YELLOW;\r\n for (const corner of corners) {\r\n const pointEntity = viewer.entities.add({\r\n position: corner,\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.pointEntities.push(pointEntity);\r\n }\r\n const result = {\r\n entity: this.primitive,\r\n label: this.labelEntity,\r\n positions: [this.startPoint, this.secondPoint, thirdPoint],\r\n width,\r\n height,\r\n area,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n const pos = viewer.scene.pickPosition(movement.endPosition);\r\n if (!pos) return;\r\n if (this.startPoint && !this.secondPoint) {\r\n this.endPoint = pos;\r\n if (!this.previewEdgeEntity) {\r\n const solidColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n this.previewEdgeEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.startPoint || !this.endPoint) return [];\r\n return [this.startPoint, this.endPoint];\r\n }, false),\r\n width: options.width || 2,\r\n material: solidColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n const pointColor = options.pointColor || options.color || Cesium.Color.YELLOW;\r\n const basePoint = viewer.entities.add({\r\n position: this.startPoint,\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n const hoverPoint = viewer.entities.add({\r\n position: new Cesium.CallbackProperty(() => this.endPoint || this.startPoint, false),\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.previewPointEntities.push(basePoint, hoverPoint);\r\n }\r\n return;\r\n }\r\n if (!this.startPoint || !this.secondPoint) return;\r\n const rect = this.computeRectangle(this.startPoint, this.secondPoint, pos);\r\n if (!rect) return;\r\n const { corners, center, width, height, area } = rect;\r\n const surfacePositions = this.buildSurfaceRectanglePositions(corners);\r\n this.currentCorners = surfacePositions;\r\n const mc = Cesium.Cartographic.fromCartesian(center);\r\n const pid = this.previewLabelId || 'measure_rectangle_preview';\r\n this.previewLabelId = pid;\r\n const tPrev = options.labelText || { width: '宽', heightLabel: '高', area: '面积' };\r\n this.htmlLabelPool.add(\r\n { text: `${tPrev.width}:${width.toFixed(2)} m\\n${tPrev.heightLabel}:${height.toFixed(2)} m\\n${tPrev.area}:${area.toFixed(2)} m²` },\r\n {\r\n id: pid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-rectangle',\r\n show: true,\r\n },\r\n );\r\n if (!this.previewEntity) {\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n this.previewEntity = viewer.entities.add({\r\n polygon: {\r\n hierarchy: new Cesium.CallbackProperty(() => {\r\n if (!this.startPoint || !this.secondPoint || !this.currentCorners.length) return undefined;\r\n return new Cesium.PolygonHierarchy(this.currentCorners);\r\n }, false),\r\n material: color,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n },\r\n });\r\n }\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewEdgeEntity) {\r\n this.viewer.entities.remove(this.previewEdgeEntity);\r\n this.previewEdgeEntity = null;\r\n }\r\n if (this.previewPointEntities.length) {\r\n for (const p of this.previewPointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.previewPointEntities = [];\r\n }\r\n if (this.edgeEntities.length) {\r\n for (const e of this.edgeEntities) {\r\n try {\r\n this.viewer.entities.remove(e);\r\n } catch {}\r\n }\r\n this.edgeEntities = [];\r\n }\r\n if (this.pointEntities.length) {\r\n for (const p of this.pointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.pointEntities = [];\r\n }\r\n if (this.primitive) {\r\n this.viewer.scene.primitives.remove(this.primitive);\r\n this.primitive = null;\r\n }\r\n if (this.htmlLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.segmentLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.segmentLabelIds.slice());\r\n }\r\n this.segmentLabelIds = [];\r\n this.startPoint = null;\r\n this.endPoint = null;\r\n this.secondPoint = null;\r\n this.currentCorners = [];\r\n }\r\n\r\n private buildSurfaceRectanglePositions(corners: any[]) {\r\n if (!corners || !corners.length) return [];\r\n return corners.slice();\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 3) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-rectangle', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-rectangle-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n const rect = this.computeRectangle(posList[0], posList[1], posList[2]);\r\n if (!rect) return;\r\n const corners = rect.corners;\r\n const center = rect.center;\r\n const width = rect.width;\r\n const height = rect.height;\r\n const area = rect.area;\r\n const mc = Cesium.Cartographic.fromCartesian(center);\r\n const id = record.id + '_rectangle';\r\n const t = opts.labelText || { width: '宽', heightLabel: '高', area: '面积', side: '边长' };\r\n this.htmlLabelId = id;\r\n this.htmlLabelPool.add({ text: `${t.width}:${width.toFixed(2)} m\\n${t.heightLabel}:${height.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²` }, { id, lon: Cesium.Math.toDegrees(mc.longitude), lat: Cesium.Math.toDegrees(mc.latitude), height: mc.height || 0, theme: 'measure-rectangle', show: true });\r\n const edges: any[] = [\r\n [corners[0], corners[1]],\r\n [corners[1], corners[2]],\r\n [corners[2], corners[3]],\r\n [corners[3], corners[0]],\r\n ];\r\n for (let i = 0; i < edges.length; i++) {\r\n const [ep1, ep2] = edges[i];\r\n const d = i === 0 || i === 2 ? width : height;\r\n const mid = new Cesium.Cartesian3((ep1.x + ep2.x) / 2, (ep1.y + ep2.y) / 2, (ep1.z + ep2.z) / 2);\r\n const mc2 = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = record.id + `_rectangle_seg_${i}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add({ text: `${t.side}:${Number(d).toFixed(2)} m` }, { id: sid, lon: Cesium.Math.toDegrees(mc2.longitude), lat: Cesium.Math.toDegrees(mc2.latitude), height: mc2.height || 0, theme: 'measure-rectangle-seg', show: true });\r\n }\r\n const hierarchy = new Cesium.PolygonHierarchy(corners);\r\n const geom = new Cesium.PolygonGeometry({\r\n polygonHierarchy: hierarchy,\r\n vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = opts.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n const occludedColor = (opts.color && opts.color.withAlpha) ? opts.color.withAlpha(0.25) : Cesium.Color.RED.withAlpha(0.4);\r\n const primitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color }), translucent: true, closed: true }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color: occludedColor }), translucent: true, closed: true }),\r\n });\r\n this.primitive = primitive;\r\n viewer.scene.primitives.add(this.primitive);\r\n\r\n const lineColor = opts.lineColor || color;\r\n const polylinePositions = [...corners, corners[0]];\r\n const lineEntity = viewer.entities.add({\r\n polyline: {\r\n positions: polylinePositions,\r\n width: opts.width || 2,\r\n material: lineColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n },\r\n });\r\n this.edgeEntities.push(lineEntity);\r\n const pointColor = opts.pointColor || color;\r\n for (const corner of corners) {\r\n const pointEntity = viewer.entities.add({\r\n position: corner,\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.pointEntities.push(pointEntity);\r\n }\r\n }\r\n\r\n private computeRectangle(p1: any, p2: any, p3: any) {\r\n const Cesium = this.Cesium;\r\n const plane = new Cesium.EllipsoidTangentPlane(p1, Cesium.Ellipsoid.WGS84);\r\n const pts2d = plane.projectPointsOntoPlane([p1, p2, p3]);\r\n if (!pts2d || pts2d.length < 3) return null;\r\n const a = pts2d[0];\r\n const b = pts2d[1];\r\n const c = pts2d[2];\r\n const vx = b.x - a.x;\r\n const vy = b.y - a.y;\r\n const baseLen = Math.sqrt(vx * vx + vy * vy);\r\n if (!baseLen) return null;\r\n const ux = vx / baseLen;\r\n const uy = vy / baseLen;\r\n const nx = -uy;\r\n const ny = ux;\r\n const wx = c.x - b.x;\r\n const wy = c.y - b.y;\r\n const s = wx * nx + wy * ny;\r\n if (!s) return null;\r\n const c2 = new Cesium.Cartesian2(b.x + nx * s, b.y + ny * s);\r\n const d2 = new Cesium.Cartesian2(a.x + nx * s, a.y + ny * s);\r\n const worldPoints = plane.projectPointsOntoEllipsoid([a, b, c2, d2]);\r\n if (!worldPoints || worldPoints.length < 4) return null;\r\n const corners = worldPoints;\r\n const p0 = corners[0];\r\n const p2w = corners[2];\r\n const width = Math.abs(baseLen);\r\n const height = Math.abs(s);\r\n const center = new Cesium.Cartesian3(\r\n (p0.x + p2w.x) / 2,\r\n (p0.y + p2w.y) / 2,\r\n (p0.z + p2w.z) / 2,\r\n );\r\n const planeCenter = new Cesium.EllipsoidTangentPlane(center, Cesium.Ellipsoid.WGS84);\r\n const rect2d = planeCenter.projectPointsOntoPlane(corners);\r\n let area2D = 0;\r\n for (let i = 0; i < rect2d.length; i++) {\r\n const j = (i + 1) % rect2d.length;\r\n area2D += rect2d[i].x * rect2d[j].y - rect2d[j].x * rect2d[i].y;\r\n }\r\n const area = Math.abs(area2D) / 2;\r\n return { corners, center, width, height, area };\r\n }\r\n}\r\n","import { IMeasure, MeasurementOptions, MeasurementRecord } from '../types';\r\nimport { HtmlOverlayLabelPool } from '../../HtmlOverlayLabelPool';\r\n\r\nexport default class RegularPolygonMeasure implements IMeasure {\r\n private Cesium: any;\r\n private viewer: any;\r\n private handler: any = null;\r\n private entity: any = null;\r\n private positions: any[] = [];\r\n private labelEntity: any = null;\r\n private currentPoints: any[] = [];\r\n private primitive: any = null;\r\n private previewEntity: any = null;\r\n private edgeEntities: any[] = [];\r\n private pointEntities: any[] = [];\r\n private previewEdgeEntity: any = null;\r\n private previewPointEntities: any[] = [];\r\n private htmlLabelPool: any = null;\r\n private htmlLabelId: string | null = null;\r\n private segmentLabelIds: string[] = [];\r\n private previewLabelId: string | null = null;\r\n\r\n constructor(Cesium: any, viewer: any) {\r\n this.Cesium = Cesium;\r\n this.viewer = viewer;\r\n }\r\n\r\n start(options: MeasurementOptions) {\r\n this.clear();\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const sides = Math.max(options.sides || 6, 6);\r\n if (!this.htmlLabelPool) {\r\n const containerId = options.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-regular', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-regular-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);\r\n this.handler.setInputAction((click: any) => {\r\n const position = viewer.scene.pickPosition(click.position);\r\n if (!position) return;\r\n this.positions.push(position);\r\n if (this.positions.length === 2) {\r\n this.stop();\r\n const center = this.positions[0];\r\n const edge = this.positions[1];\r\n const radius = Cesium.Cartesian3.distance(center, edge);\r\n const points = this.buildRegularPolygonPoints(center, radius, sides);\r\n if (this.previewEntity) {\r\n viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.primitive) {\r\n viewer.scene.primitives.remove(this.primitive);\r\n this.primitive = null;\r\n }\r\n const hierarchy = new Cesium.PolygonHierarchy(points);\r\n const geom = new Cesium.PolygonGeometry({\r\n polygonHierarchy: hierarchy,\r\n vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n const occludedColor = (options.color && options.color.withAlpha)\r\n ? options.color.withAlpha(0.25)\r\n : Cesium.Color.RED.withAlpha(0.4);\r\n this.primitive = new Cesium.Primitive({\r\n geometryInstances: instance,\r\n appearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n depthFailAppearance: new Cesium.MaterialAppearance({\r\n material: Cesium.Material.fromType('Color', { color: occludedColor }),\r\n translucent: true,\r\n closed: true,\r\n }),\r\n });\r\n viewer.scene.primitives.add(this.primitive);\r\n const lineColor = options.lineColor || color;\r\n const dashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n const polylinePositions = points.slice();\r\n const lineEntity = viewer.entities.add({\r\n polyline: {\r\n positions: polylinePositions,\r\n width: options.width || 2,\r\n material: lineColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n this.edgeEntities.push(lineEntity);\r\n const pointColor = options.pointColor || color;\r\n const uniquePoints = points.slice(0, points.length - 1);\r\n for (const p of uniquePoints) {\r\n const pointEntity = viewer.entities.add({\r\n position: p,\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.pointEntities.push(pointEntity);\r\n }\r\n const area = this.computeAreaByPlane(points);\r\n const cc = Cesium.Cartographic.fromCartesian(center);\r\n const id = this.htmlLabelId || `measure_regular_${Date.now()}`;\r\n this.htmlLabelId = id;\r\n const t = options.labelText || { sides: '边数', radius: '半径', circumference: '周长', area: '面积', side: '边长' };\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n let perimeter = 0;\r\n for (let i = 1; i < points.length; i++) {\r\n const p1 = points[i - 1];\r\n const p2 = points[i];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n perimeter += d;\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = `measure_regular_seg_${Date.now()}_${i - 1}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add(\r\n { text: `${t.side}:${d.toFixed(2)} m` },\r\n {\r\n id: sid,\r\n lon: Cesium.Math.toDegrees(mc.longitude),\r\n lat: Cesium.Math.toDegrees(mc.latitude),\r\n height: mc.height || 0,\r\n theme: 'measure-regular-seg',\r\n show: true,\r\n },\r\n );\r\n }\r\n this.htmlLabelPool.add(\r\n { text: `${t.sides}:${sides}\\n${t.radius}:${radius.toFixed(2)} m\\n${t.circumference}:${perimeter.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²` },\r\n {\r\n id,\r\n lon: Cesium.Math.toDegrees(cc.longitude),\r\n lat: Cesium.Math.toDegrees(cc.latitude),\r\n height: cc.height || 0,\r\n theme: 'measure-regular',\r\n show: true,\r\n },\r\n );\r\n const result = {\r\n entity: this.primitive,\r\n label: this.labelEntity,\r\n positions: points,\r\n radius,\r\n sides,\r\n perimeter,\r\n area,\r\n clear: () => this.clear(),\r\n };\r\n options.onComplete?.(result);\r\n }\r\n }, Cesium.ScreenSpaceEventType.LEFT_CLICK);\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.positions.length !== 1) return;\r\n const center = this.positions[0];\r\n const ray = viewer.camera.getPickRay(movement.endPosition);\r\n const edge = viewer.scene.globe.pick(ray, viewer.scene);\r\n if (!edge) return;\r\n const radius = Cesium.Cartesian3.distance(center, edge);\r\n this.currentPoints = this.buildRegularPolygonPoints(center, radius, sides);\r\n if (!this.previewEntity) {\r\n const color = options.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n this.previewEntity = viewer.entities.add({\r\n polygon: {\r\n hierarchy: new Cesium.CallbackProperty(() => {\r\n if (!this.currentPoints || this.currentPoints.length === 0) return undefined;\r\n return new Cesium.PolygonHierarchy(this.currentPoints);\r\n }, false),\r\n material: color,\r\n perPositionHeight: true,\r\n arcType: Cesium.ArcType.NONE,\r\n },\r\n });\r\n const lineColor = options.lineColor || options.color || Cesium.Color.YELLOW;\r\n const dashColor =\r\n (options.dashLineColor || options.lineColor || options.color || Cesium.Color.RED).withAlpha?.(0.9) ||\r\n Cesium.Color.RED;\r\n this.previewEdgeEntity = viewer.entities.add({\r\n polyline: {\r\n positions: new Cesium.CallbackProperty(() => {\r\n if (!this.currentPoints || this.currentPoints.length === 0) return [];\r\n return this.currentPoints.slice();\r\n }, false),\r\n width: options.width || 2,\r\n material: lineColor,\r\n clampToGround: false,\r\n arcType: Cesium.ArcType.NONE,\r\n depthFailMaterial: new Cesium.PolylineDashMaterialProperty({\r\n color: dashColor,\r\n dashLength: 12,\r\n dashPattern: 255,\r\n }),\r\n },\r\n });\r\n const pointColor = options.pointColor || options.color || Cesium.Color.YELLOW;\r\n const basePoint = viewer.entities.add({\r\n position: center,\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n const hoverPoint = viewer.entities.add({\r\n position: new Cesium.CallbackProperty(() => edge || center, false),\r\n point: {\r\n pixelSize: 8,\r\n color: pointColor,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n this.previewPointEntities.push(basePoint, hoverPoint);\r\n }\r\n let perimeter = 0;\r\n for (let i = 1; i < this.currentPoints.length; i++) {\r\n const p1 = this.currentPoints[i - 1];\r\n const p2 = this.currentPoints[i];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n perimeter += geodesic.surfaceDistance;\r\n }\r\n const area = this.computeAreaByPlane(this.currentPoints);\r\n const cc = Cesium.Cartographic.fromCartesian(center);\r\n const pid = this.previewLabelId || 'measure_regular_preview';\r\n this.previewLabelId = pid;\r\n const t = options.labelText || { sides: '边数', radius: '半径', circumference: '周长', area: '面积' };\r\n this.htmlLabelPool.add(\r\n { text: `${t.sides}:${sides}\\n${t.radius}:${radius.toFixed(2)} m\\n${t.circumference}:${perimeter.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²` },\r\n {\r\n id: pid,\r\n lon: Cesium.Math.toDegrees(cc.longitude),\r\n lat: Cesium.Math.toDegrees(cc.latitude),\r\n height: cc.height || 0,\r\n theme: 'measure-regular',\r\n show: true,\r\n },\r\n );\r\n }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);\r\n }\r\n\r\n stop() {\r\n if (this.handler) {\r\n this.handler.destroy();\r\n this.handler = null;\r\n }\r\n }\r\n\r\n clear() {\r\n this.stop();\r\n if (this.entity) {\r\n this.viewer.entities.remove(this.entity);\r\n this.entity = null;\r\n }\r\n if (this.previewEntity) {\r\n this.viewer.entities.remove(this.previewEntity);\r\n this.previewEntity = null;\r\n }\r\n if (this.previewEdgeEntity) {\r\n this.viewer.entities.remove(this.previewEdgeEntity);\r\n this.previewEdgeEntity = null;\r\n }\r\n if (this.previewPointEntities.length) {\r\n for (const p of this.previewPointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.previewPointEntities = [];\r\n }\r\n if (this.primitive) {\r\n this.viewer.scene.primitives.remove(this.primitive);\r\n this.primitive = null;\r\n }\r\n if (this.edgeEntities.length) {\r\n for (const e of this.edgeEntities) {\r\n try {\r\n this.viewer.entities.remove(e);\r\n } catch {}\r\n }\r\n this.edgeEntities = [];\r\n }\r\n if (this.pointEntities.length) {\r\n for (const p of this.pointEntities) {\r\n try {\r\n this.viewer.entities.remove(p);\r\n } catch {}\r\n }\r\n this.pointEntities = [];\r\n }\r\n if (this.labelEntity) {\r\n this.viewer.entities.remove(this.labelEntity);\r\n this.labelEntity = null;\r\n }\r\n if (this.htmlLabelPool && this.htmlLabelId) {\r\n this.htmlLabelPool.removeByIds([this.htmlLabelId]);\r\n this.htmlLabelId = null;\r\n }\r\n if (this.previewLabelId && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds([this.previewLabelId]);\r\n this.previewLabelId = null;\r\n }\r\n if (this.segmentLabelIds.length && this.htmlLabelPool) {\r\n this.htmlLabelPool.removeByIds(this.segmentLabelIds.slice());\r\n }\r\n this.segmentLabelIds = [];\r\n this.positions = [];\r\n this.currentPoints = [];\r\n }\r\n\r\n rehydrate(record: MeasurementRecord, htmlLabelPool?: HtmlOverlayLabelPool) {\r\n const Cesium = this.Cesium;\r\n const viewer = this.viewer;\r\n const opts = (record.options || {}) as MeasurementOptions;\r\n const sides = (record.data?.sides || opts.sides || 3);\r\n const posList = (record.positions || []).map((p) => new Cesium.Cartesian3(p[0], p[1], p[2]));\r\n if (posList.length < 2) return;\r\n if (!this.htmlLabelPool) {\r\n const containerId = opts.overlayContainerId || 'html-label-container';\r\n this.htmlLabelPool = htmlLabelPool || new HtmlOverlayLabelPool(Cesium, viewer, containerId);\r\n this.htmlLabelPool.registerTheme('measure-regular', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n this.htmlLabelPool.registerTheme('measure-regular-seg', {\r\n createElement: (el: HTMLDivElement, ctx: any) => {\r\n el.innerHTML = String(ctx?.data?.text || '');\r\n el.style.background = 'rgba(0,0,0,0.6)';\r\n el.style.color = '#fff';\r\n el.style.font = '14px sans-serif';\r\n el.style.padding = '4px 6px';\r\n el.style.borderRadius = '4px';\r\n el.style.whiteSpace = 'pre';\r\n },\r\n options: { offset: { x: 0, y: -10 } },\r\n });\r\n }\r\n let points: any[] = [];\r\n let center = posList[0];\r\n let radius = 0;\r\n if (posList.length >= 3) {\r\n points = posList.slice();\r\n center = new Cesium.Cartesian3(\r\n points.reduce((s: number, p: any) => s + p.x, 0) / points.length,\r\n points.reduce((s: number, p: any) => s + p.y, 0) / points.length,\r\n points.reduce((s: number, p: any) => s + p.z, 0) / points.length,\r\n );\r\n const c1 = points[0];\r\n const c2 = points[Math.floor(points.length / 2)] || points[1];\r\n radius = Cesium.Cartesian3.distance(center, c1);\r\n } else {\r\n const edge = posList[1];\r\n radius = Cesium.Cartesian3.distance(center, edge);\r\n points = this.buildRegularPolygonPoints(center, radius, Math.max(sides, 3));\r\n }\r\n const hierarchy = new Cesium.PolygonHierarchy(points);\r\n const geom = new Cesium.PolygonGeometry({ polygonHierarchy: hierarchy, vertexFormat: Cesium.MaterialAppearance.VERTEX_FORMAT, perPositionHeight: true });\r\n const instance = new Cesium.GeometryInstance({ geometry: geom });\r\n const color = opts.color || Cesium.Color.YELLOW.withAlpha(0.4);\r\n const occludedColor = (opts.color && opts.color.withAlpha) ? opts.color.withAlpha(0.25) : Cesium.Color.RED.withAlpha(0.4);\r\n const primitive = new Cesium.Primitive({ geometryInstances: instance, appearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color }), translucent: true, closed: true }), depthFailAppearance: new Cesium.MaterialAppearance({ material: Cesium.Material.fromType('Color', { color: occludedColor }), translucent: true, closed: true }) });\r\n viewer.scene.primitives.add(primitive);\r\n this.primitive = primitive;\r\n const area = this.computeAreaByPlane(points);\r\n const cc = Cesium.Cartographic.fromCartesian(center);\r\n const id = record.id + '_regular';\r\n this.htmlLabelId = id;\r\n const t = opts.labelText || { sides: '边数', radius: '半径', circumference: '周长', area: '面积', side: '边长' };\r\n let perimeter = 0;\r\n for (let i = 1; i < points.length; i++) {\r\n const p1 = points[i - 1];\r\n const p2 = points[i];\r\n const c1 = Cesium.Cartographic.fromCartesian(p1);\r\n const c2 = Cesium.Cartographic.fromCartesian(p2);\r\n const geodesic = new Cesium.EllipsoidGeodesic(c1, c2);\r\n const d = geodesic.surfaceDistance;\r\n perimeter += d;\r\n const mid = new Cesium.Cartesian3((p1.x + p2.x) / 2, (p1.y + p2.y) / 2, (p1.z + p2.z) / 2);\r\n const mc = Cesium.Cartographic.fromCartesian(mid);\r\n const sid = record.id + `_regular_seg_${i - 1}`;\r\n this.segmentLabelIds.push(sid);\r\n this.htmlLabelPool.add({ text: `${t.side}:${d.toFixed(2)} m` }, { id: sid, lon: Cesium.Math.toDegrees(mc.longitude), lat: Cesium.Math.toDegrees(mc.latitude), height: mc.height || 0, theme: 'measure-regular-seg', show: true });\r\n }\r\n this.htmlLabelPool.add({ text: `${t.sides}:${Math.max(sides, 3)}\\n${t.radius}:${radius.toFixed(2)} m\\n${t.circumference}:${perimeter.toFixed(2)} m\\n${t.area}:${area.toFixed(2)} m²` }, { id, lon: Cesium.Math.toDegrees(cc.longitude), lat: Cesium.Math.toDegrees(cc.latitude), height: cc.height || 0, theme: 'measure-regular', show: true });\r\n }\r\n\r\n private buildRegularPolygonPoints(center: any, radius: number, sides: number) {\r\n const Cesium = this.Cesium;\r\n const plane = new Cesium.EllipsoidTangentPlane(center, Cesium.Ellipsoid.WGS84);\r\n const step = (2 * Math.PI) / sides;\r\n const points2D: any[] = [];\r\n for (let i = 0; i < sides; i++) {\r\n const angle = i * step;\r\n const x = radius * Math.cos(angle);\r\n const y = radius * Math.sin(angle);\r\n points2D.push(new Cesium.Cartesian2(x, y));\r\n }\r\n const worldPoints = plane.projectPointsOntoEllipsoid(points2D);\r\n const points: any[] = worldPoints.slice();\r\n points.push(points[0]);\r\n return points;\r\n }\r\n\r\n private computeAreaByPlane(points: any[]) {\r\n const Cesium = this.Cesium;\r\n const center = new Cesium.Cartesian3(\r\n points.reduce((s: number, p: any) => s + p.x, 0) / points.length,\r\n points.reduce((s: number, p: any) => s + p.y, 0) / points.length,\r\n points.reduce((s: number, p: any) => s + p.z, 0) / points.length,\r\n );\r\n const plane = new Cesium.EllipsoidTangentPlane(center, Cesium.Ellipsoid.WGS84);\r\n const p2d = plane.projectPointsOntoPlane(points);\r\n let area = 0;\r\n for (let i = 0; i < p2d.length; i++) {\r\n const j = (i + 1) % p2d.length;\r\n area += p2d[i].x * p2d[j].y - p2d[j].x * p2d[i].y;\r\n }\r\n return Math.abs(area) / 2;\r\n }\r\n}\r\n","import {\n IMeasure,\n MeasurementOptions,\n MeasurementType,\n MeasurementRecord,\n MeasurementsConfig,\n} from './types';\nimport HorizontalMeasure from './handlers/HorizontalMeasure';\nimport VerticalMeasure from './handlers/VerticalMeasure';\nimport TriangleMeasure from './handlers/TriangleMeasure';\nimport SpaceMeasure from './handlers/SpaceMeasure';\nimport AreaMeasure from './handlers/AreaMeasure';\nimport CircleMeasure from './handlers/CircleMeasure';\nimport PolylineDistanceMeasure from './handlers/PolylineDistanceMeasure';\nimport TerrainHeightMeasure from './handlers/TerrainHeightMeasure';\nimport CoordinateMeasure from './handlers/CoordinateMeasure';\nimport RectangleMeasure from './handlers/RectangleMeasure';\nimport RegularPolygonMeasure from './handlers/RegularPolygonMeasure';\nimport { HtmlOverlayLabelPool } from '../HtmlOverlayLabelPool';\nimport { MarkerEventKey } from '../MarkerEvent';\n\nexport class MeasurementTool {\n private Cesium: any;\n private viewer: any;\n private actives: IMeasure[] = [];\n private measurements: MeasurementRecord[] = [];\n private htmlLabelPool: any = null;\n private recordHandlers: Map<string, IMeasure> = new Map();\n private specifiedClear: boolean = false;\n private deleteLabelPool: HtmlOverlayLabelPool | null = null;\n private deleteLabelIds: Map<string, string> = new Map();\n\n constructor({ Cesium, viewer }: { Cesium: any; viewer: any }) {\n this.Cesium = Cesium;\n this.viewer = viewer;\n viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\n }\n\n measure(type: MeasurementType, options: MeasurementOptions) {\n let handler: IMeasure | null = null;\n switch (type) {\n case 'horizontal':\n handler = new HorizontalMeasure(this.Cesium, this.viewer);\n break;\n case 'vertical':\n handler = new VerticalMeasure(this.Cesium, this.viewer);\n break;\n case 'triangle':\n handler = new TriangleMeasure(this.Cesium, this.viewer);\n break;\n case 'space':\n handler = new SpaceMeasure(this.Cesium, this.viewer);\n break;\n case 'area':\n handler = new AreaMeasure(this.Cesium, this.viewer);\n break;\n case 'circle':\n handler = new CircleMeasure(this.Cesium, this.viewer);\n break;\n case 'polyline':\n handler = new PolylineDistanceMeasure(this.Cesium, this.viewer);\n break;\n case 'terrainHeight':\n handler = new TerrainHeightMeasure(this.Cesium, this.viewer);\n break;\n case 'coordinate':\n handler = new CoordinateMeasure(this.Cesium, this.viewer);\n break;\n case 'rectangle':\n handler = new RectangleMeasure(this.Cesium, this.viewer);\n break;\n case 'regularPolygon':\n handler = new RegularPolygonMeasure(this.Cesium, this.viewer);\n break;\n default:\n throw new Error(`Unsupported measurement type: ${type}`);\n }\n if (!handler) return;\n this.actives.push(handler);\n const currentHandler = handler;\n const wrapped: MeasurementOptions = {\n ...options,\n onComplete: (result: any) => {\n const record: MeasurementRecord = {\n id: `m_${Date.now()}_${this.measurements.length}`,\n type,\n options: (() => {\n const o: any = { ...options };\n if ('onComplete' in o) {\n delete o.onComplete;\n }\n return o;\n })(),\n positions: (() => {\n if (Array.isArray(result?.positions)) {\n return result.positions.map((p: any) => [p.x, p.y, p.z]);\n }\n switch (type) {\n case 'terrainHeight': {\n const pos = (result as any)?.position;\n if (pos) return [[pos.x, pos.y, pos.z]];\n return undefined;\n }\n case 'coordinate': {\n const ll = (result as any)?.lnglat;\n if (ll && typeof ll.lng === 'number' && typeof ll.lat === 'number') {\n const c = this.Cesium.Cartesian3.fromDegrees(ll.lng, ll.lat, ll.height || 0);\n return [[c.x, c.y, c.z]];\n }\n return undefined;\n }\n default:\n return undefined;\n }\n })(),\n data: this._serializeMetrics(type, result),\n };\n this.measurements.push(record);\n if (currentHandler) {\n this.recordHandlers.set(record.id, currentHandler);\n }\n if (this.specifiedClear) {\n this._showDeleteLabels('html-label-container');\n }\n options.onComplete?.(result);\n const idx = this.actives.indexOf(currentHandler);\n if (idx >= 0) this.actives.splice(idx, 1);\n },\n };\n handler.start(wrapped);\n }\n\n clear() {\n const h = this.actives.pop();\n if (h) h.clear();\n this._removeAllDeleteLabels();\n this.specifiedClear = false;\n }\n\n cancel() {\n const h = this.actives.pop();\n if (h) h.stop();\n }\n\n disableDefaultSelection({ disableLeftClick = false, disableDoubleClick = true } = {}) {\n const handler = this.viewer?.cesiumWidget?.screenSpaceEventHandler;\n if (!handler) return;\n if (disableDoubleClick) {\n handler.removeInputAction(this.Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);\n }\n if (disableLeftClick) {\n handler.removeInputAction(this.Cesium.ScreenSpaceEventType.LEFT_CLICK);\n }\n }\n\n clearAll() {\n while (this.actives.length) {\n const h = this.actives.pop();\n try {\n h?.clear();\n } catch {}\n }\n for (const [, handler] of this.recordHandlers) {\n try {\n handler.clear();\n } catch {}\n }\n this.recordHandlers.clear();\n this.measurements = [];\n this._removeAllDeleteLabels();\n this.specifiedClear = false;\n }\n\n public getMeasurementsConfig(): MeasurementsConfig {\n return {\n measurements: this.measurements.map((m) => ({\n ...m,\n options: m.options ? { ...(m.options as any) } : m.options,\n positions: m.positions ? m.positions.map((p) => [p[0], p[1], p[2]]) : m.positions,\n data: m.data ? { ...(m.data as any) } : m.data,\n })),\n };\n }\n\n public setMeasurementsConfig(config: MeasurementsConfig) {\n if (!config?.measurements?.length) return;\n for (const rec of config.measurements) {\n let handler: IMeasure | null = null;\n switch (rec.type) {\n case 'horizontal':\n handler = new HorizontalMeasure(this.Cesium, this.viewer);\n break;\n case 'vertical':\n handler = new VerticalMeasure(this.Cesium, this.viewer);\n break;\n case 'triangle':\n handler = new TriangleMeasure(this.Cesium, this.viewer);\n break;\n case 'space':\n handler = new SpaceMeasure(this.Cesium, this.viewer);\n break;\n case 'area':\n handler = new AreaMeasure(this.Cesium, this.viewer);\n break;\n case 'circle':\n handler = new CircleMeasure(this.Cesium, this.viewer);\n break;\n case 'polyline':\n handler = new PolylineDistanceMeasure(this.Cesium, this.viewer);\n break;\n case 'terrainHeight':\n handler = new TerrainHeightMeasure(this.Cesium, this.viewer);\n break;\n case 'coordinate':\n handler = new CoordinateMeasure(this.Cesium, this.viewer);\n break;\n case 'rectangle':\n handler = new RectangleMeasure(this.Cesium, this.viewer);\n break;\n case 'regularPolygon':\n handler = new RegularPolygonMeasure(this.Cesium, this.viewer);\n break;\n default:\n handler = null;\n }\n handler?.rehydrate?.(rec, undefined);\n if (handler && rec.id) {\n this.recordHandlers.set(rec.id, handler);\n }\n const exists = this.measurements.find((r) => r.id === rec.id);\n if (!exists) this.measurements.push(rec);\n }\n if (this.specifiedClear) {\n this._showDeleteLabels('html-label-container');\n }\n }\n\n private _serializeMetrics(type: MeasurementType, result: any) {\n switch (type) {\n case 'space':\n return { distance: result?.distance };\n case 'horizontal':\n return { distance: result?.distance };\n case 'vertical':\n return { vertical: result?.vertical };\n case 'polyline':\n return { distance: result?.distance };\n case 'area':\n return { area: result?.area };\n case 'circle':\n return { radius: result?.radius, area: result?.area, perimeter: result?.perimeter };\n case 'rectangle':\n return { width: result?.width, height: result?.height, area: result?.area };\n case 'regularPolygon':\n return {\n sides: result?.sides,\n radius: result?.radius,\n perimeter: result?.perimeter,\n area: result?.area,\n };\n case 'triangle':\n return { lengths: result?.lengths, angles: result?.angles };\n case 'terrainHeight':\n return {\n terrainHeight: result?.terrainHeight,\n difference: result?.difference,\n position: result?.position,\n zeroPosition: result?.zeroPosition,\n };\n case 'coordinate':\n return { lnglat: result?.lnglat };\n default:\n return {};\n }\n }\n\n private _toCartesian(arr: [number, number, number]) {\n const Cesium = this.Cesium;\n return new Cesium.Cartesian3(arr[0], arr[1], arr[2]);\n }\n\n private _removeRecordVisual(_rec: MeasurementRecord) {\n const viewer = this.viewer;\n const Cesium = this.Cesium;\n const entities = viewer.entities.values;\n for (let i = entities.length - 1; i >= 0; i--) {\n const e = entities[i];\n try {\n viewer.entities.remove(e);\n } catch {}\n }\n const primitives = viewer.scene.primitives;\n const arr: any[] = [];\n primitives._primitives && primitives._primitives.forEach((p: any) => arr.push(p));\n for (const p of arr) {\n try {\n viewer.scene.primitives.remove(p);\n } catch {}\n }\n if (this.htmlLabelPool) {\n this.htmlLabelPool.removeAll();\n }\n }\n\n public toggleSpecifiedClear(containerId?: string) {\n if (!this.specifiedClear) {\n this.specifiedClear = true;\n if (!this.deleteLabelPool) {\n const cid = containerId || 'html-label-container';\n this.deleteLabelPool = new HtmlOverlayLabelPool(this.Cesium, this.viewer, cid);\n this.deleteLabelPool.registerTheme('measure-delete-label', {\n createElement: (el: HTMLDivElement, ctx: any) => {\n el.innerHTML = '删除';\n el.style.background = 'rgba(255,0,0,0.7)';\n el.style.color = '#fff';\n el.style.font = '12px sans-serif';\n el.style.padding = '2px 6px';\n el.style.borderRadius = '4px';\n el.style.whiteSpace = 'nowrap';\n },\n options: { offset: { x: 0, y: -10 } },\n });\n this.deleteLabelPool.eventBus.addListener(\n MarkerEventKey.Click,\n {\n name: 'measurement_delete_label_click',\n fn: (info: any) => {\n if (!info || info.theme !== 'measure-delete-label') return;\n const rid = info?.data?.recordId;\n if (rid) this.deleteMeasurement(rid);\n },\n },\n true,\n );\n }\n this._showDeleteLabels(containerId || 'html-label-container');\n } else {\n this._removeAllDeleteLabels();\n this.specifiedClear = false;\n }\n }\n\n public deleteMeasurement(recordId: string) {\n const handler = this.recordHandlers.get(recordId);\n if (handler) {\n try {\n handler.clear();\n } catch {}\n }\n this.recordHandlers.delete(recordId);\n this.measurements = this.measurements.filter((m) => m.id !== recordId);\n const did = this.deleteLabelIds.get(recordId);\n if (did && this.deleteLabelPool) {\n this.deleteLabelPool.removeByIds([did]);\n }\n this.deleteLabelIds.delete(recordId);\n }\n\n private _showDeleteLabels(containerId?: string) {\n if (!this.deleteLabelPool) return;\n const Cesium = this.Cesium;\n for (const rec of this.measurements) {\n const id = 'm_del_' + rec.id;\n if (this.deleteLabelIds.has(rec.id)) continue;\n const center = this._computeRecordCenter(rec);\n if (!center) continue;\n const carto = Cesium.Cartographic.fromCartesian(center);\n const lon = Cesium.Math.toDegrees(carto.longitude);\n const lat = Cesium.Math.toDegrees(carto.latitude);\n const h = carto.height || 0;\n this.deleteLabelPool.add(\n { recordId: rec.id },\n {\n id,\n lon,\n lat,\n height: h,\n theme: 'measure-delete-label',\n show: true,\n style: { zIndex: '1000' },\n },\n );\n this.deleteLabelIds.set(rec.id, id);\n }\n }\n\n private _removeAllDeleteLabels() {\n if (this.deleteLabelPool) {\n const ids = Array.from(this.deleteLabelIds.values());\n if (ids.length) this.deleteLabelPool.removeByIds(ids);\n }\n this.deleteLabelIds.clear();\n }\n\n private _computeRecordCenter(rec: MeasurementRecord) {\n const Cesium = this.Cesium;\n const posList = (rec.positions || []).map((p) => this._toCartesian(p));\n if (posList.length > 0) {\n const cx = posList.reduce((s, p) => s + p.x, 0) / posList.length;\n const cy = posList.reduce((s, p) => s + p.y, 0) / posList.length;\n const cz = posList.reduce((s, p) => s + p.z, 0) / posList.length;\n return new Cesium.Cartesian3(cx, cy, cz);\n }\n if (rec.type === 'coordinate' && rec.data?.lnglat) {\n const lng = rec.data.lnglat.lng;\n const lat = rec.data.lnglat.lat;\n const height = rec.data.lnglat.height || 0;\n return Cesium.Cartesian3.fromDegrees(lng, lat, height);\n }\n if (rec.type === 'terrainHeight' && rec.data?.position) {\n const p = rec.data.position;\n return new Cesium.Cartesian3(p.x, p.y, p.z);\n }\n return null;\n }\n}\n","import { IRoamTool, ViewRoamOptions, Waypoint } from './types';\n\nexport class CameraRoamTool implements IRoamTool {\n private Cesium: any;\n private viewer: any;\n private options: ViewRoamOptions | null = null;\n private entity: any = null;\n private viewEntities: any[] = [];\n private startTime: any = null;\n private stopTime: any = null;\n private isPaused = false;\n private lastTime: any = null;\n\n constructor({ Cesium, viewer }: { Cesium: any; viewer: any }) {\n this.Cesium = Cesium;\n this.viewer = viewer;\n }\n\n get Viewer() {\n return this.viewer;\n }\n\n get CesiumInstance() {\n return this.Cesium;\n }\n\n start(options: ViewRoamOptions) {\n this.clear();\n this.options = options;\n const waypoints = options.waypoints || [];\n if (waypoints.length < 2) return;\n\n this._setupEntities(options);\n\n // Setup Clock\n this.viewer.clock.startTime = this.startTime.clone();\n this.viewer.clock.stopTime = this.stopTime.clone();\n this.viewer.clock.currentTime = this.startTime.clone();\n this.viewer.clock.clockRange = options.loop ? this.Cesium.ClockRange.LOOP_STOP : this.Cesium.ClockRange.CLAMPED;\n this.viewer.clock.multiplier = 1;\n this.viewer.clock.shouldAnimate = true;\n\n this.viewer.clock.onTick.addEventListener(this.onTick);\n }\n\n preview(options: ViewRoamOptions) {\n this.clear();\n this.options = options;\n const waypoints = options.waypoints || [];\n if (waypoints.length < 2) return;\n \n this._setupEntities(options);\n \n // Ensure availability logic works without playing\n // We might want to set clock to start time so user sees the start point\n // but do NOT start animation\n // this.viewer.clock.currentTime = this.startTime.clone();\n // this.viewer.clock.shouldAnimate = false; \n // ^ Calling this might disrupt user's current time if they are looking at something else?\n // Actually, if the path is based on JulianDate.now(), it is in the future relative to when setupEntities is called.\n // So if the clock is \"now\", it should be visible.\n }\n\n private _setupEntities(options: ViewRoamOptions) {\n const waypoints = options.waypoints || [];\n\n // Calculate times and properties\n const property = new this.Cesium.SampledPositionProperty();\n const orientationProperty = new this.Cesium.SampledProperty(this.Cesium.Quaternion);\n \n // Normalize waypoints to Cartesian3 and Quaternion\n const points: { position: any; orientation: any }[] = [];\n \n for (const w of waypoints) {\n let position;\n if (w.destination) {\n if (w.destination.x !== undefined) {\n position = new this.Cesium.Cartesian3(w.destination.x, w.destination.y, w.destination.z);\n } else {\n position = w.destination;\n }\n } else if (w.lon !== undefined && w.lat !== undefined) {\n position = this.Cesium.Cartesian3.fromDegrees(w.lon, w.lat, w.height ?? 0);\n }\n\n let hpr;\n if (w.orientation) {\n hpr = new this.Cesium.HeadingPitchRoll(w.orientation.heading, w.orientation.pitch, w.orientation.roll);\n } else {\n hpr = this.Cesium.HeadingPitchRoll.fromDegrees(w.heading ?? 0, w.pitch ?? -30, w.roll ?? 0);\n }\n const orientation = this.Cesium.Transforms.headingPitchRollQuaternion(position, hpr);\n points.push({ position, orientation });\n }\n\n // Build Time\n const start = this.Cesium.JulianDate.now();\n const speed = options.speed || 100; // Default speed if not specified\n let accTime = 0;\n const times = [];\n\n for (let i = 0; i < points.length; i++) {\n if (i === 0) {\n times.push(start.clone());\n } else {\n const dist = this.Cesium.Cartesian3.distance(points[i-1].position, points[i].position);\n const duration = dist / Math.max(speed, 0.1);\n accTime += duration;\n times.push(this.Cesium.JulianDate.addSeconds(start, accTime, new this.Cesium.JulianDate()));\n }\n property.addSample(times[i], points[i].position);\n orientationProperty.addSample(times[i], points[i].orientation);\n }\n\n this.startTime = times[0];\n this.stopTime = times[times.length - 1];\n\n // Create Main Entity (Drone)\n const entityOptions: any = {\n availability: new this.Cesium.TimeIntervalCollection([\n new this.Cesium.TimeInterval({ start: this.startTime, stop: this.stopTime }),\n ]),\n position: property,\n orientation: orientationProperty,\n };\n\n if (options.modelUrl) {\n entityOptions.model = {\n uri: options.modelUrl,\n scale: options.modelScale ?? 1.0,\n minimumPixelSize: 64,\n runAnimations: options.modelAnimate ?? true,\n };\n } else {\n // Invisible point if no model, or maybe a small pixel\n entityOptions.point = { pixelSize: 1, color: this.Cesium.Color.TRANSPARENT };\n }\n\n // Removed entityOptions.path to use static Polyline instead for better visibility\n if (options.showPath) {\n this.viewEntities.push(this.viewer.entities.add({\n polyline: {\n positions: points.map(p => p.position),\n width: 3,\n material: this.Cesium.Color.GREEN,\n // clampToGround: false\n }\n }));\n }\n\n this.entity = this.viewer.entities.add(entityOptions);\n\n // Show Stops (Viewpoint Icons)\n if (options.showStops) {\n points.forEach((p, index) => {\n // Calculate ground position for drop line\n const carto = this.Cesium.Cartographic.fromCartesian(p.position);\n const groundPos = this.Cesium.Cartesian3.fromRadians(carto.longitude, carto.latitude, 0);\n\n this.viewEntities.push(this.viewer.entities.add({\n position: p.position,\n point: {\n pixelSize: 8,\n color: this.Cesium.Color.YELLOW,\n outlineColor: this.Cesium.Color.BLACK,\n outlineWidth: 1\n },\n label: {\n text: '' + (index + 1),\n font: '12px sans-serif',\n pixelOffset: new this.Cesium.Cartesian2(0, -15),\n fillColor: this.Cesium.Color.WHITE,\n outlineColor: this.Cesium.Color.BLACK,\n outlineWidth: 2,\n style: this.Cesium.LabelStyle.FILL_AND_OUTLINE,\n },\n polyline: {\n positions: [p.position, groundPos],\n width: 2,\n material: new this.Cesium.PolylineDashMaterialProperty({\n color: this.Cesium.Color.RED,\n dashLength: 16\n })\n }\n }));\n });\n }\n }\n\n private onTick = (clock: any) => {\n if (!this.options || !this.entity) return;\n const t = clock.currentTime;\n \n // Check bounds\n if (this.Cesium.JulianDate.lessThan(t, this.startTime) || \n this.Cesium.JulianDate.greaterThan(t, this.stopTime)) {\n if (!this.options.loop && this.Cesium.JulianDate.greaterThan(t, this.stopTime)) {\n // End\n if (this.viewer.clock.shouldAnimate) {\n this.viewer.clock.shouldAnimate = false;\n if (this.options.onComplete) this.options.onComplete();\n }\n }\n return;\n }\n\n const pos = this.entity.position.getValue(t);\n const ori = this.entity.orientation.getValue(t);\n\n if (pos && ori) {\n // Sync Camera\n // Calculate Heading Pitch Roll from Quaternion\n // We need to convert the Global Quaternion back to Local HeadingPitchRoll\n // 1. Create Model Matrix from Position and Orientation\n const modelMatrix = this.Cesium.Matrix4.fromTranslationQuaternionRotationScale(\n pos,\n ori,\n new this.Cesium.Cartesian3(1, 1, 1),\n new this.Cesium.Matrix4()\n );\n\n // 2. Extract Local HPR\n const hpr = this.Cesium.Transforms.fixedFrameToHeadingPitchRoll(\n modelMatrix,\n this.viewer.scene.globe.ellipsoid,\n this.Cesium.Transforms.eastNorthUpToFixedFrame,\n new this.Cesium.HeadingPitchRoll()\n );\n \n this.viewer.camera.setView({\n destination: pos,\n orientation: {\n heading: hpr.heading,\n pitch: hpr.pitch,\n roll: hpr.roll\n }\n });\n \n if (this.options.onTick) this.options.onTick(t, pos, hpr);\n }\n }\n\n stop() {\n this.viewer.clock.shouldAnimate = false;\n this.viewer.clock.onTick.removeEventListener(this.onTick);\n }\n\n pause() {\n this.viewer.clock.shouldAnimate = false;\n this.isPaused = true;\n }\n\n resume() {\n this.viewer.clock.shouldAnimate = true;\n this.isPaused = false;\n }\n\n clear() {\n this.stop();\n if (this.entity) {\n this.viewer.entities.remove(this.entity);\n this.entity = null;\n }\n for (const e of this.viewEntities) {\n this.viewer.entities.remove(e);\n }\n this.viewEntities = [];\n this.options = null;\n }\n \n // Helper to capture current view in the format we want\n captureCurrentView(): Waypoint {\n const destination = this.viewer.camera.position.clone(); // Cartesian3\n const h = this.viewer.camera.heading;\n const p = this.viewer.camera.pitch;\n const r = this.viewer.camera.roll;\n \n return {\n destination: { x: destination.x, y: destination.y, z: destination.z },\n orientation: { heading: h, pitch: p, roll: r }\n };\n }\n\n // Legacy/Helper methods compatibility if needed, but we are refactoring.\n // We'll keep minimal interface compliance.\n}\n","import { IRoamTool, PathRoamOptions } from './types';\n\nexport class PathRoamTool implements IRoamTool {\n private Cesium: any;\n private viewer: any;\n private entity: any = null;\n private positionProperty: any = null;\n private startTime: any = null;\n private stopTime: any = null;\n private options: PathRoamOptions | null = null;\n private cameraOffset: any = null;\n\n constructor({ Cesium, viewer }: { Cesium: any; viewer: any }) {\n this.Cesium = Cesium;\n this.viewer = viewer;\n }\n\n get Viewer() {\n return this.viewer;\n }\n\n get CesiumInstance() {\n return this.Cesium;\n }\n\n start(options: PathRoamOptions) {\n this.clear();\n this.options = options;\n const positions = this.normalizePositions(options.positions || []);\n if (!positions.length) return;\n const speed = options.speed ?? 30;\n const times = this.buildTimes(positions, speed);\n const property = new this.Cesium.SampledPositionProperty();\n for (let i = 0; i < positions.length; i++) {\n property.addSample(times[i], positions[i]);\n }\n this.positionProperty = property;\n const orientation = new this.Cesium.VelocityOrientationProperty(property);\n const showPath = options.showPath ?? true;\n const pathColor = options.pathColor ?? this.Cesium.Color.YELLOW;\n const pathWidth = options.pathWidth ?? 3;\n const pointColor = options.pointColor ?? this.Cesium.Color.RED;\n const pointPixelSize = options.pointPixelSize ?? 8;\n\n const entityOptions: any = {\n availability: new this.Cesium.TimeIntervalCollection([\n new this.Cesium.TimeInterval({ start: this.startTime, stop: this.stopTime }),\n ]),\n position: property,\n orientation,\n path: showPath ? { material: pathColor, width: pathWidth, leadTime: 0 } : undefined,\n };\n\n if (options.modelUrl) {\n entityOptions.model = {\n uri: options.modelUrl,\n scale: options.modelScale ?? 1.0,\n minimumPixelSize: 64,\n runAnimations: options.modelAnimate ?? true,\n };\n } else {\n entityOptions.point = { color: pointColor, pixelSize: pointPixelSize };\n }\n\n this.entity = this.viewer.entities.add(entityOptions);\n this.viewer.clock.startTime = this.startTime.clone();\n this.viewer.clock.stopTime = this.stopTime.clone();\n this.viewer.clock.currentTime = this.startTime.clone();\n this.viewer.clock.clockRange = options.loop\n ? this.Cesium.ClockRange.LOOP_STOP\n : this.Cesium.ClockRange.CLAMPED;\n this.viewer.clock.multiplier = 1;\n this.viewer.clock.shouldAnimate = true;\n if (options.initialView) {\n this.viewer.camera.setView({\n destination: options.initialView.destination,\n orientation: options.initialView.orientation,\n });\n this.cameraOffset = null; // Reset offset\n } else if (options.followCamera) {\n this.viewer.trackedEntity = this.entity;\n } else if (options.lookAtOffset) {\n this.viewer.camera.lookAt(this.entity.position, options.lookAtOffset);\n }\n this.viewer.clock.onTick.addEventListener(this.onTick);\n }\n\n stop() {\n this.viewer.clock.shouldAnimate = false;\n this.viewer.clock.onTick.removeEventListener(this.onTick);\n if (this.viewer.trackedEntity === this.entity) this.viewer.trackedEntity = undefined;\n }\n\n clear() {\n this.stop();\n if (this.entity) {\n this.viewer.entities.remove(this.entity);\n this.entity = null;\n }\n this.positionProperty = null;\n this.startTime = null;\n this.stopTime = null;\n this.options = null;\n try {\n this.viewer.camera.lookAtTransform(this.Cesium.Matrix4.IDENTITY);\n } catch {}\n }\n\n private normalizePositions(arr: Array<[number, number, number?]> | any[]) {\n const out: any[] = [];\n for (const p of arr) {\n if (Array.isArray(p)) {\n const [lon, lat, height] = p as [number, number, number?];\n out.push(this.Cesium.Cartesian3.fromDegrees(lon, lat, height ?? 0));\n } else if (p?.x !== undefined && p?.y !== undefined && p?.z !== undefined) {\n out.push(p);\n }\n }\n return out;\n }\n\n private buildTimes(positions: any[], speed: number) {\n const times: any[] = [];\n const start = this.Cesium.JulianDate.now();\n let acc = 0;\n for (let i = 0; i < positions.length; i++) {\n if (i === 0) {\n times.push(start.clone());\n } else {\n const d = this.Cesium.Cartesian3.distance(positions[i - 1], positions[i]);\n acc += d / Math.max(speed, 0.1);\n times.push(this.Cesium.JulianDate.addSeconds(start, acc, new this.Cesium.JulianDate()));\n }\n }\n this.startTime = times[0];\n this.stopTime = times[times.length - 1];\n return times;\n }\n\n private onTick = (clock: any) => {\n if (!this.options || !this.positionProperty) return;\n const t = clock.currentTime;\n const pos = this.positionProperty.getValue(t);\n\n // Custom Camera Follow Logic (Initial View + Follow)\n if (this.options.followCamera && this.options.initialView && pos) {\n if (!this.cameraOffset) {\n // Calculate offset on first valid position relative to initial view\n this.cameraOffset = this.Cesium.Cartesian3.subtract(\n this.options.initialView.destination,\n pos,\n new this.Cesium.Cartesian3(),\n );\n }\n const newCamPos = this.Cesium.Cartesian3.add(\n pos,\n this.cameraOffset,\n new this.Cesium.Cartesian3(),\n );\n this.viewer.camera.setView({\n destination: newCamPos,\n orientation: this.options.initialView.orientation,\n });\n }\n\n if (pos && this.options.onTick) this.options.onTick(t, pos);\n if (this.Cesium.JulianDate.greaterThanOrEquals(t, this.stopTime)) {\n if (!this.options.loop) {\n if (this.options.onComplete) this.options.onComplete();\n this.stop();\n }\n }\n };\n}\n"],"names":["BufferedHierarchicalAggregator","Cesium","viewer","options","__publicField","globe","surface","provider","tilingScheme","pending","currentScene","currentGlobe","groupByTheme","rebuild","update","count","threshold","debug","providerChanged","schemeChanged","levels","minLevel","maxLevel","index","tileLevel","size","points","newPoints","isUpdate","pt","newData","_a","_b","idx","p","oldPt","level","grid","carto","tileXY","key","cell","iAll","iSkip","theme","group","iGroup","updated","ids","idSet","groupKey","groupPoints","filteredGroup","_c","_d","_e","_f","effectiveThreshold","labelCount","processCell","levelIdx","lonIdx","latIdx","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","isLastLevel","rect","west","south","east","north","centerLon","centerLat","rawGroupPoints","clusterLon","clusterLat","clusterHeight","finalTheme","clusterId","tileLevelForDebug","tiles","visited","t","minDefinedLevel","maxDefinedLevel","nearestIndex","minDiff","i","diff","targetTileLevel","tileX","tileY","factor","tileWestDeg","tileEastDeg","tileSouthDeg","tileNorthDeg","westIdx","eastIdx","southIdx","northIdx","text","entity","e","scene","MarkerEventKey","MarkerEventBus","listener","overwrite","map","existed","name","data","err","DOM_EVENT_MAP","HtmlOverlayLabelPool","containerId","eventBus","openWheel","id","container","themeName","lon","lat","height","show","notCreateElement","style","themeOptions","label","el","domEvent","labelData","lastTime","event","dom","currTime","unload","items","filter","positions","heightResult","finalHeight","worldPos","position","st","screenPosition","offset","offsetX","offsetY","TooltipManager","PointDrawer","movement","cartographic","lng","result","LineDrawer","pos","point","lnglats","RectangleDrawer","c1","c2","sw","ne","CircleDrawer","CesiumInstance","viewerInstance","click","center","ray","edge","radius","dynamicRadius","centerCarto","centerLngLat","step","circlePoints","circleLnglats","angle","angleRad","geodesic","interpolated","destCartesian","PolygonDrawer","DrawTool","type","freeGlobal","freeSelf","root","Symbol","objectProto","hasOwnProperty","nativeObjectToString","symToStringTag","getRawTag","value","isOwn","tag","unmasked","objectToString","nullTag","undefinedTag","baseGetTag","isObjectLike","isArray","isObject","asyncTag","funcTag","genTag","proxyTag","isFunction","coreJsData","maskSrcKey","uid","isMasked","func","funcProto","funcToString","toSource","reRegExpChar","reIsHostCtor","reIsNative","baseIsNative","pattern","getValue","object","getNative","WeakMap","objectCreate","baseCreate","proto","defineProperty","arrayEach","array","iteratee","length","MAX_SAFE_INTEGER","reIsUint","isIndex","baseAssignValue","eq","other","assignValue","objValue","isLength","isArrayLike","isPrototype","Ctor","baseTimes","n","argsTag","baseIsArguments","propertyIsEnumerable","isArguments","stubFalse","freeExports","freeModule","moduleExports","Buffer","nativeIsBuffer","isBuffer","arrayTag","boolTag","dateTag","errorTag","mapTag","numberTag","objectTag","regexpTag","setTag","stringTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","typedArrayTags","baseIsTypedArray","baseUnary","freeProcess","nodeUtil","types","nodeIsTypedArray","isTypedArray","arrayLikeKeys","inherited","isArr","isArg","isBuff","isType","skipIndexes","overArg","transform","arg","nativeKeys","baseKeys","keys","nativeCreate","hashClear","hashDelete","HASH_UNDEFINED","hashGet","hashHas","hashSet","Hash","entries","entry","listCacheClear","assocIndexOf","arrayProto","splice","listCacheDelete","lastIndex","listCacheGet","listCacheHas","listCacheSet","ListCache","Map","mapCacheClear","isKeyable","getMapData","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","arrayPush","values","getPrototype","stackClear","stackDelete","stackGet","stackHas","LARGE_ARRAY_SIZE","stackSet","pairs","Stack","cloneBuffer","buffer","isDeep","arrayFilter","predicate","resIndex","stubArray","nativeGetSymbols","getSymbols","symbol","baseGetAllKeys","keysFunc","symbolsFunc","getAllKeys","DataView","Promise","Set","promiseTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","getTag","ctorString","initCloneArray","Uint8Array","cloneArrayBuffer","arrayBuffer","cloneDataView","dataView","reFlags","cloneRegExp","regexp","symbolProto","symbolValueOf","cloneSymbol","cloneTypedArray","typedArray","symbolTag","initCloneByTag","initCloneObject","baseIsMap","nodeIsMap","isMap","baseIsSet","nodeIsSet","isSet","cloneableTags","baseClone","bitmask","customizer","stack","isFunc","stacked","subValue","props","CLONE_DEEP_FLAG","CLONE_SYMBOLS_FLAG","cloneDeep","EditMode","GLTFManageEventKey","GLTFManage","models","gltf","model","info","newHeading","newPitch","newRoll","headingPitchRoll","modelMatrix","boundingSphere","worldBoundingSphere","g","num","curModel","scale","mode","cameraController","cartesian","from","to","deltaLongitude","deltaLatitude","m1","m2","mat3","q","f","instantiation","list","parameter","item","getEditState","draggedModel","startModelMatrix","startModelCartographic","startMouseCartographic","startMousePosition","clearStatus","initDragged","modelId","modelPosition","rayHit","hit","currentMouseCartographic","angleDelta","currAngle","callbackInfo","sin","cos","x","y","geometry","instnce","halfSide","boxGeometry","color","width","headWidth","headLength","sideLength","line","arrow","arrowOffset","lineOffset","scratchOffset","newModelMatrix","startPosition","startCartographic","newCartographic","newPosition","rotationMatrix","dragEndCallback","deltaY","modelHeadingPitchRoll","getDynamicImgMaterial","MaterialType","TrailLineMaterialProperty","opts","time","_getWallShader","getWallMaterial","materail","getPolylineFlowMaterialProperty","Color","defineProperties","Event","createPropertyDescriptor","Property","defaultValue","defaultVal","DEFAULT_EMPTY_OBJECT","_materialType","PolylineFlowMaterialProperty","_time","MaterialManager","category","fn","themeKey","material","force","materialMap","EntityGroup","entities","primitives","dataItem","aggregator","cardPool","visible","primitive","bill","immediately","EntityLayer","materialManager","opt","wall","minHeights","maxHeights","poly","outerRing","outerCartesian","holes","hole","_hole","polygonHierarchy","isAppendPoints","groupId","w","pointList","dataItemList","allPoints","groupIds","EntityLayerManager","layerId","layer","dataList","convertGeoJsonToEntityData","geoJson","feature","properties","polygon","geom","PrimitiveManager","entityLayerManager","geometryInstance","_item","themePrimitive","appearance","isDashed","lineMaterialKey","dashPattern","dashLength","cesiumDash","polygonMaterialKey","patternLength","unitLength","dashBits","assigned","len","bit","materialThemes","_holeDegrees","geometryInstanceInfo","oldThemePrimitive","themeMap","geometryInstances","minX","minY","minZ","maxX","maxY","maxZ","offsetHeight","HorizontalMeasure","ctx","clampedPos","terrainHeight","groundPos","groundDashColor","groundLine","p1","p2","d","mid","mc","total","last","lc","record","htmlLabelPool","lineColor","dashColor","posList","seg","sid","VerticalMeasure","ray0","cart","c0","base","basePoint","solidColor","O","D","B","U","w0","a","b","c","den","s","second","solidColor2","dashColor2","secondPoint","vertical","pid","TriangleMeasure","h1","h2","low","high","cl","maxH","third","horizontal","hypotenuse","lenV","lenH","lenHyp","midV","midH","midHyp","mV","mH","mHyp","idV","idH","idHyp","vLowToHigh","vLowToThird","vHighToThird","vHighToLow","dotA","magA","dotB","magB","angleA","angleB","cLow","cHigh","idAngA","idAngB","ratio","markerLen","dirV","dirH","pOffV","pOffH","pCorner","rightMarkerSeg1","rightMarkerSeg2","pv","ph","phyp","pLow","pHigh","SpaceMeasure","p0","AreaMeasure","hierarchy","instance","occludedColor","polylinePositions","lineEntity","pts","points2D","area2D","j","cc","all","pointColor","hoverPoint","lastPoint","p2d","prev","curr","next","v1x","v1y","v2x","v2y","len1","len2","dot","ang","pc","aid","CircleMeasure","area","perimeter","centerLabelPos","cartoCenter","h","PolylineDistanceMeasure","lastId","TerrainHeightMeasure","terrainPos","heightDiff","labelText","CoordinateMeasure","ll","RectangleMeasure","thirdPoint","corners","edges","mc2","surfacePositions","corner","pointEntity","tPrev","ep1","ep2","p3","plane","pts2d","vx","vy","baseLen","ux","nx","ny","wx","wy","d2","worldPoints","p2w","rect2d","RegularPolygonMeasure","sides","uniquePoints","MeasurementTool","handler","currentHandler","wrapped","o","disableLeftClick","disableDoubleClick","m","config","rec","r","arr","_rec","cid","rid","recordId","did","cx","cy","cz","CameraRoamTool","clock","ori","hpr","waypoints","property","orientationProperty","orientation","start","speed","accTime","times","duration","entityOptions","destination","PathRoamTool","newCamPos","showPath","pathColor","pathWidth","pointPixelSize","out","acc"],"mappings":"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","x_google_ignoreList":[10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106]}
|