@jorgmoritz/gis-manager 0.1.36 → 0.1.38
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/dist/{VertexDetailInfo-Cz9y16HG.d.cts → VertexDetailInfo-DYr1P_fe.d.cts} +7 -3
- package/dist/{VertexDetailInfo-Cz9y16HG.d.ts → VertexDetailInfo-DYr1P_fe.d.ts} +7 -3
- package/dist/index.cjs +1110 -705
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +328 -34
- package/dist/index.d.ts +328 -34
- package/dist/index.js +1104 -706
- package/dist/index.js.map +1 -1
- package/dist/vue/index.cjs +871 -679
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.d.cts +1 -1
- package/dist/vue/index.d.ts +1 -1
- package/dist/vue/index.js +871 -679
- package/dist/vue/index.js.map +1 -1
- package/package.json +1 -1
package/dist/vue/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/assets.ts","../../src/utils/events.ts","../../src/core/LayerManager.ts","../../src/core/toggle2D3D.ts","../../src/core/CameraManager.ts","../../src/core/SceneManager.ts","../../src/core/StateManager.ts","../../src/core/path-manager/HeightMarker.ts","../../src/core/path-manager/CameraFOVController.ts","../../src/core/path-manager/PathPreview.ts","../../src/core/path-manager/FrustumPyramid.ts","../../src/core/path-manager/AirplaneCursor.ts","../../src/core/path-manager/editing/VertexLabelManager.ts","../../src/core/path-manager/editing/PathEditingUtils.ts","../../src/core/path-manager/editing/VertexInsertionHandler.ts","../../src/core/path-manager/editing/ContextMenuManager.ts","../../src/core/path-manager/editing/VertexDragHandler.ts","../../src/core/path-manager/editing/PathEditingEventHandler.ts","../../src/core/path-manager/editing/VertexHandleStyleManager.ts","../../src/core/path-manager/editing/PathStateManager.ts","../../src/core/path-manager/pathEditing.ts","../../src/core/path-manager/ArrowShape.ts","../../src/core/path-manager/startPathDrawing.ts","../../src/utils/sinoflyAdapter.ts","../../src/core/path-manager/renderFlightPath.ts","../../src/core/CZMLPathManager.ts","../../src/core/PolygonEditor.ts","../../src/core/CZMLManager.ts","../../src/adapters/vue/GisViewer.ts","../../src/adapters/vue/useGisViewer.ts"],"names":["h","height","layer","sortedWaypoints","colors","area","ref","onMounted","onBeforeUnmount"],"mappings":"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","file":"index.js","sourcesContent":["/* Cesium assets configuration helpers */\r\nimport type * as Cesium from 'cesium';\r\n\r\nexport interface CesiumAssetsOptions {\r\n baseUrl: string; // URL where Cesium Assets/Widgets/ThirdParty are served\r\n ionToken?: string; // Optional Cesium Ion access token\r\n}\r\n\r\nexport function configureCesiumAssets(opts: CesiumAssetsOptions): void {\r\n if (typeof window !== 'undefined') {\r\n (window as any).CESIUM_BASE_URL = opts.baseUrl;\r\n if (opts.ionToken) (window as any).__CESIUM_ION_TOKEN__ = opts.ionToken;\r\n }\r\n // Best-effort: call buildModuleUrl.setBaseUrl if present\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod: typeof Cesium | undefined = require('cesium');\r\n const anyCesium = mod as any;\r\n if (anyCesium?.buildModuleUrl?.setBaseUrl) {\r\n anyCesium.buildModuleUrl.setBaseUrl(opts.baseUrl);\r\n }\r\n if (opts.ionToken && anyCesium?.Ion) {\r\n anyCesium.Ion.defaultAccessToken = opts.ionToken;\r\n }\r\n } catch {\r\n // ignore if cesium not available at runtime\r\n }\r\n}\r\n\r\nexport function getCesiumBaseUrl(): string | undefined {\r\n if (typeof window !== 'undefined' && (window as any).CESIUM_BASE_URL) {\r\n return (window as any).CESIUM_BASE_URL as string;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function assertCesiumAssetsConfigured(): void {\r\n const base = getCesiumBaseUrl();\r\n if (!base && typeof console !== 'undefined') {\r\n // Friendly warning to consumers\r\n // eslint-disable-next-line no-console\r\n console.warn('[cesium-gis-manager] CESIUM_BASE_URL is not configured. Cesium assets may fail to load in browser. Call configureCesiumAssets({ baseUrl }) in your app and ensure assets are hosted.');\r\n }\r\n}\r\n\r\n/** Configure Cesium Ion token only. Safe to call before or after Cesium is imported. */\r\nexport function configureCesiumIonToken(token: string): void {\r\n if (typeof window !== 'undefined') {\r\n (window as any).__CESIUM_ION_TOKEN__ = token;\r\n }\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod: typeof Cesium | undefined = require('cesium');\r\n const anyCesium = mod as any;\r\n if (anyCesium?.Ion) anyCesium.Ion.defaultAccessToken = token;\r\n } catch {\r\n // ignore if cesium not available at runtime\r\n }\r\n}\r\n\r\nexport function getCesiumIonToken(): string | undefined {\r\n if (typeof window !== 'undefined' && (window as any).__CESIUM_ION_TOKEN__) {\r\n return (window as any).__CESIUM_ION_TOKEN__ as string;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Ensure the provided Cesium namespace uses the configured Ion token.\r\n * This solves cases where the app's Cesium module instance differs from the one we can require(),\r\n * especially under ESM bundlers. Call this with the Cesium instance actually used to construct Viewer.\r\n */\r\nexport function ensureCesiumIonToken(CesiumNS: typeof Cesium): void {\r\n try {\r\n const token = getCesiumIonToken();\r\n if (token && (CesiumNS as any)?.Ion) {\r\n (CesiumNS as any).Ion.defaultAccessToken = token;\r\n }\r\n } catch {\r\n // no-op\r\n }\r\n}\r\n","export type Listener<T> = (payload: T) => void;\r\n\r\nexport class Emitter<T> {\r\n private listeners: Set<Listener<T>> = new Set();\r\n on(fn: Listener<T>): () => void {\r\n this.listeners.add(fn);\r\n return () => this.off(fn);\r\n }\r\n off(fn: Listener<T>): void {\r\n this.listeners.delete(fn);\r\n }\r\n emit(payload: T): void {\r\n for (const fn of this.listeners) fn(payload);\r\n }\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n}\r\n\r\n/**\r\n * 相机 FOV 变化事件\r\n */\r\nexport interface CameraFOVChangeEvent {\r\n /** 当前 FOV 值(度) */\r\n fov: number;\r\n /** 等效焦距(mm) */\r\n focalLength: number;\r\n /** 事件来源 */\r\n source: 'controller' | 'preview' | 'frustum' | 'user';\r\n}\r\n\r\n/**\r\n * 相机姿态变化事件\r\n */\r\nexport interface CameraPoseChangeEvent {\r\n /** 相机位置 */\r\n position: any; // Cesium.Cartesian3\r\n /** 航向角(度) */\r\n heading: number;\r\n /** 俯仰角(度) */\r\n pitch: number;\r\n /** 翻滚角(度) */\r\n roll: number;\r\n /** FOV(度) */\r\n fov?: number;\r\n /** 事件来源 */\r\n source: 'preview' | 'frustum' | 'airplane' | 'user';\r\n}\r\n\r\n/**\r\n * 视锥体形状变化事件\r\n */\r\nexport interface FrustumShapeChangeEvent {\r\n /** FOV(度) */\r\n fov: number;\r\n /** 视锥体长度(米) */\r\n length: number;\r\n /** 宽高比 */\r\n aspectRatio: number;\r\n /** 事件来源 */\r\n source: 'controller' | 'user';\r\n}\r\n\r\n/**\r\n * 飞机游标姿态变化事件\r\n */\r\nexport interface CursorPoseChangeEvent {\r\n /** 游标位置 */\r\n position: any; // Cesium.Cartesian3\r\n /** 航向角(度) */\r\n heading: number;\r\n /** 俯仰角(度) */\r\n pitch: number;\r\n /** 翻滚角(度) */\r\n roll: number;\r\n /** 海拔高度(米) */\r\n altitude: number;\r\n /** 事件来源 */\r\n source: 'cursor' | 'user';\r\n}\r\n\r\n/**\r\n * 全局事件总线\r\n * 用于管理 CameraFOVController、PathPreview、FrustumPyramid 之间的通信\r\n */\r\nexport class CameraEventBus {\r\n /** FOV 变化事件 */\r\n public readonly onFOVChange = new Emitter<CameraFOVChangeEvent>();\r\n \r\n /** 相机姿态变化事件 */\r\n public readonly onPoseChange = new Emitter<CameraPoseChangeEvent>();\r\n \r\n /** 视锥体形状变化事件 */\r\n public readonly onFrustumShapeChange = new Emitter<FrustumShapeChangeEvent>();\r\n\r\n /** 飞机游标姿态变化事件 */\r\n public readonly onCursorPoseChange = new Emitter<CursorPoseChangeEvent>();\r\n\r\n /**\r\n * 清理所有监听器\r\n */\r\n public destroy(): void {\r\n this.onFOVChange.clear();\r\n this.onPoseChange.clear();\r\n this.onFrustumShapeChange.clear();\r\n this.onCursorPoseChange.clear();\r\n }\r\n}\r\n\r\n/**\r\n * 全局单例事件总线实例\r\n * 用于跨组件通信\r\n * \r\n * 使用 window 对象存储确保真正的单例,\r\n * 避免 npm link 导致的多实例问题\r\n */\r\nconst GLOBAL_KEY = '__gisManager_globalCameraEventBus__';\r\n\r\nfunction getGlobalEventBus(): CameraEventBus {\r\n if (typeof window !== 'undefined') {\r\n if (!(window as any)[GLOBAL_KEY]) {\r\n (window as any)[GLOBAL_KEY] = new CameraEventBus();\r\n }\r\n return (window as any)[GLOBAL_KEY];\r\n }\r\n // Node.js 环境回退\r\n return new CameraEventBus();\r\n}\r\n\r\nexport const globalCameraEventBus = getGlobalEventBus();\r\n","import type * as Cesium from 'cesium';\r\nimport { Emitter } from '../utils/events';\r\nimport type { ImageryOptions, TerrainOptions } from '../types/public';\r\n\r\nexport type LayerType = 'terrain' | 'imagery' | 'tileset' | 'datasource';\r\n\r\nexport interface LayerHandle {\r\n id: string;\r\n type: LayerType;\r\n dispose(): void;\r\n}\r\n\r\nexport interface LayerEvents {\r\n added: LayerHandle;\r\n removed: LayerHandle;\r\n error: { id?: string; error: unknown };\r\n}\r\n\r\nexport interface PhotoBillboardItem {\r\n lon: number;\r\n lat: number;\r\n height?: number;\r\n imgUrl: string;\r\n name?: string;\r\n id?: string;\r\n}\r\n\r\nexport interface PhotoBillboardLayerOptions {\r\n items: PhotoBillboardItem[];\r\n layerName?: string;\r\n size?: number;\r\n preloadImages?: boolean;\r\n}\r\n\r\nexport interface PhotoBillboardResult {\r\n handle: LayerHandle;\r\n dataSource: Cesium.CustomDataSource;\r\n layerName: string;\r\n added: number;\r\n total: number;\r\n}\r\n\r\nlet layerIdSeq = 0;\r\n\r\nexport class LayerManager {\r\n private imageryIdMap = new Map<string, Cesium.ImageryLayer>();\r\n private tilesetIdMap = new Map<string, Cesium.Cesium3DTileset>();\r\n private dataSourceIdMap = new Map<string, Cesium.CustomDataSource>();\r\n private terrainId?: string;\r\n public events = new Emitter<LayerEvents>();\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Cesium.Viewer,\r\n ) {}\r\n\r\n addDOM(options: ImageryOptions): LayerHandle | undefined {\r\n try {\r\n const provider = this.createImageryProvider(options);\r\n if (!provider) return undefined;\r\n const layer = (this.viewer.imageryLayers as any).addImageryLayer\r\n ? (this.viewer.imageryLayers as any).addImageryLayer(provider)\r\n : (this.viewer.imageryLayers.addImageryProvider?.(provider) ??\r\n (this.viewer.imageryLayers as any).addImageryProvider?.(provider));\r\n const id = `img_${++layerIdSeq}`;\r\n this.imageryIdMap.set(id, layer);\r\n if (typeof options.opacity === 'number') layer.alpha = options.opacity;\r\n const handle: LayerHandle = { id, type: 'imagery', dispose: () => this.remove(id) };\r\n this.events.emit({ added: handle } as any);\r\n return handle;\r\n } catch (error) {\r\n this.events.emit({ error: { error } } as any);\r\n return undefined;\r\n }\r\n }\r\n\r\n async addDEM(options: TerrainOptions): Promise<LayerHandle | undefined> {\r\n try {\r\n const tp = await this.createTerrain(options);\r\n if (!tp) return undefined;\r\n this.viewer.terrainProvider = tp;\r\n const id = (this.terrainId = `ter_${++layerIdSeq}`);\r\n const handle: LayerHandle = { id, type: 'terrain', dispose: () => this.remove(id) };\r\n this.events.emit({ added: handle } as any);\r\n return handle;\r\n } catch (error) {\r\n this.events.emit({ error: { error } } as any);\r\n return undefined;\r\n }\r\n }\r\n\r\n async addDSM(options: {\r\n url: string;\r\n show?: boolean;\r\n maximumScreenSpaceError?: number;\r\n }): Promise<LayerHandle | undefined> {\r\n try {\r\n const tileset = await (this.CesiumNS as any).Cesium3DTileset.fromUrl(options.url, {\r\n show: options.show ?? true,\r\n maximumScreenSpaceError: options.maximumScreenSpaceError ?? 16,\r\n requestWaterMask: true,\r\n requestVertexNormals: true,\r\n });\r\n this.viewer.scene.primitives.add(tileset);\r\n const id = `dsm_${++layerIdSeq}`;\r\n this.tilesetIdMap.set(id, tileset);\r\n const handle: LayerHandle = { id, type: 'tileset', dispose: () => this.remove(id) };\r\n this.events.emit({ added: handle } as any);\r\n return handle;\r\n } catch (error) {\r\n this.events.emit({ error: { error } } as any);\r\n return undefined;\r\n }\r\n }\r\n\r\n async addPhotoBillboards(options: PhotoBillboardLayerOptions): Promise<PhotoBillboardResult | undefined> {\r\n const { items, layerName = 'photo-billboards', size = 110, preloadImages = true } = options;\r\n const borderColor = '#1e90ff';\r\n const borderWidth = 1;\r\n\r\n if (!Array.isArray(items) || items.length === 0) {\r\n console.warn('[LayerManager] No photo billboard data provided');\r\n return undefined;\r\n }\r\n\r\n const C = this.CesiumNS as any;\r\n let dataSource: Cesium.CustomDataSource | undefined;\r\n\r\n try {\r\n dataSource = new C.CustomDataSource(layerName) as Cesium.CustomDataSource;\r\n this.viewer.dataSources.add(dataSource);\r\n\r\n const baseId = `photo-marker-${Date.now()}`;\r\n let added = 0;\r\n\r\n await Promise.all(\r\n items.map(async (item, index) => {\r\n if (typeof item.lon !== 'number' || typeof item.lat !== 'number' || !item.imgUrl) {\r\n console.warn('[LayerManager] Skipping invalid photo marker:', item);\r\n return;\r\n }\r\n\r\n let billboardImage = item.imgUrl;\r\n if (preloadImages) {\r\n try {\r\n const img = await C.Resource.fetchImage({ url: item.imgUrl });\r\n const bordered = this.composeImageWithBorder(img, size, borderColor, borderWidth);\r\n if (bordered) {\r\n billboardImage = bordered;\r\n }\r\n } catch (error) {\r\n console.error(`[LayerManager] Failed to preload image ${item.imgUrl}`, error);\r\n return;\r\n }\r\n }\r\n\r\n dataSource!.entities.add({\r\n id: item.id || `${baseId}-${index}`,\r\n name: item.name || `图片标记-${index + 1}`,\r\n position: C.Cartesian3.fromDegrees(item.lon, item.lat, item.height ?? 0),\r\n billboard: {\r\n image: billboardImage,\r\n width: size,\r\n height: size,\r\n sizeInMeters: false,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n horizontalOrigin: C.HorizontalOrigin.CENTER,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: new C.PropertyBag({\r\n type: 'photo-marker',\r\n imgUrl: item.imgUrl,\r\n }),\r\n });\r\n\r\n added += 1;\r\n }),\r\n );\r\n\r\n if (!added) {\r\n this.viewer.dataSources.remove(dataSource, true);\r\n return undefined;\r\n }\r\n\r\n const id = `ds_${++layerIdSeq}`;\r\n this.dataSourceIdMap.set(id, dataSource!);\r\n const handle: LayerHandle = { id, type: 'datasource', dispose: () => this.remove(id) };\r\n this.events.emit({ added: handle } as any);\r\n\r\n return {\r\n handle,\r\n dataSource: dataSource!,\r\n layerName,\r\n added,\r\n total: items.length,\r\n };\r\n } catch (error) {\r\n if (dataSource) {\r\n this.viewer.dataSources.remove(dataSource, true);\r\n }\r\n this.events.emit({ error: { error } } as any);\r\n return undefined;\r\n }\r\n }\r\n\r\n setVisible(id: string, visible: boolean): void {\r\n const img = this.imageryIdMap.get(id);\r\n if (img) {\r\n img.show = visible;\r\n return;\r\n }\r\n const ts = this.tilesetIdMap.get(id);\r\n if (ts) {\r\n ts.show = visible;\r\n return;\r\n }\r\n const ds = this.dataSourceIdMap.get(id);\r\n if (ds) ds.show = visible;\r\n }\r\n\r\n setOpacity(id: string, opacity: number): void {\r\n const img = this.imageryIdMap.get(id);\r\n if (img) img.alpha = opacity;\r\n }\r\n\r\n remove(id: string): void {\r\n if (this.imageryIdMap.has(id)) {\r\n const layer = this.imageryIdMap.get(id)!;\r\n this.viewer.imageryLayers.remove(layer, true);\r\n this.imageryIdMap.delete(id);\r\n this.events.emit({ removed: { id, type: 'imagery', dispose: () => {} } } as any);\r\n return;\r\n }\r\n if (this.tilesetIdMap.has(id)) {\r\n const ts = this.tilesetIdMap.get(id)!;\r\n this.viewer.scene.primitives.remove(ts);\r\n this.tilesetIdMap.delete(id);\r\n this.events.emit({ removed: { id, type: 'tileset', dispose: () => {} } } as any);\r\n return;\r\n }\r\n if (this.dataSourceIdMap.has(id)) {\r\n const ds = this.dataSourceIdMap.get(id)!;\r\n this.viewer.dataSources.remove(ds, true);\r\n this.dataSourceIdMap.delete(id);\r\n this.events.emit({ removed: { id, type: 'datasource', dispose: () => {} } } as any);\r\n return;\r\n }\r\n if (this.terrainId === id) {\r\n // reset to ellipsoid\r\n this.viewer.terrainProvider = new (this.CesiumNS as any).EllipsoidTerrainProvider();\r\n this.events.emit({ removed: { id, type: 'terrain', dispose: () => {} } } as any);\r\n this.terrainId = undefined;\r\n }\r\n }\r\n\r\n private composeImageWithBorder(\r\n source: CanvasImageSource,\r\n size: number,\r\n borderColor: string,\r\n borderWidth: number,\r\n ): string | undefined {\r\n if (typeof document === 'undefined') return undefined;\r\n const canvas = document.createElement('canvas');\r\n canvas.width = size;\r\n canvas.height = size;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return undefined;\r\n\r\n ctx.clearRect(0, 0, size, size);\r\n const innerSize = Math.max(size - borderWidth * 2, 1);\r\n ctx.drawImage(source, borderWidth, borderWidth, innerSize, innerSize);\r\n ctx.strokeStyle = borderColor;\r\n ctx.lineWidth = borderWidth;\r\n const inset = borderWidth / 2;\r\n ctx.strokeRect(inset, inset, size - borderWidth, size - borderWidth);\r\n return canvas.toDataURL('image/png');\r\n }\r\n\r\n private createImageryProvider(options: ImageryOptions): Cesium.ImageryProvider | undefined {\r\n const C = this.CesiumNS as any;\r\n const zr = (options as any).zoomRange as { min?: number; max?: number } | undefined;\r\n const minLevel = typeof zr?.min === 'number' ? zr!.min : undefined;\r\n const maxLevel = typeof zr?.max === 'number' ? zr!.max : undefined;\r\n\r\n let bounds: [number, number, number, number] = (options as any).rectangle as any;\r\n console.log('[demo] bounds!!', bounds);\r\n // Heuristic reorder to [W,S,E,N] if second value looks like longitude and third like latitude\r\n if (Math.abs(bounds[1]) > 90 && Math.abs(bounds[2]) <= 90) {\r\n bounds = [bounds[0], bounds[2], bounds[1], bounds[3]];\r\n console.warn('[demo] Reordered bounds to [W,S,E,N]:', bounds);\r\n }\r\n\r\n const rectDeg = bounds; \r\n const rectangle = rectDeg\r\n ? C.Rectangle.fromDegrees(rectDeg[0], rectDeg[1], rectDeg[2], rectDeg[3])\r\n : undefined;\r\n switch (options.provider) {\r\n case 'urlTemplate':\r\n return new C.UrlTemplateImageryProvider({\r\n url: options.url,\r\n // Apply zoom constraints if provided\r\n minimumLevel: minLevel,\r\n maximumLevel: maxLevel,\r\n rectangle,\r\n });\r\n case 'wmts':\r\n return new C.WebMapTileServiceImageryProvider({\r\n url: options.url,\r\n layer: (options as any).layer,\r\n style: (options as any).style ?? 'default',\r\n tileMatrixSetID: (options as any).tileMatrixSetID,\r\n format: (options as any).format ?? 'image/png',\r\n });\r\n case 'wms':\r\n return new C.WebMapServiceImageryProvider({\r\n url: options.url,\r\n layers: (options as any).layers,\r\n parameters: (options as any).parameters,\r\n });\r\n case 'arcgis':\r\n return new C.ArcGisMapServerImageryProvider({ url: options.url });\r\n default:\r\n return undefined;\r\n }\r\n }\r\n\r\n private async createTerrain(\r\n options: TerrainOptions,\r\n ): Promise<Cesium.TerrainProvider | undefined> {\r\n const C = this.CesiumNS as any;\r\n switch (options.type) {\r\n case 'ellipsoid':\r\n return new C.EllipsoidTerrainProvider();\r\n case 'cesium-ion': {\r\n const assetId = (options.ionAssetId ?? (options as any).assetId ?? 1) as number;\r\n // Prefer the modern factory if available\r\n // if (C.CesiumTerrainProvider?.fromIonAssetId) {\r\n // return await C.CesiumTerrainProvider.fromIonAssetId(assetId, {\r\n // requestVertexNormals: true,\r\n // requestWaterMask: true,\r\n // });\r\n // }\r\n // Fallback: build an Ion resource and pass to fromUrl\r\n const IonResource = C.IonResource ?? C.Resource;\r\n if (IonResource?.fromAssetId) {\r\n const resource = await IonResource.fromAssetId(assetId);\r\n return await C.CesiumTerrainProvider.fromUrl(resource, {\r\n requestVertexNormals: true,\r\n requestWaterMask: true,\r\n });\r\n }\r\n // As an ultimate fallback, try world terrain helper if present\r\n if (C.createWorldTerrain) {\r\n return C.createWorldTerrain({\r\n requestVertexNormals: true,\r\n requestWaterMask: true,\r\n });\r\n }\r\n return undefined;\r\n }\r\n case 'url':\r\n // Use the recommended async factory\r\n return await C.CesiumTerrainProvider.fromUrl(options.url, {\r\n requestVertexNormals: true,\r\n requestWaterMask: true,\r\n });\r\n default:\r\n return undefined;\r\n }\r\n }\r\n\r\n // Helper getters to retrieve underlying Cesium primitives by id\r\n getImageryLayer(id: string): Cesium.ImageryLayer | undefined {\r\n return this.imageryIdMap.get(id);\r\n }\r\n\r\n getTileset(id: string): Cesium.Cesium3DTileset | undefined {\r\n return this.tilesetIdMap.get(id);\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\nexport type Toggle2D3DOptions = {\r\n orthographicWidth?: number; // reserved for potential future use; ignored for now in 2D mode\r\n pitch3D?: number;\r\n heading3D?: number;\r\n roll3D?: number;\r\n height3D?: number; // default camera height when switching to 3D\r\n duration?: number; // morph animation duration in seconds\r\n};\r\n\r\nexport type Orientation = { heading: number; pitch: number; roll: number };\r\n\r\nexport interface Toggle2D3DContext {\r\n CesiumNS: typeof Cesium;\r\n viewer: Cesium.Viewer;\r\n getLastPerspectiveOrientation: () => Orientation | undefined;\r\n setLastPerspectiveOrientation: (o: Orientation | undefined) => void;\r\n}\r\n\r\n/**\r\n * Toggle between 3D and 2D scene modes with orientation preservation on return to 3D.\r\n * This utility is framework-agnostic and only depends on Cesium viewer and a tiny state bridge.\r\n */\r\nexport function toggle2D3D(ctx: Toggle2D3DContext, options?: Toggle2D3DOptions): void {\r\n const C: any = ctx.CesiumNS as any;\r\n const scene: any = (ctx.viewer as any).scene;\r\n const cam = (ctx.viewer as any).camera;\r\n const duration = options?.duration ?? 0;\r\n\r\n // Reset any transforms to avoid unexpected lookAt matrices affecting orientation\r\n (ctx.viewer as any).trackedEntity = undefined as any;\r\n (ctx.viewer as any).camera.lookAtTransform(ctx.CesiumNS.Matrix4.IDENTITY);\r\n\r\n const mode = scene.mode;\r\n const is3D = mode === C.SceneMode.SCENE3D;\r\n // console.log('[toggle2D3D] start, is3D =', is3D, 'duration =', duration);\r\n\r\n // Helper: capture the lon/lat under the canvas center to avoid hemisphere flips across modes\r\n const captureCenterLonLat = (): { lon: number; lat: number } | undefined => {\r\n try {\r\n const canvas: HTMLCanvasElement = scene.canvas;\r\n const cx = (canvas as any).clientWidth ? canvas.clientWidth / 2 : canvas.width / 2;\r\n const cy = (canvas as any).clientHeight ? canvas.clientHeight / 2 : canvas.height / 2;\r\n const win = new C.Cartesian2(cx, cy);\r\n const ellipsoid = scene.globe?.ellipsoid ?? C.Ellipsoid.WGS84;\r\n // Prefer precise ground point under the window center\r\n const p = cam.pickEllipsoid?.(win, ellipsoid) ?? (() => {\r\n const ray = cam.getPickRay?.(win);\r\n return ray ? scene.globe?.pick?.(ray, scene) : undefined;\r\n })();\r\n if (p) {\r\n const carto = C.Cartographic.fromCartesian(p);\r\n const res = {\r\n lon: C.Math.toDegrees(carto.longitude),\r\n lat: C.Math.toDegrees(carto.latitude),\r\n };\r\n // NOTE: don't spam too much here; print once per call\r\n // console.log('[toggle2D3D] captureCenterLonLat via pick:', res);\r\n return res;\r\n }\r\n\r\n // Fallback: in 2D, use camera.positionCartographic instead of fromCartesian(cam.position)\r\n const pc = cam.positionCartographic;\r\n if (pc) {\r\n const res = {\r\n lon: C.Math.toDegrees(pc.longitude),\r\n lat: C.Math.toDegrees(pc.latitude),\r\n };\r\n // console.log('[toggle2D3D] captureCenterLonLat via camera.positionCartographic:', res);\r\n return res;\r\n }\r\n return undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n };\r\n\r\n // Capture current camera view (center lon/lat and current height/orientation) before morph\r\n let capturedCenterLonLat: { lon: number; lat: number } | undefined;\r\n let capturedLonLatHeight: { lon: number; lat: number; height: number } | undefined;\r\n let capturedOrientation: Orientation | undefined;\r\n try {\r\n capturedCenterLonLat = captureCenterLonLat();\r\n // Use positionCartographic when available (correct in 2D), fallback to fromCartesian only in 3D context\r\n const pc = cam.positionCartographic ?? ctx.CesiumNS.Cartographic.fromCartesian(cam.position);\r\n capturedLonLatHeight = {\r\n lon: ctx.CesiumNS.Math.toDegrees(pc.longitude),\r\n lat: ctx.CesiumNS.Math.toDegrees(pc.latitude),\r\n height: pc.height,\r\n };\r\n capturedOrientation = {\r\n heading: cam.heading ?? 0,\r\n pitch: cam.pitch ?? -0.8,\r\n roll: cam.roll ?? 0,\r\n };\r\n // console.log('[toggle2D3D] capturedCenterLonLat =', capturedCenterLonLat);\r\n // console.log('[toggle2D3D] capturedLonLatHeight =', capturedLonLatHeight);\r\n // console.log('[toggle2D3D] capturedOrientation =', capturedOrientation);\r\n } catch {\r\n // ignore capture failure; will fall back to existing behavior\r\n }\r\n\r\n if (is3D) {\r\n // Save current 3D orientation for later restoration\r\n ctx.setLastPerspectiveOrientation({\r\n heading: cam.heading ?? 0,\r\n pitch: cam.pitch ?? -0.8,\r\n roll: cam.roll ?? 0,\r\n });\r\n // Switch to 2D map mode\r\n const onComplete = () => {\r\n // console.log('[toggle2D3D] morphTo2D complete');\r\n try {\r\n // Prefer restoring to the center lon/lat we were looking at, to avoid E/W flips\r\n const center = capturedCenterLonLat ?? (capturedLonLatHeight && { lon: capturedLonLatHeight.lon, lat: capturedLonLatHeight.lat });\r\n if (center) {\r\n const dest = ctx.CesiumNS.Cartesian3.fromDegrees(\r\n center.lon,\r\n center.lat,\r\n Math.max(1, capturedLonLatHeight?.height ?? 1000),\r\n );\r\n (ctx.viewer as any).camera.setView({\r\n destination: dest,\r\n orientation: capturedOrientation,\r\n } as any);\r\n const cur = captureCenterLonLat();\r\n if (cur) {\r\n // console.log('[toggle2D3D] after 3D->2D setView center =', cur, 'expect =', center, 'delta(deg)=', { dLon: (cur.lon - center.lon).toFixed(6), dLat: (cur.lat - center.lat).toFixed(6) });\r\n }\r\n }\r\n } catch {\r\n /* ignore */\r\n } finally {\r\n scene.morphComplete?.removeEventListener?.(onComplete);\r\n }\r\n };\r\n scene.morphComplete?.addEventListener?.(onComplete);\r\n scene.morphTo2D(duration);\r\n } else {\r\n // Switch to 3D and restore the last saved orientation if available\r\n const saved = ctx.getLastPerspectiveOrientation();\r\n const defaultHeight3D = options?.height3D ?? 1500;\r\n // Prefer explicit options for heading/pitch/roll; otherwise use sensible defaults.\r\n const restoreOrientation: Orientation = {\r\n heading: options?.heading3D ?? (saved?.heading ?? 0),\r\n // Force a stable 3D pitch default even if saved is odd or unavailable\r\n pitch: options?.pitch3D ?? -0.8,\r\n roll: options?.roll3D ?? (saved?.roll ?? 0),\r\n };\r\n\r\n const onComplete = () => {\r\n // console.log('[toggle2D3D] morphTo3D complete');\r\n try {\r\n const center = capturedCenterLonLat ?? (capturedLonLatHeight && { lon: capturedLonLatHeight.lon, lat: capturedLonLatHeight.lat });\r\n if (center) {\r\n // 使用两步法确保目标点绝对居中:\r\n // 1) 先用俯视(top-down)姿态锁定在目标点正上方\r\n const target = ctx.CesiumNS.Cartesian3.fromDegrees(center.lon, center.lat);\r\n const safeRange0 = capturedLonLatHeight?.height ?? defaultHeight3D;\r\n const range0 = ctx.CesiumNS.Math.clamp(safeRange0, 50, 5_000_000);\r\n // console.log('[toggle2D3D] restoreOrientation =', restoreOrientation, 'range0 =', range0, 'center =', center);\r\n\r\n const camAny: any = (ctx.viewer as any).camera;\r\n camAny.lookAt(\r\n target,\r\n new (ctx.CesiumNS as any).HeadingPitchRange(\r\n 0,\r\n -Math.PI / 2, // 直视向下,确保目标点成为中心\r\n range0,\r\n ),\r\n );\r\n\r\n // 2) 在保持同一 target 的前提下,应用期望的 heading/pitch/roll\r\n camAny.lookAt(\r\n target,\r\n new (ctx.CesiumNS as any).HeadingPitchRange(\r\n restoreOrientation.heading,\r\n restoreOrientation.pitch,\r\n range0,\r\n ),\r\n );\r\n\r\n // 3) 解除 ENU 变换以免锁定相机,但保持当前视图(将局部坐标转换到世界坐标后再解除)\r\n const t = ctx.CesiumNS.Matrix4.clone(camAny.transform);\r\n const worldPos = ctx.CesiumNS.Matrix4.multiplyByPoint(\r\n t,\r\n camAny.position,\r\n new ctx.CesiumNS.Cartesian3(),\r\n );\r\n const worldDir = ctx.CesiumNS.Matrix4.multiplyByPointAsVector(\r\n t,\r\n camAny.direction,\r\n new ctx.CesiumNS.Cartesian3(),\r\n );\r\n const worldUp = ctx.CesiumNS.Matrix4.multiplyByPointAsVector(\r\n t,\r\n camAny.up,\r\n new ctx.CesiumNS.Cartesian3(),\r\n );\r\n // 归一化方向与上向量\r\n ctx.CesiumNS.Cartesian3.normalize(worldDir, worldDir);\r\n ctx.CesiumNS.Cartesian3.normalize(worldUp, worldUp);\r\n camAny.lookAtTransform(ctx.CesiumNS.Matrix4.IDENTITY);\r\n camAny.setView({ destination: worldPos, orientation: { direction: worldDir, up: worldUp } as any } as any);\r\n\r\n const cur = captureCenterLonLat();\r\n if (cur) {\r\n // console.log('[toggle2D3D] after 2D->3D lookAt center =', cur, 'expect =', center, 'delta(deg)=', { dLon: (cur.lon - center.lon).toFixed(6), dLat: (cur.lat - center.lat).toFixed(6) });\r\n } else {\r\n // console.log('[toggle2D3D] after 2D->3D lookAt center pick failed');\r\n }\r\n // const pcNow = cam.positionCartographic ?? ctx.CesiumNS.Cartographic.fromCartesian(cam.position);\r\n // console.log('[toggle2D3D] camera now carto =', {\r\n // lon: ctx.CesiumNS.Math.toDegrees(pcNow.longitude),\r\n // lat: ctx.CesiumNS.Math.toDegrees(pcNow.latitude),\r\n // height: pcNow.height,\r\n // heading: cam.heading,\r\n // pitch: cam.pitch,\r\n // roll: cam.roll,\r\n // });\r\n } else {\r\n (ctx.viewer as any).camera.setView({ orientation: restoreOrientation } as any);\r\n }\r\n } catch {\r\n /* ignore */\r\n } finally {\r\n scene.morphComplete?.removeEventListener?.(onComplete);\r\n }\r\n };\r\n scene.morphComplete?.addEventListener?.(onComplete);\r\n scene.morphTo3D(duration);\r\n }\r\n\r\n scene.requestRender?.();\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { toggle2D3D as toggle2D3DHelper } from './toggle2D3D';\r\nimport type { Toggle2D3DOptions } from './toggle2D3D';\r\nimport type {\r\n CameraView,\r\n CameraDestinationInput as LonLatInput,\r\n CameraOrientation as OrientationInput,\r\n CameraFlyOptions as EasyArgs,\r\n} from '../types/public';\r\n\r\nexport interface FlyToOptions {\r\n duration?: number;\r\n}\r\n\r\nexport interface PathOptions {\r\n speed?: number; // meters per second equivalent for duration calc\r\n loop?: boolean;\r\n}\r\n\r\nexport class CameraManager {\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Cesium.Viewer,\r\n ) { }\r\n\r\n // Remember last perspective orientation so we can restore it when toggling back\r\n private _lastPerspectiveOrientation?: { heading: number; pitch: number; roll: number };\r\n\r\n // Remember state for birds-eye view toggle\r\n private _isBirdsEyeView: boolean = false;\r\n private _beforeBirdsEye?: {\r\n position: any;\r\n orientation: { heading: number; pitch: number; roll: number };\r\n frustumType: 'perspective' | 'orthographic';\r\n orthographicWidth?: number;\r\n };\r\n\r\n private parseLonLat(input: LonLatInput): { lon?: number; lat?: number; height?: number } {\r\n if (Array.isArray(input)) {\r\n const [lon, lat, h] = [input[0], input[1], (input as [number, number, number])[2]];\r\n return { lon, lat, height: h };\r\n }\r\n if ('lon' in input && 'lat' in input)\r\n return { lon: input.lon, lat: input.lat, height: input.height };\r\n if ('lng' in input && 'lat' in input)\r\n return { lon: (input as any).lng, lat: input.lat, height: input.height };\r\n if ('longitude' in input && 'latitude' in input)\r\n return { lon: (input as any).longitude, lat: (input as any).latitude, height: input.height };\r\n return {};\r\n }\r\n\r\n initCamera(\r\n destination: LonLatInput | EasyArgs,\r\n height?: number,\r\n orientation?: OrientationInput,\r\n ): void {\r\n let lon: number | undefined;\r\n let lat: number | undefined;\r\n let h: number | undefined;\r\n let ori: OrientationInput | undefined = orientation;\r\n if ((destination as EasyArgs).destination) {\r\n const args = destination as EasyArgs;\r\n const parsed = this.parseLonLat(args.destination);\r\n lon = parsed.lon;\r\n lat = parsed.lat;\r\n h = parsed.height ?? args.height;\r\n ori = args.orientation ?? orientation;\r\n } else {\r\n const parsed = this.parseLonLat(destination as LonLatInput);\r\n lon = parsed.lon;\r\n lat = parsed.lat;\r\n h = parsed.height ?? height;\r\n }\r\n if (lon == null || lat == null) return;\r\n const finalHeight = h ?? 1500;\r\n const dest = this.CesiumNS.Cartesian3.fromDegrees(lon, lat, finalHeight);\r\n this.viewer.trackedEntity = undefined as any;\r\n this.viewer.camera.lookAtTransform(this.CesiumNS.Matrix4.IDENTITY);\r\n this.setView({ destination: dest, heading: ori?.heading, pitch: ori?.pitch, roll: ori?.roll });\r\n (this.viewer.scene as any).requestRender?.();\r\n }\r\n\r\n setPerspective(): void {\r\n const C = this.CesiumNS as any;\r\n const canvas: HTMLCanvasElement | undefined = (this.viewer.scene as any)?.canvas;\r\n const aspect =\r\n canvas && canvas.clientHeight > 0 ? canvas.clientWidth / canvas.clientHeight : 1.0;\r\n const pf = new C.PerspectiveFrustum();\r\n pf.fov = C.Math.toRadians(60); // a reasonable default vertical FOV\r\n pf.aspectRatio = aspect;\r\n pf.near = 0.1;\r\n pf.far = 1.0e8;\r\n this.viewer.scene.camera.frustum = pf;\r\n }\r\n\r\n setOrthographic(width = 1000000): void {\r\n const C = this.CesiumNS as any;\r\n const canvas: HTMLCanvasElement | undefined = (this.viewer.scene as any)?.canvas;\r\n const aspect =\r\n canvas && canvas.clientHeight > 0 ? canvas.clientWidth / canvas.clientHeight : 1.0;\r\n const frustum = new C.OrthographicFrustum();\r\n frustum.width = width; // horizontal width in meters at the near plane\r\n frustum.aspectRatio = aspect;\r\n frustum.near = 0.1;\r\n frustum.far = 1.0e8;\r\n this.viewer.scene.camera.frustum = frustum;\r\n }\r\n\r\n /**\r\n * Toggle between 2D and 3D scene modes while preserving and restoring a 3D orientation.\r\n */\r\n toggle2D3D(options?: Toggle2D3DOptions): void {\r\n toggle2D3DHelper(\r\n {\r\n CesiumNS: this.CesiumNS,\r\n viewer: this.viewer,\r\n getLastPerspectiveOrientation: () => this._lastPerspectiveOrientation,\r\n setLastPerspectiveOrientation: (o) => {\r\n this._lastPerspectiveOrientation = o;\r\n },\r\n },\r\n options,\r\n );\r\n }\r\n\r\n /**\r\n * @deprecated Use toggle2D3D instead.\r\n */\r\n toggleBirdsEye3D(options?: Toggle2D3DOptions): void {\r\n this.toggle2D3D(options);\r\n }\r\n\r\n /**\r\n * 切换鸟瞰视角(垂直俯视)\r\n * 在当前3D场景中切换到垂直向下的俯视角度,并可选择使用正交投影\r\n *\r\n * @param options 配置选项\r\n * @param options.useOrthographic 是否使用正交投影(默认false,使用透视投影)\r\n * @param options.height 鸟瞰高度(米,默认自动计算)\r\n * @param options.orthographicWidth 正交视图宽度(米,默认1000000)\r\n * @param options.duration 飞行动画时长(秒,默认1.0)\r\n *\r\n * @example\r\n * ```typescript\r\n * // 切换到鸟瞰视角(透视投影)\r\n * cameraManager.toggleBirdsEyeView();\r\n *\r\n * // 切换到鸟瞰视角(正交投影)\r\n * cameraManager.toggleBirdsEyeView({ useOrthographic: true });\r\n *\r\n * // 自定义高度和宽度\r\n * cameraManager.toggleBirdsEyeView({\r\n * useOrthographic: true,\r\n * height: 50000,\r\n * orthographicWidth: 500000\r\n * });\r\n * ```\r\n */\r\n toggleBirdsEyeView(options?: {\r\n useOrthographic?: boolean;\r\n height?: number;\r\n orthographicWidth?: number;\r\n duration?: number;\r\n }): void {\r\n const duration = options?.duration ?? 1.0;\r\n\r\n if (this._isBirdsEyeView) {\r\n // 恢复到之前的视角\r\n this.restoreFromBirdsEye(duration);\r\n } else {\r\n // 切换到鸟瞰视角\r\n this.enterBirdsEyeView(options);\r\n }\r\n }\r\n\r\n /**\r\n * 进入鸟瞰视角\r\n */\r\n private enterBirdsEyeView(options?: {\r\n useOrthographic?: boolean;\r\n height?: number;\r\n orthographicWidth?: number;\r\n duration?: number;\r\n }): void {\r\n const C = this.CesiumNS as any;\r\n const camera = this.viewer.camera;\r\n const duration = options?.duration ?? 1.0;\r\n\r\n // 保存当前状态\r\n try {\r\n const currentPosition = camera.position.clone();\r\n const currentFrustum = camera.frustum;\r\n const isOrthographic = currentFrustum instanceof C.OrthographicFrustum;\r\n\r\n this._beforeBirdsEye = {\r\n position: currentPosition,\r\n orientation: {\r\n heading: camera.heading ?? 0,\r\n pitch: camera.pitch ?? -0.8,\r\n roll: camera.roll ?? 0,\r\n },\r\n frustumType: isOrthographic ? 'orthographic' : 'perspective',\r\n orthographicWidth: isOrthographic ? (currentFrustum as any).width : undefined,\r\n };\r\n } catch (error) {\r\n console.error('[CameraManager] Failed to save camera state:', error);\r\n }\r\n\r\n // 获取当前位置\r\n let currentLonLatHeight: { lon: number; lat: number; height: number };\r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(camera.position);\r\n currentLonLatHeight = {\r\n lon: C.Math.toDegrees(cartographic.longitude),\r\n lat: C.Math.toDegrees(cartographic.latitude),\r\n height: cartographic.height,\r\n };\r\n } catch {\r\n // 如果获取失败,使用默认值\r\n currentLonLatHeight = { lon: 0, lat: 0, height: 10000 };\r\n }\r\n\r\n // 计算鸟瞰高度\r\n const birdsEyeHeight = options?.height ?? Math.max(currentLonLatHeight.height, 5000);\r\n\r\n // 设置鸟瞰视角(垂直向下)\r\n const destination = C.Cartesian3.fromDegrees(\r\n currentLonLatHeight.lon,\r\n currentLonLatHeight.lat,\r\n birdsEyeHeight,\r\n );\r\n\r\n // 飞到鸟瞰位置\r\n camera.flyTo({\r\n destination,\r\n orientation: {\r\n heading: 0,\r\n pitch: C.Math.toRadians(-90), // 垂直向下\r\n roll: 0,\r\n },\r\n duration,\r\n complete: () => {\r\n // 如果需要,切换到正交投影\r\n if (options?.useOrthographic) {\r\n this.setOrthographic(options.orthographicWidth ?? 1000000);\r\n }\r\n this._isBirdsEyeView = true;\r\n },\r\n });\r\n }\r\n\r\n // Fly to a specified lon, lat, height (in meters). In 3D mode, ensure the given lon, lat is at the center of the view.\r\n flyToSimple(lon: number, lat: number, height?: number): void {\r\n height = height ?? 500;\r\n\r\n const is3D = this.viewer?.scene?.mode === this.CesiumNS.SceneMode.SCENE3D;\r\n if (is3D) {\r\n // 在 3D 下确保以指定经纬度为视角中心:使用 BoundingSphere + HeadingPitchRange\r\n const target = this.CesiumNS.Cartesian3.fromDegrees(lon, lat, 0);\r\n const desiredHeight = height; // 期望近似高度\r\n const pitch = this.CesiumNS.Math.toRadians(-45);\r\n const sinPitch = Math.sin(Math.abs(pitch)) || 1; // 避免除以 0\r\n const range = desiredHeight / sinPitch; // 使相机高度约等于 desiredHeight\r\n const heading = 0; // 北向\r\n this.viewer.camera.flyToBoundingSphere(new this.CesiumNS.BoundingSphere(target, 1.0), {\r\n offset: new this.CesiumNS.HeadingPitchRange(heading, pitch, range),\r\n duration: 2.0,\r\n });\r\n } else {\r\n // 2D 保持垂直俯视\r\n this.flyToEasy({\r\n destination: [lon, lat],\r\n height: height,\r\n orientation: { pitch: this.CesiumNS.Math.toRadians(-90) },\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 从鸟瞰视角恢复\r\n */\r\n private restoreFromBirdsEye(duration: number = 1.0): void {\r\n if (!this._beforeBirdsEye) {\r\n this._isBirdsEyeView = false;\r\n return;\r\n }\r\n\r\n const C = this.CesiumNS as any;\r\n const camera = this.viewer.camera;\r\n const saved = this._beforeBirdsEye;\r\n\r\n // 先恢复投影类型(如果需要)\r\n if (saved.frustumType === 'perspective') {\r\n const currentFrustum = camera.frustum;\r\n if (currentFrustum instanceof C.OrthographicFrustum) {\r\n this.setPerspective();\r\n }\r\n } else if (saved.frustumType === 'orthographic' && saved.orthographicWidth) {\r\n const currentFrustum = camera.frustum;\r\n if (!(currentFrustum instanceof C.OrthographicFrustum)) {\r\n this.setOrthographic(saved.orthographicWidth);\r\n }\r\n }\r\n\r\n // 飞回之前的位置和方向\r\n camera.flyTo({\r\n destination: saved.position,\r\n orientation: saved.orientation,\r\n duration,\r\n complete: () => {\r\n this._isBirdsEyeView = false;\r\n this._beforeBirdsEye = undefined;\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * 设置为鸟瞰视角(不切换,直接设置)\r\n *\r\n * @param options 配置选项\r\n * @param options.useOrthographic 是否使用正交投影\r\n * @param options.height 鸟瞰高度\r\n * @param options.orthographicWidth 正交视图宽度\r\n */\r\n setBirdsEyeView(options?: {\r\n useOrthographic?: boolean;\r\n height?: number;\r\n orthographicWidth?: number;\r\n }): void {\r\n const C = this.CesiumNS as any;\r\n const camera = this.viewer.camera;\r\n\r\n // 获取当前位置\r\n let currentLonLatHeight: { lon: number; lat: number; height: number };\r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(camera.position);\r\n currentLonLatHeight = {\r\n lon: C.Math.toDegrees(cartographic.longitude),\r\n lat: C.Math.toDegrees(cartographic.latitude),\r\n height: cartographic.height,\r\n };\r\n } catch {\r\n currentLonLatHeight = { lon: 0, lat: 0, height: 10000 };\r\n }\r\n\r\n const birdsEyeHeight = options?.height ?? Math.max(currentLonLatHeight.height, 5000);\r\n const destination = C.Cartesian3.fromDegrees(\r\n currentLonLatHeight.lon,\r\n currentLonLatHeight.lat,\r\n birdsEyeHeight,\r\n );\r\n\r\n // 设置鸟瞰视角\r\n camera.setView({\r\n destination,\r\n orientation: {\r\n heading: 0,\r\n pitch: C.Math.toRadians(-90),\r\n roll: 0,\r\n },\r\n });\r\n\r\n // 如果需要,切换到正交投影\r\n if (options?.useOrthographic) {\r\n this.setOrthographic(options.orthographicWidth ?? 1000000);\r\n }\r\n\r\n this._isBirdsEyeView = true;\r\n }\r\n\r\n /**\r\n * 检查当前是否处于鸟瞰视角\r\n */\r\n isBirdsEyeView(): boolean {\r\n return this._isBirdsEyeView;\r\n }\r\n\r\n setView(view: CameraView): void {\r\n const { destination, heading = 0, pitch = -Math.PI / 4, roll = 0 } = view;\r\n this.viewer.camera.setView({ destination, orientation: { heading, pitch, roll } });\r\n }\r\n\r\n // Debug helper: move camera to Chengdu, Sichuan\r\n moveToChengdu(): void {\r\n const lon = 104.0665;\r\n const lat = 30.5728;\r\n const height = 2000;\r\n const dest = this.CesiumNS.Cartesian3.fromDegrees(lon, lat, height);\r\n this.viewer.trackedEntity = undefined as any;\r\n this.viewer.camera.lookAtTransform(this.CesiumNS.Matrix4.IDENTITY);\r\n this.viewer.camera.setView({\r\n destination: dest,\r\n orientation: { heading: 0, pitch: -0.8, roll: 0 },\r\n });\r\n }\r\n\r\n isitwork(): void {\r\n console.log('isitwork!!!!!!!!', this.viewer);\r\n console.log('isitwork cesium!!!!!!!!', this.CesiumNS);\r\n this.viewer.camera.setView({\r\n destination: this.CesiumNS.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0),\r\n });\r\n }\r\n\r\n setViewEasy(args: { destination: LonLatInput; orientation?: OrientationInput }): void {\r\n const parsed = this.parseLonLat(args.destination);\r\n const lon = parsed.lon;\r\n const lat = parsed.lat;\r\n const h = parsed.height ?? 1500;\r\n if (lon == null || lat == null) return;\r\n const dest = this.CesiumNS.Cartesian3.fromDegrees(lon, lat, h);\r\n this.setView({\r\n destination: dest,\r\n heading: args.orientation?.heading,\r\n pitch: args.orientation?.pitch,\r\n roll: args.orientation?.roll,\r\n });\r\n }\r\n\r\n async flyToTerrain(\r\n bounds: [number, number, number, number],\r\n tp: Cesium.CesiumTerrainProvider,\r\n ): Promise<void> {\r\n const centerLon = (bounds[0] + bounds[2]) / 2;\r\n const centerLat = (bounds[1] + bounds[3]) / 2;\r\n\r\n const sampleCartographic = this.CesiumNS.Cartographic.fromDegrees(centerLon, centerLat);\r\n let cameraHeight = 1500; // 默认\r\n\r\n try {\r\n const availability = (tp as any).availability ?? (tp as any)._availability;\r\n if (availability) {\r\n // 优先使用最高精度采样(需 availability)\r\n const samples = await this.CesiumNS.sampleTerrainMostDetailed(tp as any, [\r\n sampleCartographic,\r\n ]);\r\n const terrainHeight = samples?.[0]?.height ?? 0;\r\n cameraHeight = Math.max(terrainHeight + Math.abs(terrainHeight) * 0.2, 300);\r\n // eslint-disable-next-line no-console\r\n console.log('[demo][DSM] ✓ 获取地形高度', terrainHeight, ',相机高度', cameraHeight);\r\n } else {\r\n // 回退:尝试在一个合理层级采样;若失败则继续使用默认高度\r\n const fallbackLevel = 12;\r\n try {\r\n const samples = await this.CesiumNS.sampleTerrain(tp as any, fallbackLevel, [\r\n sampleCartographic,\r\n ]);\r\n const terrainHeight = samples?.[0]?.height;\r\n if (typeof terrainHeight === 'number') {\r\n cameraHeight = Math.max(terrainHeight + Math.abs(terrainHeight) * 0.2, 300);\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n '[demo][DSM] ⚠️ 地形缺少 availability,使用 fallbackLevel=',\r\n fallbackLevel,\r\n ' 估算高度=',\r\n terrainHeight,\r\n );\r\n } else {\r\n // eslint-disable-next-line no-console\r\n console.warn('[demo][DSM] ⚠️ 估算高度失败,使用默认相机高度', cameraHeight);\r\n }\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.warn('[demo][DSM] ⚠️ sampleTerrain 回退失败,将使用默认相机高度', e);\r\n }\r\n }\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.warn('[demo][DSM] ⚠️ 采样地形高度失败,将使用默认相机高度', e);\r\n }\r\n\r\n this.viewer.camera.flyTo({\r\n destination: this.CesiumNS.Cartesian3.fromDegrees(centerLon, centerLat, cameraHeight),\r\n orientation: {\r\n pitch: this.CesiumNS.Math.toRadians(-90.0),\r\n heading: 0.0,\r\n roll: 0.0,\r\n },\r\n duration: 1.8,\r\n complete: () => {\r\n // 限制相机高度,避免飞出范围太远\r\n this.viewer.camera.constrainedAxis = this.CesiumNS.Cartesian3.UNIT_Z;\r\n this.viewer.scene.screenSpaceCameraController.minimumZoomDistance = 10;\r\n this.viewer.scene.screenSpaceCameraController.maximumZoomDistance = cameraHeight * 5;\r\n // eslint-disable-next-line no-console\r\n console.log('[demo][DSM] ✓ 已飞入地形范围,并限制相机高度');\r\n },\r\n });\r\n }\r\n\r\n flyToEasy(\r\n destination: LonLatInput | EasyArgs,\r\n heightOrOrientation?: number | OrientationInput,\r\n orientationOrDuration?: OrientationInput | number,\r\n duration?: number,\r\n ): void {\r\n let lon: number | undefined;\r\n let lat: number | undefined;\r\n let h: number | undefined;\r\n let orientation: OrientationInput | undefined;\r\n let finalDuration: number | undefined;\r\n\r\n if ((destination as EasyArgs).destination) {\r\n const args = destination as EasyArgs;\r\n const parsed = this.parseLonLat(args.destination);\r\n lon = parsed.lon;\r\n lat = parsed.lat;\r\n h = parsed.height ?? args.height;\r\n orientation = args.orientation;\r\n finalDuration = args.duration;\r\n } else {\r\n const parsed = this.parseLonLat(destination as LonLatInput);\r\n lon = parsed.lon;\r\n lat = parsed.lat;\r\n h = parsed.height;\r\n if (typeof heightOrOrientation === 'number') {\r\n h = h ?? heightOrOrientation;\r\n if (typeof orientationOrDuration === 'number')\r\n finalDuration = orientationOrDuration as number;\r\n else orientation = orientationOrDuration as OrientationInput;\r\n if (typeof duration === 'number') finalDuration = duration;\r\n } else {\r\n orientation = heightOrOrientation as OrientationInput;\r\n if (typeof orientationOrDuration === 'number')\r\n finalDuration = orientationOrDuration as number;\r\n }\r\n }\r\n\r\n const finalHeight = h ?? 1500;\r\n if (lon == null || lat == null) return;\r\n const dest = this.CesiumNS.Cartesian3.fromDegrees(lon, lat, finalHeight);\r\n this.flyTo({ destination: dest, ...orientation }, { duration: finalDuration });\r\n }\r\n\r\n flyTo(view: CameraView, opts?: FlyToOptions): void {\r\n const { destination, heading = 0, pitch = -Math.PI / 4, roll = 0 } = view;\r\n this.viewer.camera.flyTo({\r\n destination,\r\n orientation: { heading, pitch, roll },\r\n duration: opts?.duration ?? 2.0,\r\n });\r\n }\r\n\r\n lookAt(target: any, offset?: any): void {\r\n this.viewer.camera.lookAt(target, offset);\r\n }\r\n\r\n zoom(delta: number): void {\r\n if (delta > 0) this.viewer.camera.zoomIn(delta);\r\n else this.viewer.camera.zoomOut(-delta);\r\n }\r\n\r\n pan(dx: number, dy: number): void {\r\n this.viewer.camera.moveRight(dx);\r\n this.viewer.camera.moveUp(dy);\r\n }\r\n\r\n async followPath(positions: any[], opts?: PathOptions): Promise<void> {\r\n // Simple flyToSequence based on speed heuristic\r\n const duration = opts?.speed ? undefined : 2.0; // fallback duration per segment\r\n for (let i = 0; i < positions.length; i++) {\r\n await this.flyToAsync({ destination: positions[i] }, { duration });\r\n }\r\n }\r\n\r\n flyToRectangle(\r\n rect: Cesium.Rectangle,\r\n opts?: FlyToOptions & { heading?: number; pitch?: number; roll?: number; zoomScale?: number },\r\n ): void {\r\n const C = this.CesiumNS as any;\r\n const bs =\r\n (C.BoundingSphere?.fromRectangle3D?.(rect) ?? C.BoundingSphere?.fromRectangle2D?.(rect)) ||\r\n undefined;\r\n const duration = opts?.duration ?? 2.0;\r\n const heading = opts?.heading ?? 0;\r\n const pitch = opts?.pitch ?? -0.8;\r\n const rangeScale = opts?.zoomScale ?? 1.2; // smaller is closer; 1.2 gives a tighter frame\r\n if (bs && C.HeadingPitchRange) {\r\n const offset = new C.HeadingPitchRange(heading, pitch, Math.max(1, bs.radius * rangeScale));\r\n this.viewer.camera.flyToBoundingSphere(bs, { duration, offset } as any);\r\n } else if (bs) {\r\n this.viewer.camera.flyToBoundingSphere(bs, { duration } as any);\r\n } else {\r\n this.viewer.camera.flyTo({ destination: rect, duration } as any);\r\n }\r\n }\r\n\r\n focusOnImageryLayer(\r\n layer: Cesium.ImageryLayer,\r\n opts?: FlyToOptions & {\r\n heading?: number;\r\n pitch?: number;\r\n roll?: number;\r\n height?: number;\r\n zoomScale?: number;\r\n },\r\n ): void {\r\n const provider: Cesium.ImageryProvider & { ready?: boolean; readyPromise?: Promise<void> } = (\r\n layer as any\r\n ).imageryProvider;\r\n if (provider && provider.ready === false && provider.readyPromise) {\r\n // Wait until provider is ready to ensure rectangle/tilingScheme are populated\r\n provider.readyPromise\r\n .then(() => this.focusOnImageryLayer(layer, opts))\r\n .catch(() => {\r\n /* ignore */\r\n });\r\n return;\r\n }\r\n const rect: Cesium.Rectangle | undefined =\r\n (provider as any)?.rectangle ?? (provider as any)?.tilingScheme?.rectangle;\r\n if (rect) {\r\n // 优先:若有地形高度,则使用“地形高度 + 1000m”作为飞行高度,定位到图层中心\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const center = C.Rectangle.center(rect); // radians Cartographic\r\n const hTerrain = (this.viewer.scene as any)?.globe?.getHeight?.(center);\r\n if (typeof hTerrain === 'number' && isFinite(hTerrain)) {\r\n const base = Math.max(0, hTerrain);\r\n const height = base + 500; // 指定规则:地形高 + 1000m\r\n const dest = C.Cartesian3.fromRadians(center.longitude, center.latitude, height);\r\n // 修改:存在地形时,镜头垂直俯视\r\n const pitch = opts?.pitch ?? C.Math.toRadians(-90);\r\n this.flyTo(\r\n { destination: dest, heading: opts?.heading, pitch, roll: opts?.roll },\r\n { duration: opts?.duration },\r\n );\r\n return;\r\n }\r\n } catch {}\r\n // 回退:按矩形范围框选飞行\r\n this.flyToRectangle(rect, opts as any);\r\n return;\r\n }\r\n // Fallback: try to fly to provider's center if we can estimate one (use global center)\r\n const lon = 0;\r\n const lat = 0;\r\n const height = opts?.height ?? 1500000; // heuristic height\r\n const destination = this.CesiumNS.Cartesian3.fromDegrees(lon, lat, height);\r\n this.flyTo(\r\n { destination, heading: opts?.heading, pitch: opts?.pitch ?? -0.8, roll: opts?.roll },\r\n { duration: opts?.duration },\r\n );\r\n }\r\n\r\n /**\r\n * fly to with promise\r\n * @param view\r\n * @param opts\r\n * @returns\r\n */\r\n private flyToAsync(view: CameraView, opts?: FlyToOptions): Promise<void> {\r\n return new Promise((resolve) => {\r\n const { destination, heading = 0, pitch = -Math.PI / 4, roll = 0 } = view;\r\n this.viewer.camera.flyTo({\r\n destination,\r\n orientation: { heading, pitch, roll },\r\n duration: opts?.duration ?? 2.0,\r\n complete: () => resolve(),\r\n cancel: () => resolve(),\r\n } as any);\r\n });\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { assertCesiumAssetsConfigured, ensureCesiumIonToken } from './assets';\r\nimport { LayerManager } from './LayerManager';\r\nimport { CameraManager } from './CameraManager';\r\nimport {\r\n type CameraView,\r\n type ImageryOptions,\r\n type TerrainOptions,\r\n type CameraInitOptions,\r\n} from '../types/public';\r\n\r\nexport interface SceneOptions {\r\n container: string | HTMLElement;\r\n imagery?: ImageryOptions;\r\n terrain?: TerrainOptions;\r\n initialCamera?: CameraView | CameraInitOptions;\r\n sunlight?: {\r\n enabled: boolean;\r\n time?: Date;\r\n };\r\n shadows?: boolean;\r\n viewerOptions?: Cesium.Viewer.ConstructorOptions;\r\n}\r\n\r\nexport class SceneManager {\r\n private viewer: Cesium.Viewer;\r\n private layerManager: LayerManager;\r\n private cameraManager: CameraManager;\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n options: SceneOptions,\r\n ) {\r\n console.log('SceneManager constructor', options);\r\n assertCesiumAssetsConfigured();\r\n // Ensure the Ion token (if configured) is applied to this Cesium instance\r\n ensureCesiumIonToken(CesiumNS);\r\n const { imagery, terrain, initialCamera, sunlight, shadows, viewerOptions } = options;\r\n\r\n const container = this.resolveContainer(options.container);\r\n this.viewer = new CesiumNS.Viewer(container, {\r\n baseLayer: false,\r\n // 时间控制相关\r\n animation: false,\r\n timeline: false,\r\n // UI控件\r\n geocoder: false,\r\n homeButton: false,\r\n sceneModePicker: false,\r\n baseLayerPicker: false,\r\n navigationHelpButton: false,\r\n fullscreenButton: false,\r\n vrButton: false,\r\n // 信息框\r\n infoBox: false,\r\n selectionIndicator: false,\r\n // 默认数据源\r\n shouldAnimate: false,\r\n // 地形和影像\r\n terrainProvider: undefined,\r\n creditContainer: undefined,\r\n // 其他\r\n contextOptions: {\r\n webgl: {\r\n alpha: true,\r\n depth: true,\r\n stencil: true,\r\n antialias: true,\r\n powerPreference: 'high-performance',\r\n preserveDrawingBuffer: true, // 必需:允许 canvas.toDataURL() 截图\r\n },\r\n },\r\n ...viewerOptions,\r\n });\r\n\r\n // Additional cleanup: hide credit display\r\n // try {\r\n // const creditContainer = (this.viewer as any).cesiumWidget?.creditContainer;\r\n // if (creditContainer) {\r\n // creditContainer.style.display = 'none';\r\n // }\r\n // // Also hide the bottom container\r\n // const bottomContainer = (this.viewer as any).bottomContainer;\r\n // if (bottomContainer) {\r\n // bottomContainer.style.display = 'none';\r\n // }\r\n // } catch {}\r\n\r\n // Create managers\r\n this.layerManager = new LayerManager(CesiumNS, this.viewer);\r\n this.layerManager.events.on((evt) => {\r\n // For now, just log errors; could expose SceneManager-level events later\r\n if ((evt as any).error) {\r\n // eslint-disable-next-line no-console\r\n console.error('[SceneManager] Layer error:', (evt as any).error);\r\n }\r\n });\r\n this.cameraManager = new CameraManager(CesiumNS, this.viewer);\r\n\r\n // Initialize base layers via LayerManager\r\n if (imagery) this.applyImagery(imagery);\r\n if (terrain) this.applyTerrain(terrain);\r\n if (typeof shadows === 'boolean') this.setShadows(shadows);\r\n if (sunlight?.enabled) this.configureSunlight(true, sunlight.time);\r\n if (initialCamera) this.setInitialCamera(initialCamera);\r\n }\r\n\r\n getViewer(): Cesium.Viewer {\r\n return this.viewer;\r\n }\r\n\r\n /**\r\n * Set a black background for areas without imagery. Optionally clear existing base imagery layers.\r\n */\r\n useBlackBackground(removeAllImagery = true): void {\r\n const C = this.CesiumNS as any;\r\n if (removeAllImagery) this.viewer.imageryLayers.removeAll();\r\n this.viewer.scene.globe.baseColor = C.Color.BLACK;\r\n }\r\n\r\n destroy(): void {\r\n this.viewer?.destroy();\r\n // @ts-expect-error\r\n this.viewer = undefined;\r\n }\r\n\r\n configureSunlight(enabled: boolean, datetime?: Date): void {\r\n const { CesiumNS } = this;\r\n const scene = this.viewer.scene;\r\n scene.globe.enableLighting = enabled;\r\n if (enabled && datetime) {\r\n this.viewer.clock.currentTime = CesiumNS.JulianDate.fromDate(datetime);\r\n this.viewer.clock.shouldAnimate = false;\r\n }\r\n }\r\n\r\n setShadows(enabled: boolean): void {\r\n this.viewer.shadows = enabled;\r\n }\r\n\r\n setInitialCamera(view: CameraView | CameraInitOptions): void {\r\n // Delegate to CameraManager for all camera operations\r\n this.cameraManager.initCamera(view);\r\n }\r\n\r\n getCameraManager(): CameraManager {\r\n return this.cameraManager;\r\n }\r\n\r\n getLayerManager(): LayerManager {\r\n return this.layerManager;\r\n }\r\n\r\n setBaseImagery(\r\n url: string,\r\n layer_id: string,\r\n opts?: Omit<ImageryOptions, 'url'>,\r\n ): Cesium.ImageryLayer | undefined {\r\n for (let i = 0; i < this.viewer.imageryLayers.length; i++) {\r\n const layer = this.viewer.imageryLayers.get(i);\r\n if ((layer as any)._customId === layer_id) {\r\n // this.viewer.imageryLayers.remove(layer);\r\n console.log(`[SceneManager] 缓存 ImageryLayer_id`, (layer as any)._customId);\r\n return layer;\r\n }\r\n }\r\n // const urlroot = `${url}/{z}/{x}/{y}.png`;\r\n\r\n opts = opts ?? {};\r\n const minZoom: number = typeof opts.zoomRange?.min === 'number' ? opts.zoomRange.min : 17;\r\n const maxZoom: number = typeof opts.zoomRange?.max === 'number' ? opts.zoomRange.max : 20;\r\n\r\n opts = {\r\n ...opts,\r\n zoomRange: { min: minZoom, max: maxZoom },\r\n };\r\n\r\n const layer = this.applyImagery({ url: url, provider: 'urlTemplate', ...opts });\r\n if (layer) {\r\n (layer as any)._customId = layer_id;\r\n console.log(`[SceneManager] 新建 ImageryLayer_id`, (layer as any)._customId);\r\n }\r\n return layer;\r\n }\r\n\r\n // private tilese3DtMap: Map<string, any> = new Map();\r\n async set3DTiles(url: string, layer_id: string): Promise<any | undefined> {\r\n const primitives = this.viewer.scene.primitives;\r\n for (let i = primitives.length - 1; i >= 0; i--) {\r\n const primitive = primitives.get(i);\r\n if (primitive && primitive._customId === layer_id) {\r\n console.log(`[SceneManager] 缓存 3DTiles_id`, (primitive as any)._customId);\r\n return primitive;\r\n }\r\n }\r\n\r\n try {\r\n const tileset = await this.apply3Dtiles(url);\r\n if (tileset) {\r\n (tileset as any)._customId = layer_id;\r\n (tileset as any)._url = url; // 保存 URL 以便其他组件(如 PathPreview)使用\r\n // this.tilese3DtMap.set(layer_id, tileset);\r\n this.viewer.scene.primitives.add(tileset);\r\n console.log(`[SceneManager] 新建 3DTiles_id`, (tileset as any)._customId);\r\n }\r\n return tileset;\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.error('[SceneManager] Failed to load 3DTiles:', e);\r\n return undefined;\r\n }\r\n }\r\n\r\n async setTerrain(options: TerrainOptions): Promise<Cesium.TerrainProvider | undefined> {\r\n // this.viewer.scene.skyAtmosphere?.show = false;\r\n if (this.viewer.scene.skyBox) {\r\n this.viewer.scene.skyBox.show = false;\r\n }\r\n this.viewer.scene.backgroundColor = this.CesiumNS.Color.BLACK;\r\n this.viewer.scene.globe.baseColor = this.CesiumNS.Color.BLACK;\r\n return this.applyTerrain(options);\r\n }\r\n\r\n // Expose DSM (3D Tiles) loading for demos and consumers\r\n async addDSM(options: { url: string; show?: boolean; maximumScreenSpaceError?: number }) {\r\n const handle = await this.layerManager.addDSM(options);\r\n try {\r\n if (handle) {\r\n const ts = this.layerManager.getTileset(handle.id);\r\n if ((ts as any)?.ready === false && (ts as any)?.readyPromise) {\r\n await (ts as any).readyPromise;\r\n }\r\n if (ts) {\r\n // Zoom to the tileset bounds for convenience\r\n await (this.viewer as any).zoomTo?.(ts);\r\n }\r\n }\r\n } catch {\r\n // ignore zoom errors\r\n }\r\n return handle;\r\n }\r\n\r\n private resolveContainer(container: string | HTMLElement): HTMLElement {\r\n if (typeof container === 'string') {\r\n const el = document.getElementById(container);\r\n if (!el) throw new Error(`Container element #${container} not found`);\r\n return el;\r\n }\r\n return container;\r\n }\r\n\r\n private applyImagery(options: ImageryOptions): Cesium.ImageryLayer | undefined {\r\n try {\r\n const handle = this.layerManager.addDOM(options);\r\n if (!handle) return undefined;\r\n // Backward-compatible: return underlying Cesium layer\r\n const layer = this.layerManager.getImageryLayer(handle.id);\r\n // if (layer) {\r\n // // Fly to and focus on the imagery layer's extent/center\r\n // this.cameraManager.focusOnImageryLayer(layer);\r\n // }\r\n return layer;\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.error('[SceneManager] Failed to apply imagery:', e);\r\n return undefined;\r\n }\r\n }\r\n\r\n private async apply3Dtiles(url: string): Promise<any | undefined> {\r\n const tileset = await this.CesiumNS.Cesium3DTileset.fromUrl(url, {\r\n maximumScreenSpaceError: 16, // 降低以提高点云质量\r\n dynamicScreenSpaceError: true,\r\n dynamicScreenSpaceErrorDensity: 0.00278,\r\n dynamicScreenSpaceErrorFactor: 4.0,\r\n skipLevelOfDetail: false,\r\n baseScreenSpaceError: 1024,\r\n skipScreenSpaceErrorFactor: 16,\r\n skipLevels: 1,\r\n immediatelyLoadDesiredLevelOfDetail: false,\r\n loadSiblings: false,\r\n cullWithChildrenBounds: true,\r\n // 点云特定选项\r\n pointCloudShading: {\r\n attenuation: true,\r\n geometricErrorScale: 1.0,\r\n maximumAttenuation: undefined,\r\n baseResolution: undefined,\r\n eyeDomeLighting: true, // 启用 EDL 可以改善点云视觉效果\r\n eyeDomeLightingStrength: 1.0,\r\n eyeDomeLightingRadius: 1.0,\r\n } as any,\r\n });\r\n return tileset ?? undefined;\r\n }\r\n\r\n private async applyTerrain(options: TerrainOptions): Promise<Cesium.TerrainProvider | undefined> {\r\n try {\r\n const handle = await this.layerManager.addDEM(options);\r\n // LayerManager.addDEM sets viewer.terrainProvider; return it for convenience\r\n console.log('handle', this.viewer.terrainProvider);\r\n return handle ? this.viewer.terrainProvider : undefined;\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.error('[SceneManager] Failed to apply terrain:', e);\r\n return undefined;\r\n }\r\n }\r\n}\r\n","import type { CameraView } from '../types/public';\r\nimport { Emitter } from '../utils/events';\r\n\r\nexport interface SelectionChange<T = unknown> {\r\n current?: T;\r\n previous?: T;\r\n}\r\n\r\nexport interface EditingChange<T = unknown> {\r\n editing: boolean;\r\n target?: T;\r\n}\r\n\r\nexport interface PreviousViewChange {\r\n current?: CameraView;\r\n previous?: CameraView;\r\n}\r\n\r\n/**\r\n * Lightweight state manager for common UI states:\r\n * - selection (arbitrary payload)\r\n * - editing (boolean + optional target)\r\n * - previous camera view (for simple back navigation)\r\n */\r\nexport class StateManager<TSelection = unknown, TEditingTarget = unknown> {\r\n private selected?: TSelection;\r\n private editing = false;\r\n private editingTarget?: TEditingTarget;\r\n private previousView?: CameraView;\r\n\r\n // Emitters\r\n readonly onSelectionChange = new Emitter<SelectionChange<TSelection>>();\r\n readonly onEditingChange = new Emitter<EditingChange<TEditingTarget>>();\r\n readonly onPreviousViewChange = new Emitter<PreviousViewChange>();\r\n\r\n // Selection\r\n setSelected(next?: TSelection): void {\r\n const prev = this.selected;\r\n this.selected = next;\r\n // console.log('setSelected', next);\r\n this.onSelectionChange.emit({ current: next, previous: prev });\r\n }\r\n /**\r\n * 获取当前选中对象。\r\n * - 若未传入类型,直接返回当前选中对象。\r\n * - 若传入类型,则当且仅当选中对象的 `type` 字段与之匹配时返回,否则返回 undefined。\r\n */\r\n getSelected(): TSelection | undefined;\r\n getSelected(type: 'line' | 'shape' | 'point' | 'unknown'): TSelection | undefined;\r\n getSelected(type?: 'line' | 'shape' | 'point' | 'unknown'): TSelection | undefined {\r\n if (!type) return this.selected;\r\n const cur: any = this.selected as any;\r\n return cur && cur.type === type ? (this.selected as any) : undefined;\r\n }\r\n clearSelected(): void {\r\n this.setSelected(undefined);\r\n }\r\n\r\n // Editing\r\n startEditing(target?: TEditingTarget): void {\r\n this.editing = true;\r\n this.editingTarget = target;\r\n this.onEditingChange.emit({ editing: true, target });\r\n }\r\n stopEditing(): void {\r\n this.editing = false;\r\n const target = this.editingTarget;\r\n this.editingTarget = undefined;\r\n this.onEditingChange.emit({ editing: false, target });\r\n }\r\n toggleEditing(target?: TEditingTarget): void {\r\n if (this.editing) this.stopEditing();\r\n else this.startEditing(target);\r\n }\r\n isEditing(): boolean {\r\n return this.editing;\r\n }\r\n getEditingTarget(): TEditingTarget | undefined {\r\n return this.editingTarget;\r\n }\r\n\r\n // Previous camera view\r\n setPreviousCameraView(view?: CameraView): void {\r\n const prev = this.previousView;\r\n this.previousView = view;\r\n this.onPreviousViewChange.emit({ current: view, previous: prev });\r\n }\r\n getPreviousCameraView(): CameraView | undefined {\r\n return this.previousView;\r\n }\r\n}\r\n\r\n// Lightweight global state singleton for apps that don't integrate an external store.\r\n// Consumers with their own store can ignore this and pass a StateManager explicitly.\r\nexport const globalState = new StateManager<any, any>();\r\n","import type * as Cesium from 'cesium';\r\n\r\n/** A vertical ground marker: yellow line from point to ground with a circular marker at the base. */\r\nexport class HeightMarker {\r\n private C: any;\r\n private entity?: Cesium.Entity;\r\n private labelEntity?: Cesium.Entity;\r\n private destroyed = false;\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Cesium.Viewer,\r\n private layer: Cesium.CustomDataSource,\r\n private opts: { width?: number; color?: Cesium.Color; circleRadius?: number } = {},\r\n ) {\r\n this.C = this.CesiumNS as any;\r\n }\r\n\r\n private ensureEntity() {\r\n if (this.entity) return;\r\n const C = this.C;\r\n const color = (this.opts.color as any) ?? C.Color.YELLOW;\r\n // Create a single entity holding both the polyline and the ground circle (ellipse)\r\n this.entity = this.layer.entities.add({\r\n position: C.Cartesian3.ZERO, // will be set to ground point for ellipse\r\n polyline: {\r\n positions: [C.Cartesian3.ZERO, C.Cartesian3.ZERO],\r\n width: this.opts.width ?? 2,\r\n material: color,\r\n clampToGround: false, // vertical line in 3D space\r\n },\r\n ellipse: {\r\n semiMajorAxis: this.opts.circleRadius ?? 5.0,\r\n semiMinorAxis: this.opts.circleRadius ?? 5.0,\r\n material: (color as any).withAlpha ? (color as any).withAlpha(0.65) : color,\r\n outline: true,\r\n outlineColor: color,\r\n heightReference: C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n properties: { _type: 'height-marker' },\r\n } as any);\r\n\r\n // Create a separate entity for the label so it can sit at the mid-point of the line\r\n this.labelEntity = this.layer.entities.add({\r\n position: C.Cartesian3.ZERO,\r\n label: {\r\n text: '',\r\n font: '14px sans-serif',\r\n style: C.LabelStyle.FILL_AND_OUTLINE,\r\n fillColor: C.Color.BLACK,\r\n outlineColor: C.Color.WHITE,\r\n outlineWidth: 3,\r\n pixelOffset: new C.Cartesian2(0, -6),\r\n showBackground: false,\r\n horizontalOrigin: C.HorizontalOrigin.CENTER,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: { _type: 'height-marker-label' },\r\n } as any);\r\n }\r\n\r\n /** Compute ground point directly under the given world position. */\r\n private computeGroundPoint(top: Cesium.Cartesian3): Cesium.Cartesian3 {\r\n const C = this.C;\r\n const scene = (this.viewer as any).scene;\r\n try {\r\n // Down vector from local ENU\r\n const enu = C.Transforms.eastNorthUpToFixedFrame(top);\r\n const up4 = C.Matrix4.getColumn(enu, 2, new C.Cartesian4());\r\n const up = new C.Cartesian3(up4.x, up4.y, up4.z);\r\n const down = C.Cartesian3.negate(up, new C.Cartesian3());\r\n const ray = new C.Ray(top, down);\r\n const pick = scene?.globe?.pick?.(ray, scene);\r\n if (pick) return pick;\r\n } catch {}\r\n // Fallback: use cartographic lon/lat and query height\r\n try {\r\n const carto = this.C.Cartographic.fromCartesian(top);\r\n const h = (this.viewer.scene as any).globe?.getHeight?.(carto);\r\n const height = typeof h === 'number' ? h : 0;\r\n return this.C.Cartesian3.fromRadians(carto.longitude, carto.latitude, height);\r\n } catch {}\r\n // Last resort: project to ellipsoid surface (height 0)\r\n try {\r\n const carto = this.C.Cartographic.fromCartesian(top);\r\n return this.C.Cartesian3.fromRadians(carto.longitude, carto.latitude, 0);\r\n } catch {}\r\n return top;\r\n }\r\n\r\n /** Show or update the marker for the given position. */\r\n showAt(position: Cesium.Cartesian3) {\r\n if (this.destroyed) return;\r\n this.ensureEntity();\r\n const bottom = this.computeGroundPoint(position);\r\n try {\r\n if (this.entity) {\r\n (this.entity as any).polyline.positions = [position, bottom];\r\n (this.entity as any).position = bottom; // for ellipse\r\n }\r\n\r\n // Update label position (mid-point) and text (height in meters)\r\n if (this.labelEntity) {\r\n const C = this.C;\r\n const mid = C.Cartesian3.lerp(position, bottom, 0.5, new C.Cartesian3());\r\n (this.labelEntity as any).position = mid;\r\n // Compute height difference using cartographic heights for robustness\r\n let text = '0 m';\r\n try {\r\n const topCarto = C.Cartographic.fromCartesian(position);\r\n const botCarto = C.Cartographic.fromCartesian(bottom);\r\n const h = Math.max(0, (topCarto.height ?? 0) - (botCarto.height ?? 0));\r\n const meters = Math.round(h);\r\n text = `${meters} m`;\r\n } catch {}\r\n (this.labelEntity as any).label.text = text;\r\n }\r\n } catch {}\r\n }\r\n\r\n /**\r\n * Show or update the marker with a dynamic callback for real-time updates.\r\n * Uses CallbackProperty so Cesium automatically evaluates position every frame.\r\n */\r\n showAtDynamic(positionCallback: () => Cesium.Cartesian3) {\r\n if (this.destroyed) return;\r\n this.ensureEntity();\r\n\r\n const C = this.C;\r\n\r\n // Create a callback that computes both the top position and ground point\r\n const computePositions = () => {\r\n const top = positionCallback();\r\n const bottom = this.computeGroundPoint(top);\r\n return { top, bottom };\r\n };\r\n\r\n try {\r\n if (this.entity) {\r\n // Update polyline positions dynamically\r\n (this.entity as any).polyline.positions = new C.CallbackProperty(() => {\r\n const { top, bottom } = computePositions();\r\n return [top, bottom];\r\n }, false);\r\n\r\n // Update ellipse position (ground point) dynamically\r\n (this.entity as any).position = new C.CallbackProperty(() => {\r\n const { bottom } = computePositions();\r\n return bottom;\r\n }, false);\r\n }\r\n\r\n // Update label position (mid-point) and text (height in meters) dynamically\r\n if (this.labelEntity) {\r\n (this.labelEntity as any).position = new C.CallbackProperty(() => {\r\n const { top, bottom } = computePositions();\r\n const mid = C.Cartesian3.lerp(top, bottom, 0.5, new C.Cartesian3());\r\n return mid;\r\n }, false);\r\n\r\n (this.labelEntity as any).label.text = new C.CallbackProperty(() => {\r\n const { top, bottom } = computePositions();\r\n try {\r\n const topCarto = C.Cartographic.fromCartesian(top);\r\n const botCarto = C.Cartographic.fromCartesian(bottom);\r\n const h = Math.max(0, (topCarto.height ?? 0) - (botCarto.height ?? 0));\r\n const meters = Math.round(h);\r\n return `${meters} m`;\r\n } catch {\r\n return '0 m';\r\n }\r\n }, false);\r\n }\r\n } catch {}\r\n }\r\n\r\n destroy() {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n try {\r\n if (this.entity) this.layer.entities.remove(this.entity);\r\n if (this.labelEntity) this.layer.entities.remove(this.labelEntity);\r\n } catch {}\r\n this.entity = undefined;\r\n this.labelEntity = undefined;\r\n }\r\n}\r\n","import { Emitter, globalCameraEventBus, CameraFOVChangeEvent } from '../../utils/events';\r\n\r\nexport interface FOVControllerOptions {\r\n /** 初始 FOV 值(度) */\r\n initialFOV?: number;\r\n /** 最小 FOV 值(度),对应长焦 */\r\n minFOV?: number;\r\n /** 最大 FOV 值(度),对应广角 */\r\n maxFOV?: number;\r\n /** UI 容器元素,如果不提供则自动创建 */\r\n container?: HTMLElement;\r\n /** 是否显示焦距刻度标签 */\r\n showLabels?: boolean;\r\n /** 预设焦距档位(焦距值数组,mm) */\r\n focalLengthPresets?: number[];\r\n /** 传感器宽度(mm),用于计算焦距,默认 35mm 全画幅 */\r\n sensorWidth?: number;\r\n /** 是否使用全局事件总线,默认 true */\r\n useGlobalEventBus?: boolean;\r\n /** 滑块容器高度(px),默认 300 */\r\n sliderHeight?: number;\r\n}\r\n\r\nexport interface FOVChangeEvent {\r\n /** 当前 FOV 值(度) */\r\n fov: number;\r\n /** 等效焦距(mm) */\r\n focalLength: number;\r\n}\r\n\r\n/**\r\n * 相机 FOV(视场角)控制器\r\n * 提供焦距滑块控制,模拟镜头焦距变化(14mm 广角 到 200mm 长焦)\r\n * 通过全局事件总线与 PathPreview 和 FrustumPyramid 通信\r\n */\r\nexport class CameraFOVController {\r\n private containerEl?: HTMLElement;\r\n private sliderEl?: HTMLInputElement;\r\n private labelEl?: HTMLElement;\r\n private destroyed = false;\r\n private useGlobalEventBus: boolean;\r\n\r\n // 本地事件发射器(向后兼容)\r\n public onFOVChange = new Emitter<FOVChangeEvent>();\r\n\r\n // FOV 范围(度)\r\n private minFOV: number;\r\n private maxFOV: number;\r\n private currentFOV: number;\r\n\r\n // 焦距相关\r\n private sensorWidth: number;\r\n private focalLengthPresets: number[];\r\n\r\n constructor(private opts: FOVControllerOptions = {}) {\r\n this.sensorWidth = opts.sensorWidth ?? 36; // 35mm 全画幅\r\n this.focalLengthPresets = opts.focalLengthPresets ?? [112, 56, 14, 7, 3, 1];\r\n\r\n\r\n // 如果没有指定 FOV 范围,根据焦距预设自动计算\r\n if (opts.minFOV === undefined || opts.maxFOV === undefined) {\r\n const minFocalLength = Math.min(...this.focalLengthPresets); // 最小焦距 (1mm) -> 最大 FOV\r\n const maxFocalLength = Math.max(...this.focalLengthPresets); // 最大焦距 (112mm) -> 最小 FOV\r\n\r\n // 小焦距对应大FOV,大焦距对应小FOV\r\n this.maxFOV = this.focalLengthToFOVDirect(minFocalLength);\r\n this.minFOV = this.focalLengthToFOVDirect(maxFocalLength);\r\n } else {\r\n this.minFOV = opts.minFOV;\r\n this.maxFOV = opts.maxFOV;\r\n }\r\n\r\n this.currentFOV = opts.initialFOV ?? this.focalLengthToFOVDirect(56); // 默认 56mm 标准焦距\r\n this.useGlobalEventBus = opts.useGlobalEventBus ?? true; // 默认使用全局事件总线\r\n\r\n this.createUI();\r\n this.setupExternalFOVListener();\r\n }\r\n\r\n /**\r\n * 🆕 监听外部 FOV 变化事件(来自 UI 面板等),同步更新滑块位置\r\n */\r\n private setupExternalFOVListener(): void {\r\n if (!this.useGlobalEventBus) return;\r\n \r\n globalCameraEventBus.onFOVChange.on((event) => {\r\n // 只响应非自身发出的事件,避免循环\r\n if (event.source !== 'controller') {\r\n this.setFOVSilent(event.fov);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 焦距转换为 FOV(度)- 直接计算版本\r\n */\r\n private focalLengthToFOVDirect(focalLengthMm: number): number {\r\n const fovRad = 2 * Math.atan(this.sensorWidth / (2 * focalLengthMm));\r\n return (fovRad * 180) / Math.PI;\r\n }\r\n\r\n /**\r\n * 创建 UI 控件\r\n */\r\n private createUI(): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n // 创建或使用提供的容器\r\n let container = this.opts.container;\r\n if (!container) {\r\n container = document.createElement('div');\r\n container.style.position = 'absolute';\r\n container.style.top = '10px';\r\n container.style.right = '10px';\r\n container.style.zIndex = '1000';\r\n document.body.appendChild(container);\r\n }\r\n this.containerEl = container;\r\n\r\n // 创建控制面板\r\n const panel = document.createElement('div');\r\n panel.style.cssText = `\r\n background: transparent;\r\n color: #00ffdd;\r\n font-family: Arial, sans-serif;\r\n font-size: 12px;\r\n user-select: none;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: flex-start;\r\n gap: 20px;\r\n height: 100%;\r\n `;\r\n\r\n // 中间顶部区域:变焦标签 + 焦距数值\r\n const centerContainer = document.createElement('div');\r\n centerContainer.style.cssText = `\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: flex-start;\r\n padding-top: 10px;\r\n `;\r\n\r\n // 变焦标签\r\n this.labelEl = document.createElement('div');\r\n this.labelEl.style.cssText = `\r\n text-align: center;\r\n font-size: 18px;\r\n font-weight: bold;\r\n color: white;\r\n margin-bottom: 8px;\r\n text-shadow: \r\n -1px -1px 0 #000,\r\n 1px -1px 0 #000,\r\n -1px 1px 0 #000,\r\n 1px 1px 0 #000;\r\n `;\r\n centerContainer.appendChild(this.labelEl);\r\n\r\n panel.appendChild(centerContainer);\r\n\r\n // 右侧滑块容器(垂直)\r\n const sliderHeight = this.opts.sliderHeight ?? 300;\r\n const sliderContainer = document.createElement('div');\r\n sliderContainer.style.cssText = `\r\n position: relative;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n height: ${sliderHeight}px;\r\n background: linear-gradient(to left, rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0));\r\n padding: 10px 15px;\r\n `;\r\n\r\n // 创建垂直滑块(使用预设索引而非 FOV 值)\r\n this.sliderEl = document.createElement('input');\r\n this.sliderEl.type = 'range';\r\n this.sliderEl.min = '0';\r\n this.sliderEl.max = String(this.focalLengthPresets.length - 1);\r\n this.sliderEl.step = '0.01'; // 允许小数步进,实现平滑拖动\r\n // 找到最接近当前 FOV 的预设索引\r\n const currentIndex = this.getClosestPresetIndex(this.currentFOV);\r\n this.sliderEl.value = String(currentIndex);\r\n this.sliderEl.setAttribute('orient', 'vertical'); // For Firefox\r\n this.sliderEl.style.cssText = `\r\n writing-mode: bt-lr;\r\n -webkit-appearance: slider-vertical;\r\n width: 8px;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.5);\r\n border-radius: 4px;\r\n outline: none;\r\n cursor: pointer;\r\n position: relative;\r\n `;\r\n\r\n // 滑块样式(Chrome/Safari/Firefox)\r\n const style = document.createElement('style');\r\n style.textContent = `\r\n input[type=range][orient=vertical]::-webkit-slider-thumb,\r\n input[type=range].vertical::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n appearance: none;\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 50%;\r\n background: white;\r\n cursor: pointer;\r\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);\r\n }\r\n input[type=range][orient=vertical]::-moz-range-thumb,\r\n input[type=range].vertical::-moz-range-thumb {\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 50%;\r\n background: white;\r\n cursor: pointer;\r\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);\r\n border: none;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n\r\n sliderContainer.appendChild(this.sliderEl);\r\n\r\n // 预设焦距标记(垂直显示在滑块右侧,均匀分布)\r\n if (this.opts.showLabels !== false) {\r\n const markersContainer = document.createElement('div');\r\n markersContainer.style.cssText = `\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n height: 100%;\r\n font-size: 10px;\r\n color: rgba(255, 255, 255, 1);\r\n margin-left: 2px;\r\n `;\r\n\r\n // 直接使用预设数组:从上到下为 112mm -> 1mm\r\n this.focalLengthPresets.forEach((fl) => {\r\n const marker = document.createElement('div');\r\n marker.textContent = `${fl}`; // 直接显示焦距值\r\n marker.style.cssText = `\r\n cursor: pointer;\r\n padding: 2px 4px;\r\n border-radius: 3px;\r\n transition: all 0.2s;\r\n white-space: nowrap;\r\n `;\r\n marker.addEventListener('mouseenter', () => {\r\n marker.style.background = 'rgba(0, 255, 221, 0.3)';\r\n });\r\n marker.addEventListener('mouseleave', () => {\r\n marker.style.background = 'transparent';\r\n });\r\n marker.addEventListener('click', () => {\r\n this.setFocalLength(fl); // 点击直接设置焦距\r\n });\r\n markersContainer.appendChild(marker);\r\n });\r\n\r\n sliderContainer.appendChild(markersContainer);\r\n }\r\n\r\n panel.appendChild(sliderContainer);\r\n\r\n container.appendChild(panel);\r\n\r\n // 绑定事件\r\n this.sliderEl.addEventListener('input', this.handleSliderChange);\r\n\r\n // 初始更新\r\n this.updateDisplay();\r\n this.emitChange();\r\n }\r\n\r\n /**\r\n * 滑块变化处理\r\n */\r\n private handleSliderChange = (): void => {\r\n if (!this.sliderEl) return;\r\n // 滑块值是预设数组的索引(可以是小数,需要插值)\r\n const sliderValue = parseFloat(this.sliderEl.value);\r\n // 反转索引:滑块顶部(max)对应数组开头(112mm),滑块底部(min)对应数组末尾(1mm)\r\n const sliderIndex = this.focalLengthPresets.length - 1 - sliderValue;\r\n \r\n // 在两个预设焦距值之间插值\r\n const focalLength = this.interpolateFocalLength(sliderIndex);\r\n \r\n // 设置对应的 FOV\r\n const fov = this.focalLengthToFOV(focalLength);\r\n this.currentFOV = fov;\r\n this.updateDisplay();\r\n this.emitChange();\r\n };\r\n\r\n /**\r\n * 根据索引插值计算焦距值\r\n */\r\n private interpolateFocalLength(index: number): number {\r\n // 确保索引在有效范围内\r\n const clampedIndex = Math.max(0, Math.min(this.focalLengthPresets.length - 1, index));\r\n \r\n // 如果是整数索引,直接返回对应的预设值\r\n if (Number.isInteger(clampedIndex)) {\r\n return this.focalLengthPresets[clampedIndex];\r\n }\r\n \r\n // 获取相邻的两个预设值\r\n const lowerIndex = Math.floor(clampedIndex);\r\n const upperIndex = Math.ceil(clampedIndex);\r\n const lowerFL = this.focalLengthPresets[lowerIndex];\r\n const upperFL = this.focalLengthPresets[upperIndex];\r\n \r\n // 计算插值比例\r\n const fraction = clampedIndex - lowerIndex;\r\n \r\n // 线性插值\r\n return lowerFL + (upperFL - lowerFL) * fraction;\r\n }\r\n\r\n /**\r\n * 根据焦距值计算对应的索引(可以是小数)\r\n */\r\n private getFocalLengthIndex(focalLength: number): number {\r\n // 确保在范围内\r\n const minFL = Math.min(...this.focalLengthPresets);\r\n const maxFL = Math.max(...this.focalLengthPresets);\r\n const clampedFL = Math.max(minFL, Math.min(maxFL, focalLength));\r\n \r\n // 找到相邻的两个预设值\r\n for (let i = 0; i < this.focalLengthPresets.length - 1; i++) {\r\n const current = this.focalLengthPresets[i];\r\n const next = this.focalLengthPresets[i + 1];\r\n \r\n if ((current <= clampedFL && clampedFL <= next) || \r\n (current >= clampedFL && clampedFL >= next)) {\r\n // 计算在这两个值之间的位置\r\n const fraction = (clampedFL - current) / (next - current);\r\n return i + fraction;\r\n }\r\n }\r\n \r\n // 如果没找到,返回最接近的\r\n return this.focalLengthPresets.indexOf(\r\n this.focalLengthPresets.reduce((prev, curr) =>\r\n Math.abs(curr - clampedFL) < Math.abs(prev - clampedFL) ? curr : prev\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * 根据 FOV 找到最接近的预设索引(可以是小数)\r\n */\r\n private getClosestPresetIndex(fov: number): number {\r\n // 将 FOV 转换为焦距\r\n const focalLength = this.fovToFocalLength(fov);\r\n \r\n // 获取对应的索引(直接使用焦距值)\r\n const index = this.getFocalLengthIndex(focalLength);\r\n \r\n // 反转索引以匹配滑块方向(滑块顶部=max value,对应数组开头=index 0)\r\n return this.focalLengthPresets.length - 1 - index;\r\n }\r\n\r\n /**\r\n * 更新显示\r\n */\r\n private updateDisplay(): void {\r\n const focalLength = this.fovToFocalLength(this.currentFOV);\r\n\r\n if (this.labelEl) {\r\n // 直接显示焦距值,与 UI 面板保持一致\r\n this.labelEl.textContent = `焦距 ${Math.round(focalLength)}`;\r\n }\r\n }\r\n\r\n /**\r\n * 发射 FOV 变化事件\r\n */\r\n private emitChange(): void {\r\n const focalLength = this.fovToFocalLength(this.currentFOV);\r\n const event: FOVChangeEvent = {\r\n fov: this.currentFOV,\r\n focalLength,\r\n };\r\n\r\n // 发送到本地事件(向后兼容)\r\n this.onFOVChange.emit(event);\r\n\r\n // 发送到全局事件总线\r\n if (this.useGlobalEventBus) {\r\n const globalEvent: CameraFOVChangeEvent = {\r\n fov: this.currentFOV,\r\n focalLength,\r\n source: 'controller',\r\n };\r\n globalCameraEventBus.onFOVChange.emit(globalEvent);\r\n }\r\n }\r\n\r\n /**\r\n * FOV 转换为等效焦距(mm)\r\n * 公式: f = (sensor_width / 2) / tan(fov / 2)\r\n */\r\n private fovToFocalLength(fovDeg: number): number {\r\n const fovRad = (fovDeg * Math.PI) / 180;\r\n return this.sensorWidth / 2 / Math.tan(fovRad / 2);\r\n }\r\n\r\n /**\r\n * 焦距转换为 FOV(度)\r\n * 公式: fov = 2 * atan(sensor_width / (2 * f))\r\n */\r\n private focalLengthToFOV(focalLengthMm: number): number {\r\n const fovRad = 2 * Math.atan(this.sensorWidth / (2 * focalLengthMm));\r\n return (fovRad * 180) / Math.PI;\r\n }\r\n\r\n /**\r\n * 变焦倍数转换为 FOV(度)\r\n */\r\n private zoomMultiplierToFOV(zoomMultiplier: number): number {\r\n const focalLength = zoomMultiplier * this.sensorWidth;\r\n return this.focalLengthToFOV(focalLength);\r\n }\r\n\r\n /**\r\n * 设置焦距(mm)\r\n */\r\n public setFocalLength(focalLengthMm: number): void {\r\n const fov = this.focalLengthToFOV(focalLengthMm);\r\n this.setFOV(fov);\r\n }\r\n\r\n /**\r\n * 设置变焦倍数\r\n */\r\n public setZoomMultiplier(zoomMultiplier: number): void {\r\n const fov = this.zoomMultiplierToFOV(zoomMultiplier);\r\n this.setFOV(fov);\r\n }\r\n\r\n /**\r\n * 设置 FOV(度)\r\n */\r\n public setFOV(fovDeg: number): void {\r\n this.currentFOV = Math.max(this.minFOV, Math.min(this.maxFOV, fovDeg));\r\n if (this.sliderEl) {\r\n // 找到最接近的预设索引并设置滑块\r\n const index = this.getClosestPresetIndex(this.currentFOV);\r\n this.sliderEl.value = String(index);\r\n }\r\n this.updateDisplay();\r\n this.emitChange();\r\n }\r\n\r\n /**\r\n * 🆕 静默设置 FOV(度)- 只更新滑块位置,不广播事件\r\n * 用于响应外部 FOV 变化事件,避免循环广播\r\n */\r\n public setFOVSilent(fovDeg: number): void {\r\n this.currentFOV = Math.max(this.minFOV, Math.min(this.maxFOV, fovDeg));\r\n if (this.sliderEl) {\r\n const index = this.getClosestPresetIndex(this.currentFOV);\r\n this.sliderEl.value = String(index);\r\n }\r\n this.updateDisplay();\r\n // 注意:不调用 emitChange(),避免循环\r\n }\r\n\r\n /**\r\n * 获取当前 FOV\r\n */\r\n public getFOV(): number {\r\n return this.currentFOV;\r\n }\r\n\r\n /**\r\n * 获取当前焦距\r\n */\r\n public getFocalLength(): number {\r\n return this.fovToFocalLength(this.currentFOV);\r\n }\r\n\r\n /**\r\n * 显示控制器\r\n */\r\n public show(): void {\r\n if (this.containerEl) {\r\n this.containerEl.style.display = 'block';\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏控制器\r\n */\r\n public hide(): void {\r\n if (this.containerEl) {\r\n this.containerEl.style.display = 'none';\r\n }\r\n }\r\n\r\n /**\r\n * 销毁控制器\r\n */\r\n public destroy(): void {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n\r\n // 移除事件监听\r\n if (this.sliderEl) {\r\n this.sliderEl.removeEventListener('input', this.handleSliderChange);\r\n }\r\n\r\n // 移除 DOM\r\n if (this.containerEl && !this.opts.container) {\r\n this.containerEl.remove();\r\n }\r\n\r\n // 清理事件\r\n this.onFOVChange.clear();\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { CameraFOVController, FOVControllerOptions } from './CameraFOVController';\r\nimport { globalCameraEventBus } from '../../utils/events';\r\n\r\nexport interface PathPreviewOptions {\r\n container?: HTMLElement;\r\n showFootprint?: boolean;\r\n fov?: number; // degrees\r\n pitch?: number; // degrees\r\n roll?: number; // degrees\r\n /** FOV 控制器选项 */\r\n fovController?: FOVControllerOptions | false; // false 表示禁用 FOV 控制器\r\n /** 是否使用全局事件总线 */\r\n useGlobalEventBus?: boolean;\r\n}\r\n\r\n/**\r\n * PathPreview class provides a lightweight mini preview window and ground footprint helper for Cesium applications.\r\n * It creates an overlay viewer that can be positioned and oriented independently of the main viewer,\r\n * allowing users to visualize a different perspective or path.\r\n * \r\n * 集成 CameraFOVController 用于动态调节视场角\r\n */\r\nexport class PathPreview {\r\n private overlayViewer?: Cesium.Viewer; // Lightweight overlay viewer\r\n private containerEl?: HTMLElement; // Container for the overlay viewer\r\n private footprintEntity?: Cesium.Entity; // Entity for ground footprint polygon\r\n private destroyed = false; // Track if the instance has been destroyed\r\n private fovController?: CameraFOVController; // FOV 控制器\r\n private currentFOV: number; // 当前 FOV 值\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private mainViewer: Cesium.Viewer,\r\n // private layer: Cesium.CustomDataSource,\r\n private opts: PathPreviewOptions = {},\r\n ) {\r\n this.currentFOV = opts.fov ?? 50;\r\n this.ensureViewer();\r\n this.ensureFOVController();\r\n // if (this.opts.showFootprint !== false) this.ensureFootprint();\r\n }\r\n\r\n private ensureViewer(): void {\r\n if (this.overlayViewer) return;\r\n const C: any = this.CesiumNS as any;\r\n // Container initialization ---!\r\n let host = this.opts.container;\r\n if (!host && typeof document !== 'undefined') {\r\n host = document.createElement('div');\r\n host.style.position = 'absolute';\r\n host.style.right = '10px';\r\n host.style.bottom = '10px';\r\n host.style.width = '480px';\r\n host.style.height = '320px';\r\n host.style.border = '1px solid rgba(255, 255, 255, 1)';\r\n host.style.borderRadius = '6px';\r\n host.style.overflow = 'hidden';\r\n host.style.background = '#000';\r\n try {\r\n const parent = (this.mainViewer as any).container as HTMLElement;\r\n parent?.appendChild(host);\r\n } catch {}\r\n }\r\n this.containerEl = host;\r\n // Create lightweight viewer\r\n const v = new C.Viewer(host, {\r\n animation: false,\r\n baseLayer:false,\r\n baseLayerPicker: false,\r\n geocoder: false,\r\n homeButton: false,\r\n infoBox: false,\r\n navigationHelpButton: false,\r\n sceneModePicker: false,\r\n timeline: false,\r\n fullscreenButton: false,\r\n selectionIndicator: false,\r\n requestRenderMode: true,\r\n terrain: undefined,\r\n // Hide Cesium branding and credits for clean preview\r\n creditContainer: undefined,\r\n });\r\n\r\n // Additional cleanup: hide credit display\r\n try {\r\n const creditContainer = (v as any).cesiumWidget?.creditContainer;\r\n if (creditContainer) {\r\n creditContainer.style.display = 'none';\r\n }\r\n // Also hide the bottom container\r\n const bottomContainer = (v as any).bottomContainer;\r\n if (bottomContainer) {\r\n bottomContainer.style.display = 'none';\r\n }\r\n } catch {}\r\n\r\n this.overlayViewer = v as any;\r\n\r\n // 同步主 viewer 的配置\r\n this.syncFromMainViewer();\r\n\r\n // 禁用用户交互\r\n this.disableUserInteraction();\r\n }\r\n\r\n /**\r\n * 从主 viewer 同步配置\r\n * 共享 Provider(安全)而非 DataSource\r\n */\r\n private syncFromMainViewer(): void {\r\n if (!this.overlayViewer) return;\r\n \r\n this.syncImageryLayers();\r\n this.syncTerrainProvider();\r\n this.syncSceneSettings();\r\n this.sync3DTiles();\r\n }\r\n\r\n /**\r\n * 同步影像图层(共享 ImageryProvider)\r\n */\r\n private syncImageryLayers(): void {\r\n const v = this.overlayViewer as any;\r\n if (!v) return;\r\n\r\n try {\r\n // 清除默认图层\r\n v.imageryLayers?.removeAll?.();\r\n \r\n // 共享主 viewer 的 ImageryProvider(安全,Provider 是无状态的)\r\n const mainImageryLayers = this.mainViewer.imageryLayers;\r\n for (let i = 0; i < mainImageryLayers.length; i++) {\r\n const layer = mainImageryLayers.get(i);\r\n try {\r\n v.imageryLayers?.addImageryProvider?.(layer.imageryProvider);\r\n } catch {}\r\n }\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to sync imagery layers:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 同步地形提供者(共享 TerrainProvider)\r\n */\r\n private syncTerrainProvider(): void {\r\n const v = this.overlayViewer as any;\r\n if (!v) return;\r\n\r\n try {\r\n // 共享主 viewer 的 TerrainProvider(安全,Provider 是无状态的)\r\n if (this.mainViewer.terrainProvider) {\r\n v.terrainProvider = this.mainViewer.terrainProvider;\r\n }\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to sync terrain provider:', e);\r\n }\r\n }\r\n\r\n /** 已加载的 3D Tiles 实例(预览窗口独立的) */\r\n private tilesets: Map<string, any> = new Map();\r\n\r\n /**\r\n * 同步 3D Tiles(点云、倾斜摄影等)\r\n * 注意:Primitive 不能直接共享,需要创建独立实例\r\n * 此方法查找主 viewer 中的 tileset 并尝试使用相同 URL 创建新实例\r\n */\r\n private sync3DTiles(): void {\r\n const v = this.overlayViewer as any;\r\n if (!v) return;\r\n\r\n const C: any = this.CesiumNS as any;\r\n const mainPrimitives = (this.mainViewer.scene as any).primitives;\r\n\r\n try {\r\n // 遍历主 viewer 的 primitives,找到 Cesium3DTileset\r\n for (let i = 0; i < mainPrimitives.length; i++) {\r\n const primitive = mainPrimitives.get(i);\r\n \r\n // 检查是否是 Cesium3DTileset 且有 URL\r\n if (primitive && primitive instanceof C.Cesium3DTileset) {\r\n const customId = primitive._customId;\r\n const url = primitive._url || primitive.resource?.url;\r\n \r\n // 如果有 URL 且未创建过,则创建新实例\r\n if (url && customId && !this.tilesets.has(customId)) {\r\n this.add3DTiles(url, customId);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to sync 3DTiles:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 手动添加 3D Tiles 到预览窗口\r\n * @param url 3D Tiles URL\r\n * @param id 唯一标识符\r\n */\r\n async add3DTiles(url: string, id: string): Promise<any | undefined> {\r\n const v = this.overlayViewer as any;\r\n if (!v) return undefined;\r\n\r\n // 检查是否已存在\r\n if (this.tilesets.has(id)) {\r\n return this.tilesets.get(id);\r\n }\r\n\r\n const C: any = this.CesiumNS as any;\r\n\r\n try {\r\n const tileset = await C.Cesium3DTileset.fromUrl(url, {\r\n maximumScreenSpaceError: 16,\r\n });\r\n \r\n if (tileset) {\r\n tileset._customId = id;\r\n tileset._url = url;\r\n v.scene.primitives.add(tileset);\r\n this.tilesets.set(id, tileset);\r\n console.log('[PathPreview] Added 3DTiles:', id);\r\n }\r\n return tileset;\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to add 3DTiles:', url, e);\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 移除 3D Tiles\r\n */\r\n remove3DTiles(id: string): void {\r\n const v = this.overlayViewer as any;\r\n if (!v) return;\r\n\r\n const tileset = this.tilesets.get(id);\r\n if (tileset) {\r\n try {\r\n v.scene.primitives.remove(tileset);\r\n } catch {}\r\n this.tilesets.delete(id);\r\n }\r\n }\r\n\r\n /**\r\n * 同步场景设置(Globe、天空、雾效等)\r\n */\r\n private syncSceneSettings(): void {\r\n const v = this.overlayViewer as any;\r\n if (!v) return;\r\n\r\n const s = v.scene;\r\n const mainScene: any = this.mainViewer.scene;\r\n\r\n try {\r\n // 同步 Globe 设置\r\n if (s.globe && mainScene.globe) {\r\n s.globe.show = mainScene.globe.show;\r\n s.globe.enableLighting = mainScene.globe.enableLighting;\r\n s.globe.baseColor = mainScene.globe.baseColor;\r\n s.globe.showGroundAtmosphere = mainScene.globe.showGroundAtmosphere;\r\n s.globe.depthTestAgainstTerrain = mainScene.globe.depthTestAgainstTerrain;\r\n }\r\n\r\n // 同步天空盒\r\n if (mainScene.skyBox) {\r\n s.skyBox = mainScene.skyBox;\r\n } else {\r\n s.skyBox = undefined;\r\n }\r\n\r\n // 同步天空大气\r\n if (mainScene.skyAtmosphere) {\r\n s.skyAtmosphere.show = mainScene.skyAtmosphere.show;\r\n }\r\n\r\n // 同步雾效\r\n if (s.fog && mainScene.fog) {\r\n s.fog.enabled = mainScene.fog.enabled;\r\n s.fog.density = mainScene.fog.density;\r\n }\r\n\r\n // 同步阴影设置\r\n v.shadows = this.mainViewer.shadows;\r\n\r\n // 同步后处理(FXAA 等)\r\n if (s.postProcessStages?.fxaa && mainScene.postProcessStages?.fxaa) {\r\n s.postProcessStages.fxaa.enabled = mainScene.postProcessStages.fxaa.enabled;\r\n }\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to sync scene settings:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 禁用用户交互,相机仅通过 setPose() 控制\r\n */\r\n private disableUserInteraction(): void {\r\n const v = this.overlayViewer as any;\r\n if (!v) return;\r\n\r\n const s = v.scene;\r\n\r\n try {\r\n // 禁用所有相机控制\r\n const scc = s.screenSpaceCameraController;\r\n if (scc) {\r\n scc.enableInputs = false;\r\n scc.enableRotate = false;\r\n scc.enableTranslate = false;\r\n scc.enableZoom = false;\r\n scc.enableTilt = false;\r\n scc.enableLook = false;\r\n scc.inertiaSpin = 0;\r\n scc.inertiaZoom = 0;\r\n scc.inertiaTranslate = 0;\r\n }\r\n\r\n // 确保 canvas 不拦截主 viewer 的事件\r\n const canvas = s?.canvas ?? v.scene?.canvas;\r\n if (canvas && canvas.style) {\r\n canvas.style.pointerEvents = 'none';\r\n try {\r\n canvas.setAttribute('tabindex', '-1');\r\n } catch {}\r\n }\r\n\r\n // 禁用实体追踪和时钟动画\r\n v.trackedEntity = undefined;\r\n if (v.clock) {\r\n v.clock.shouldAnimate = false;\r\n }\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to disable user interaction:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 刷新同步(运行时更新)\r\n */\r\n refresh(): void {\r\n this.syncFromMainViewer();\r\n }\r\n\r\n /**\r\n * 创建 FOV 控制器\r\n */\r\n private ensureFOVController(): void {\r\n // 如果选项明确设置为 false,或者已经存在1个controller,则不再创建控制器\r\n if (this.opts.fovController === false) return;\r\n if (this.fovController) return;\r\n\r\n // 创建 FOV 控制器容器(放在预览地图容器中)\r\n let fovContainer: HTMLElement | undefined;\r\n let containerHeight = 300; // 默认高度\r\n if (this.containerEl && typeof document !== 'undefined') {\r\n fovContainer = document.createElement('div');\r\n fovContainer.style.position = 'absolute';\r\n fovContainer.style.top = '0';\r\n fovContainer.style.right = '0';\r\n fovContainer.style.height = '100%';\r\n fovContainer.style.zIndex = '10';\r\n fovContainer.style.pointerEvents = 'auto'; // 确保可以交互\r\n this.containerEl.appendChild(fovContainer);\r\n \r\n // 获取容器的实际高度\r\n const computedHeight = this.containerEl.offsetHeight;\r\n if (computedHeight > 0) {\r\n // 留出上下边距,滑块高度为容器高度减去 padding\r\n containerHeight = computedHeight-20; // 减去上下各 20px 的边距\r\n }\r\n }\r\n\r\n // 创建 FOV 控制器\r\n const fovOptions: FOVControllerOptions = {\r\n initialFOV: this.currentFOV,\r\n useGlobalEventBus: this.opts.useGlobalEventBus ?? true,\r\n container: fovContainer, // 使用我们创建的容器\r\n sliderHeight: containerHeight, // 传入计算的高度\r\n ...(typeof this.opts.fovController === 'object' ? this.opts.fovController : {}),\r\n };\r\n\r\n this.fovController = new CameraFOVController(fovOptions);\r\n\r\n // 监听 FOV 变化,更新预览窗口\r\n this.fovController.onFOVChange.on((event) => {\r\n this.currentFOV = event.fov;\r\n this.updateCameraFOV(event.fov);\r\n });\r\n\r\n // 如果使用全局事件总线,也监听全局事件\r\n if (this.opts.useGlobalEventBus !== false) {\r\n globalCameraEventBus.onFOVChange.on((event) => {\r\n if (event.source === 'controller') {\r\n this.currentFOV = event.fov;\r\n this.updateCameraFOV(event.fov);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 更新相机 FOV\r\n */\r\n private updateCameraFOV(fovDeg: number): void {\r\n if (!this.overlayViewer) return;\r\n const C: any = this.CesiumNS as any;\r\n const v = this.overlayViewer as any;\r\n \r\n try {\r\n const fov = C.Math.toRadians(Math.max(1, Math.min(120, fovDeg)));\r\n const fr = v.camera.frustum as any;\r\n if (fr && typeof fr.fov === 'number') {\r\n fr.fov = fov;\r\n v.scene?.requestRender?.();\r\n }\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to update FOV:', e);\r\n }\r\n }\r\n\r\n // private ensureFootprint(): void {\r\n // const C: any = this.CesiumNS as any;\r\n // if (this.footprintEntity) return;\r\n // this.footprintEntity = (this.layer.entities as any).add({\r\n // polygon: {\r\n // // Only show when we have at least 3 ground hit points\r\n // show: new C.CallbackProperty(() => (this._footprintPositions?.length ?? 0) >= 3, false),\r\n // hierarchy: new C.CallbackProperty(() => {\r\n // const arr = this._footprintPositions;\r\n // return arr && arr.length >= 3 ? arr.slice() : undefined;\r\n // }, false),\r\n // material: C.Color.CYAN.withAlpha(0.18),\r\n // outline: true,\r\n // outlineColor: C.Color.CYAN.withAlpha(0.7),\r\n // outlineWidth: 1,\r\n // // Use per-position heights from globe intersections to avoid terrain-ground primitive path\r\n // perPositionHeight: true,\r\n // },\r\n // properties: { _type: 'preview-footprint' },\r\n // });\r\n // }\r\n\r\n // private _footprintPositions: any[] | undefined;\r\n\r\n /**\r\n * Set the camera pose and field of view for the overlay viewer.\r\n * @param cartesian cartesian position\r\n * @param headingDeg heading angle in degrees\r\n * @param pitchDeg pitch angle in degrees\r\n * @param rollDeg roll angle in degrees\r\n * @param fovDeg field of view angle in degrees\r\n */\r\n setPose(\r\n cartesian: any,\r\n headingDeg: number,\r\n pitchDeg?: number,\r\n rollDeg?: number,\r\n fovDeg?: number,\r\n ) {\r\n // if (this.destroyed) return;\r\n const C: any = this.CesiumNS as any;\r\n const v = this.overlayViewer as any;\r\n // if (!v) return;\r\n\r\n const h = C.Math.toRadians(headingDeg ?? 0);\r\n const p = C.Math.toRadians(pitchDeg ?? this.opts.pitch ?? -10);\r\n const r = C.Math.toRadians(rollDeg ?? this.opts.roll ?? 0);\r\n\r\n v.camera.setView({\r\n destination: cartesian,\r\n orientation: { heading: h, pitch: p, roll: r },\r\n });\r\n // const fov = C.Math.toRadians(Math.max(1, Math.min(120, fovDeg ?? this.opts.fov ?? 50)));\r\n\r\n // // Debug: log camera update\r\n // console.log('[PathPreview] Setting camera:', {\r\n // heading: headingDeg,\r\n // pitch: pitchDeg ?? this.opts.pitch ?? -10,\r\n // roll: rollDeg ?? this.opts.roll ?? 0,\r\n // fov: fovDeg ?? this.opts.fov ?? 50,\r\n // });\r\n\r\n // try {\r\n // // Set FOV first\r\n // const fr = v.camera.frustum as any;\r\n // if (fr && typeof fr.fov === 'number') fr.fov = fov;\r\n\r\n // Use lookAt for more explicit camera positioning\r\n // Calculate a point ahead of the camera based on heading and pitch\r\n // const ellipsoid = v.scene.globe?.ellipsoid ?? C.Ellipsoid.WGS84;\r\n // const forward = new C.Cartesian3();\r\n // const up = new C.Cartesian3();\r\n // const right = new C.Cartesian3();\r\n\r\n // // Create rotation matrix from HPR\r\n // const hpr = new C.HeadingPitchRoll(h, p, r);\r\n // const orientation = C.Transforms.headingPitchRollQuaternion(cartesian, hpr, ellipsoid);\r\n // const rotationMatrix = C.Matrix3.fromQuaternion(orientation);\r\n\r\n // Get camera direction vectors\r\n // C.Matrix3.getColumn(rotationMatrix, 0, right);\r\n // C.Matrix3.getColumn(rotationMatrix, 2, forward);\r\n // C.Matrix3.negate(forward, forward); // Cesium camera looks down -Z\r\n // C.Matrix3.getColumn(rotationMatrix, 1, up);\r\n\r\n // Set camera position and orientation directly\r\n // v.camera.position = cartesian;\r\n // v.camera.direction = forward;\r\n // v.camera.up = up;\r\n // v.camera.right = right;\r\n // } catch (e) {\r\n // // Fallback to simpler setView if the above fails\r\n // try {\r\n // v.camera.setView({\r\n // destination: cartesian,\r\n // orientation: { heading: h, pitch: p, roll: r },\r\n // });\r\n // } catch {}\r\n }\r\n\r\n // // Recompute footprint using overlay scene\r\n // try {\r\n // const scene: any = v.scene;\r\n // const w = scene?.canvas?.width ?? 256;\r\n // const hgt = scene?.canvas?.height ?? 144;\r\n // const corners = [\r\n // new C.Cartesian2(2, 2),\r\n // new C.Cartesian2(w - 2, 2),\r\n // new C.Cartesian2(w - 2, hgt - 2),\r\n // new C.Cartesian2(2, hgt - 2),\r\n // ];\r\n // const pts: any[] = [];\r\n // for (const c of corners) {\r\n // const ray = v.camera.getPickRay(c);\r\n // if (!ray) continue;\r\n // const hit = scene.globe?.pick?.(ray, scene);\r\n // if (hit) pts.push(hit);\r\n // }\r\n // // this._footprintPositions = pts.length >= 3 ? pts : undefined;\r\n // v.scene?.requestRender?.();\r\n // (this.mainViewer.scene as any)?.requestRender?.();\r\n // } catch {}\r\n // }\r\n\r\n /**\r\n * 设置 FOV(如果启用了 FOV 控制器)\r\n */\r\n setFOV(fov: number): void {\r\n this.currentFOV = fov;\r\n if (this.fovController) {\r\n this.fovController.setFOV(fov);\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前 FOV\r\n */\r\n getFOV(): number {\r\n return this.currentFOV;\r\n }\r\n\r\n /**\r\n * 显示 FOV 控制器\r\n */\r\n showFOVController(): void {\r\n if (this.fovController) {\r\n this.fovController.show();\r\n } else if (this.opts.fovController !== false) {\r\n this.ensureFOVController();\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏 FOV 控制器\r\n */\r\n hideFOVController(): void {\r\n if (this.fovController) {\r\n this.fovController.hide();\r\n }\r\n }\r\n\r\n /**\r\n * 显示预览窗口\r\n */\r\n show(): void {\r\n if (this.containerEl) {\r\n this.containerEl.style.display = 'block';\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏预览窗口\r\n */\r\n hide(): void {\r\n if (this.containerEl) {\r\n this.containerEl.style.display = 'none';\r\n }\r\n }\r\n\r\n /**\r\n * 获取预览 viewer 实例\r\n */\r\n getOverlayViewer(): Cesium.Viewer | undefined {\r\n return this.overlayViewer;\r\n }\r\n\r\n /**\r\n * 销毁预览窗口,释放所有资源\r\n */\r\n destroy(): void {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n\r\n // 销毁 FOV 控制器\r\n try {\r\n this.fovController?.destroy();\r\n } catch {}\r\n this.fovController = undefined;\r\n\r\n // 销毁 footprint 实体\r\n this.footprintEntity = undefined;\r\n\r\n // 清理 3D Tiles\r\n try {\r\n this.tilesets.forEach((tileset) => {\r\n try {\r\n (this.overlayViewer as any)?.scene?.primitives?.remove?.(tileset);\r\n } catch {}\r\n });\r\n this.tilesets.clear();\r\n } catch {}\r\n\r\n // 销毁 overlay viewer\r\n try {\r\n (this.overlayViewer as any)?.destroy?.();\r\n } catch {}\r\n this.overlayViewer = undefined;\r\n\r\n // 移除容器元素\r\n try {\r\n if (this.containerEl && this.containerEl.parentElement) {\r\n this.containerEl.parentElement.removeChild(this.containerEl);\r\n }\r\n } catch {}\r\n this.containerEl = undefined;\r\n }\r\n}\r\n","/**\r\n * 视锥体/金字塔可视化工具\r\n * - 用多段线与多边形在 Cesium 中绘制一个“相机视锥体”样式的方锥体\r\n * - 支持静态一次性绘制(showAt)与基于 CallbackProperty 的动态绘制(showAtDynamic)\r\n * - 几何计算集中在 computeFrustumGeometry,避免重复代码\r\n */\r\nimport type * as Cesium from 'cesium';\r\n\r\nexport interface FrustumPyramidOptions {\r\n /** 顶点到底面中心的距离(米) */\r\n length?: number;\r\n /** 水平视场角(度,整角) */\r\n fov?: number;\r\n /** 底面宽高比(width:height),默认 4:3 模拟相机画幅 */\r\n aspectRatio?: number;\r\n /** 边线颜色 */\r\n color?: Cesium.Color;\r\n /** 面填充颜色(alpha 由 fillAlpha 决定或自身附带) */\r\n fillColor?: Cesium.Color;\r\n /** 面透明度 [0..1],默认 0.25 */\r\n fillAlpha?: number;\r\n /** 边线宽度(像素) */\r\n width?: number;\r\n /** 是否打印上下左右半视场角(度)变化日志(默认关闭) */\r\n logAngles?: boolean;\r\n /** 日志节流间隔(毫秒),仅在 logAngles=true 时生效,默认 250ms */\r\n logThrottleMs?: number;\r\n}\r\n\r\n/**\r\n * 在给定姿态处渲染一个方锥体视锥(边线 + 面填充 + 垂直箭头)\r\n * - 通过 Entity 层级维护几何,支持重复更新与清理\r\n */\r\nexport class FrustumPyramid {\r\n /** 4 条边线实体(apex->四个角) */\r\n private edgeEntities: Cesium.Entity[] = [];\r\n /** 底面填充多边形实体(可选显示) */\r\n private baseFillEntity?: Cesium.Entity;\r\n /** 4 个侧面三角形实体(apex->ci->c(i+1)) */\r\n private faceEntities: Cesium.Entity[] = [];\r\n /** 顶点到底面中心的垂直“箭头线”(用于指示方向/深度) */\r\n private verticalLineEntity?: Cesium.Entity;\r\n private destroyed = false;\r\n /** 上次记录的半视场角(度),用于判定变化 */\r\n private lastAngles?: { left: number; right: number; up: number; down: number };\r\n /** 上次打印日志的时间戳(ms) */\r\n private lastLogAt = 0;\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private layer: Cesium.CustomDataSource,\r\n private opts: FrustumPyramidOptions = {},\r\n ) {}\r\n\r\n /**\r\n * 计算视锥体几何(顶点、四个底面角点与底面中心)\r\n * - 先根据 HPR 在 apex 处构造模型矩阵,取 forward(列1)方向\r\n * - 用 apex 的地表法线作为世界 up,重建无滚转的 right/up,从而避免 pitch 时的视觉侧倾\r\n * - 基于 fov 与 aspectRatio 求得底面半宽半高,沿 forward 推进 length 得到 baseCenter\r\n */\r\n private computeFrustumGeometry(\r\n apex: Cesium.Cartesian3,\r\n headingDeg: number,\r\n pitchDeg: number,\r\n rollDeg: number,\r\n fovDeg: number,\r\n length: number,\r\n ): { apex: Cesium.Cartesian3; corners: Cesium.Cartesian3[]; baseCenter: Cesium.Cartesian3 } {\r\n const C: any = this.CesiumNS as any;\r\n const fov = Math.max(1, Math.min(120, fovDeg ?? this.opts.fov ?? 50));\r\n const aspectRatio = this.opts.aspectRatio ?? 4 / 3;\r\n const halfFovH = C.Math.toRadians(fov / 2);\r\n const halfWidth = Math.tan(halfFovH) * length;\r\n const halfHeight = halfWidth / aspectRatio;\r\n\r\n // 使用 ENU 基向量 + heading/pitch 直接构造“朝向”向量(忽略 roll)\r\n // 这样可以明确保证 pitch 改变会体现在 forward 上,避免列索引/坐标定义差异导致的误判\r\n const enu = C.Transforms.eastNorthUpToFixedFrame(apex);\r\n const eastCol = C.Matrix4.getColumn(enu, 0, new C.Cartesian4());\r\n const northCol = C.Matrix4.getColumn(enu, 1, new C.Cartesian4());\r\n const upCol = C.Matrix4.getColumn(enu, 2, new C.Cartesian4());\r\n const east3 = new C.Cartesian3(eastCol.x, eastCol.y, eastCol.z);\r\n const north3 = new C.Cartesian3(northCol.x, northCol.y, northCol.z);\r\n const up3 = new C.Cartesian3(upCol.x, upCol.y, upCol.z);\r\n const hr = C.Math.toRadians(headingDeg ?? 0);\r\n const pr = C.Math.toRadians(pitchDeg ?? 0);\r\n // 水平分量:在 ENU 平面内由 heading 确定(heading=0 指向 north3)\r\n const horiz = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(east3, Math.sin(hr), new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(north3, Math.cos(hr), new C.Cartesian3()),\r\n new C.Cartesian3(),\r\n );\r\n const horizNorm = C.Cartesian3.normalize(horiz, new C.Cartesian3());\r\n // 前向:水平分量按 cos(pitch) 缩放 + up 分量按 sin(pitch) 叠加\r\n let forward = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(horizNorm, Math.cos(pr), new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(up3, Math.sin(pr), new C.Cartesian3()),\r\n new C.Cartesian3(),\r\n );\r\n forward = C.Cartesian3.normalize(forward, forward);\r\n\r\n // 基于 apex 位置求地表法线,作为世界上方向参考(worldUp)\r\n const worldUp = C.Ellipsoid.WGS84.geodeticSurfaceNormal(apex, new C.Cartesian3());\r\n\r\n // 计算“去滚转”的 right = normalize( forward × worldUp )\r\n let right = C.Cartesian3.cross(forward, worldUp, new C.Cartesian3());\r\n let magRight = C.Cartesian3.magnitude(right);\r\n if (magRight < 1e-6) {\r\n // 当 forward 近似与 worldUp 平行(直上/直下)时的退化处理:\r\n // 选用固定参考轴(全球 X 轴)重新 cross。\r\n const fallback = new C.Cartesian3(1, 0, 0);\r\n right = C.Cartesian3.cross(forward, fallback, new C.Cartesian3());\r\n magRight = C.Cartesian3.magnitude(right);\r\n }\r\n if (magRight > 0) right = C.Cartesian3.multiplyByScalar(right, 1 / magRight, right);\r\n\r\n // 重新构造 upNoRoll = normalize( right × forward ),保证正交与“无侧倾”\r\n let up = C.Cartesian3.cross(right, forward, new C.Cartesian3());\r\n const magUp = C.Cartesian3.magnitude(up);\r\n if (magUp > 0) up = C.Cartesian3.multiplyByScalar(up, 1 / magUp, up);\r\n\r\n // 计算 baseCenter:沿 forward 方向推进 length(包含 pitch 分量)\r\n const baseCenter = C.Cartesian3.add(\r\n apex,\r\n C.Cartesian3.multiplyByScalar(forward, length, new C.Cartesian3()),\r\n new C.Cartesian3(),\r\n );\r\n\r\n // 根据“去滚转”的 right/up 构建底面矩形的偏移向量\r\n const rOff = C.Cartesian3.multiplyByScalar(right, halfWidth, new C.Cartesian3());\r\n const uOff = C.Cartesian3.multiplyByScalar(up, halfHeight, new C.Cartesian3());\r\n\r\n const c0 = C.Cartesian3.add(\r\n C.Cartesian3.add(baseCenter, rOff, new C.Cartesian3()),\r\n uOff,\r\n new C.Cartesian3(),\r\n );\r\n const c1 = C.Cartesian3.add(\r\n C.Cartesian3.subtract(baseCenter, rOff, new C.Cartesian3()),\r\n uOff,\r\n new C.Cartesian3(),\r\n );\r\n const c2 = C.Cartesian3.subtract(\r\n C.Cartesian3.subtract(baseCenter, rOff, new C.Cartesian3()),\r\n uOff,\r\n new C.Cartesian3(),\r\n );\r\n const c3 = C.Cartesian3.subtract(\r\n C.Cartesian3.add(baseCenter, rOff, new C.Cartesian3()),\r\n uOff,\r\n new C.Cartesian3(),\r\n );\r\n\r\n return { apex, corners: [c0, c1, c2, c3], baseCenter };\r\n }\r\n\r\n /**\r\n * 若启用日志,则在“左右/上下对应的世界角度”变化时打印一条日志。\r\n * - 左右角度:以 heading 为中心的 ±(FOV/2)\r\n * - 上下角度:以 pitch 为中心的 ±(verticalHalfFov)\r\n * - 采用节流与变化判定:小于 logThrottleMs 的间隔或角度未变时不重复打印\r\n */\r\n private logAnglesIfChanged(\r\n fovDeg: number,\r\n aspectRatio: number,\r\n headingDeg: number = 0,\r\n pitchDeg: number = 0,\r\n ) {\r\n if (!this.opts.logAngles) return;\r\n const now = Date.now();\r\n const throttle = this.opts.logThrottleMs ?? 250;\r\n if (now - this.lastLogAt < throttle) return;\r\n\r\n const clampedFov = Math.max(1, Math.min(120, fovDeg));\r\n const ar = aspectRatio > 0 ? aspectRatio : 4 / 3;\r\n const halfH = clampedFov / 2; // 左右半视场角(度)\r\n const halfV = (180 / Math.PI) * Math.atan(Math.tan((Math.PI / 180) * halfH) / ar); // 上下半视场角(度)\r\n // 基于当前 heading/pitch 的世界角度\r\n const next = {\r\n left: headingDeg - halfH,\r\n right: headingDeg + halfH,\r\n up: pitchDeg + halfV,\r\n down: pitchDeg - halfV,\r\n };\r\n\r\n const prev = this.lastAngles;\r\n const changed =\r\n !prev ||\r\n Math.abs(prev.left - next.left) > 1e-4 ||\r\n Math.abs(prev.right - next.right) > 1e-4 ||\r\n Math.abs(prev.up - next.up) > 1e-4 ||\r\n Math.abs(prev.down - next.down) > 1e-4;\r\n if (!changed) return;\r\n\r\n this.lastAngles = next;\r\n this.lastLogAt = now;\r\n try {\r\n // 示例输出:FOV=50, AR=1.333 => L/R=±25.00°, U/D=±18.92°\r\n console.log(\r\n '[FrustumPyramid] 角度更新',\r\n `FOV=${clampedFov.toFixed(2)}°`,\r\n `AR=${ar.toFixed(3)}`,\r\n `Heading=${headingDeg.toFixed(2)}°`,\r\n `Pitch=${pitchDeg.toFixed(2)}°`,\r\n `Left=${next.left.toFixed(2)}°`,\r\n `Right=${next.right.toFixed(2)}°`,\r\n `Up=${next.up.toFixed(2)}°`,\r\n `Down=${next.down.toFixed(2)}°`,\r\n );\r\n } catch {}\r\n }\r\n\r\n /**\r\n * 确保实体已创建:\r\n * - 4 条边线、4 个侧面三角形、1 个底面填充、多一条垂直箭头线\r\n * - 若已存在则直接返回,避免重复创建\r\n */\r\n private ensureEntities(edgeColor: Cesium.Color, width: number, fillColor: Cesium.Color) {\r\n const C: any = this.CesiumNS as any;\r\n if (\r\n this.edgeEntities.length === 4 &&\r\n this.baseFillEntity &&\r\n this.faceEntities.length === 4 &&\r\n this.verticalLineEntity\r\n )\r\n return;\r\n // 底面填充多边形(默认隐藏,可设置描边)\r\n this.baseFillEntity = (this.layer.entities as any).add({\r\n polygon: {\r\n show: false,\r\n hierarchy: new C.PolygonHierarchy([]),\r\n material: fillColor,\r\n perPositionHeight: true,\r\n outline: true,\r\n outlineColor: edgeColor,\r\n outlineWidth: width,\r\n },\r\n properties: { _type: 'frustum-base-fill' },\r\n } as any);\r\n this.edgeEntities = [];\r\n for (let i = 0; i < 4; i++) {\r\n const e = (this.layer.entities as any).add({\r\n polyline: { positions: [], width, material: edgeColor, clampToGround: false },\r\n properties: { _type: 'frustum-edge', _edgeIndex: i },\r\n } as any);\r\n this.edgeEntities.push(e);\r\n }\r\n // 侧面(4 个三角形)\r\n this.faceEntities = [];\r\n for (let i = 0; i < 4; i++) {\r\n const f = (this.layer.entities as any).add({\r\n polygon: {\r\n show: false,\r\n hierarchy: new C.PolygonHierarchy([]),\r\n material: fillColor,\r\n perPositionHeight: true,\r\n outline: false,\r\n },\r\n properties: { _type: 'frustum-face', _faceIndex: i },\r\n } as any);\r\n this.faceEntities.push(f);\r\n }\r\n // 从顶点指向底面中心的“垂直箭头线”(用于强调深度/方向)\r\n if (!this.verticalLineEntity) {\r\n this.verticalLineEntity = (this.layer.entities as any).add({\r\n polyline: {\r\n show: true,\r\n positions: [],\r\n width: width * 1.5, // Slightly wider for visibility\r\n material: new C.PolylineArrowMaterialProperty(edgeColor),\r\n clampToGround: false,\r\n arcType: C.ArcType.NONE,\r\n },\r\n properties: { _type: 'frustum-vertical-line' },\r\n } as any);\r\n }\r\n }\r\n\r\n /**\r\n * 静态更新:在给定姿态一次性计算并更新几何\r\n * - 适合低频率更新或仅渲染一次的场景\r\n */\r\n showAt(\r\n apex: Cesium.Cartesian3,\r\n headingDeg: number,\r\n pitchDeg: number = 0,\r\n rollDeg: number = 0,\r\n fovDeg?: number,\r\n lengthOverride?: number,\r\n ) {\r\n if (this.destroyed) return;\r\n const C: any = this.CesiumNS as any;\r\n const length = Math.max(1, lengthOverride ?? this.opts.length ?? 1000);\r\n\r\n const lakeEdge: Cesium.Color =\r\n (this.opts.color as any) ?? (C.Color.fromCssColorString('#1e90ff') as any);\r\n const alpha = this.opts.fillAlpha ?? 0.25;\r\n const lakeFill: Cesium.Color = (\r\n (this.opts.fillColor as any) ?? (C.Color.fromCssColorString('#1e90ff') as any)\r\n ).withAlpha(alpha);\r\n const width = this.opts.width ?? 3;\r\n\r\n this.ensureEntities(lakeEdge, width, lakeFill);\r\n\r\n // 计算并日志输出半视场角(如启用)\r\n const effectiveFov = Math.max(1, Math.min(120, fovDeg ?? this.opts.fov ?? 50));\r\n const aspectRatio = this.opts.aspectRatio ?? 4 / 3;\r\n this.logAnglesIfChanged(effectiveFov, aspectRatio, headingDeg, pitchDeg);\r\n\r\n // 使用集中计算函数获取方锥体几何\r\n const { apex: apexPos, corners, baseCenter } = this.computeFrustumGeometry(\r\n apex,\r\n headingDeg,\r\n pitchDeg,\r\n rollDeg,\r\n effectiveFov,\r\n length,\r\n );\r\n\r\n try {\r\n (this.baseFillEntity as any).polygon.hierarchy = new C.PolygonHierarchy(corners);\r\n (this.baseFillEntity as any).polygon.show = true;\r\n } catch {}\r\n // Update 4 edges\r\n for (let i = 0; i < this.edgeEntities.length; i++) {\r\n try {\r\n (this.edgeEntities[i] as any).polyline.positions = [apexPos, corners[i]];\r\n } catch {}\r\n }\r\n // 更新“垂直箭头线”:从 apex 指向 baseCenter(箭头朝向最后一个点)\r\n if (this.verticalLineEntity) {\r\n try {\r\n // Order matters: arrow points to the last position (baseCenter)\r\n (this.verticalLineEntity as any).polyline.positions = [apexPos, baseCenter];\r\n (this.verticalLineEntity as any).polyline.show = true;\r\n } catch {}\r\n }\r\n // 更新 4 个侧面三角形(apex -> ci -> c(i+1))\r\n for (let i = 0; i < this.faceEntities.length; i++) {\r\n const ci = corners[i];\r\n const cj = corners[(i + 1) % 4];\r\n try {\r\n (this.faceEntities[i] as any).polygon.hierarchy = new C.PolygonHierarchy([apexPos, ci, cj]);\r\n (this.faceEntities[i] as any).polygon.show = true;\r\n } catch {}\r\n }\r\n }\r\n\r\n /**\r\n * 动态更新:通过回调获取实时姿态,由 Cesium 在每帧调用 CallbackProperty 自动评估\r\n * - 适合高频率变化(相机/游标联动)\r\n */\r\n showAtDynamic(\r\n apexCallback: () => Cesium.Cartesian3,\r\n headingDegCallback: () => number,\r\n pitchDegCallback: () => number,\r\n rollDegCallback: () => number,\r\n fovDegCallback: () => number,\r\n lengthCallback: () => number,\r\n ) {\r\n if (this.destroyed) return;\r\n const C: any = this.CesiumNS as any;\r\n\r\n const lakeEdge: Cesium.Color =\r\n (this.opts.color as any) ?? (C.Color.fromCssColorString('#1e90ff') as any);\r\n const alpha = this.opts.fillAlpha ?? 0.25;\r\n const lakeFill: Cesium.Color = (\r\n (this.opts.fillColor as any) ?? (C.Color.fromCssColorString('#1e90ff') as any)\r\n ).withAlpha(alpha);\r\n const width = this.opts.width ?? 3;\r\n\r\n this.ensureEntities(lakeEdge, width, lakeFill);\r\n\r\n // 统一几何计算:回调计算当前 apex/corners/baseCenter,并(可选)打印半视场角变化日志\r\n const computeCorners = () => {\r\n const apex = apexCallback();\r\n const heading = headingDegCallback();\r\n const pitch = pitchDegCallback();\r\n const roll = rollDegCallback();\r\n const fov = Math.max(1, Math.min(120, fovDegCallback()));\r\n const ar = this.opts.aspectRatio ?? 4 / 3;\r\n this.logAnglesIfChanged(fov, ar, heading, pitch);\r\n return this.computeFrustumGeometry(apex, heading, pitch, roll, fov, lengthCallback());\r\n };\r\n\r\n // Update base fill with CallbackProperty\r\n try {\r\n (this.baseFillEntity as any).polygon.hierarchy = new C.CallbackProperty(() => {\r\n const { corners } = computeCorners();\r\n return new C.PolygonHierarchy(corners);\r\n }, false);\r\n (this.baseFillEntity as any).polygon.show = true;\r\n } catch {}\r\n\r\n // 更新 4 条边线(CallbackProperty)\r\n for (let i = 0; i < this.edgeEntities.length; i++) {\r\n try {\r\n (this.edgeEntities[i] as any).polyline.positions = new C.CallbackProperty(() => {\r\n const { apex, corners } = computeCorners();\r\n return [apex, corners[i]];\r\n }, false);\r\n } catch {}\r\n }\r\n\r\n // 更新 4 个侧面三角形(CallbackProperty)\r\n for (let i = 0; i < this.faceEntities.length; i++) {\r\n try {\r\n (this.faceEntities[i] as any).polygon.hierarchy = new C.CallbackProperty(() => {\r\n const { apex, corners } = computeCorners();\r\n const ci = corners[i];\r\n const cj = corners[(i + 1) % 4];\r\n return new C.PolygonHierarchy([apex, ci, cj]);\r\n }, false);\r\n (this.faceEntities[i] as any).polygon.show = true;\r\n } catch {}\r\n }\r\n\r\n // 更新“垂直箭头线”(CallbackProperty)\r\n if (this.verticalLineEntity) {\r\n try {\r\n (this.verticalLineEntity as any).polyline.positions = new C.CallbackProperty(() => {\r\n const { apex, baseCenter } = computeCorners();\r\n return [apex, baseCenter];\r\n }, false);\r\n (this.verticalLineEntity as any).polyline.show = true;\r\n } catch {}\r\n }\r\n }\r\n\r\n /**\r\n * 销毁:移除所有已创建的实体并释放引用\r\n * - 与 clear 的区别:destroy 彻底删除实体;clear 仅隐藏/清空坐标以复用\r\n */\r\n destroy() {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n try {\r\n if (this.baseFillEntity) (this.layer.entities as any).remove(this.baseFillEntity);\r\n } catch {}\r\n this.baseFillEntity = undefined;\r\n try {\r\n for (const e of this.edgeEntities) (this.layer.entities as any).remove(e);\r\n } catch {}\r\n this.edgeEntities = [];\r\n try {\r\n for (const f of this.faceEntities) (this.layer.entities as any).remove(f);\r\n } catch {}\r\n this.faceEntities = [];\r\n try {\r\n if (this.verticalLineEntity) (this.layer.entities as any).remove(this.verticalLineEntity);\r\n } catch {}\r\n this.verticalLineEntity = undefined;\r\n }\r\n\r\n /**\r\n * 清理:隐藏几何但不销毁实例(保留复用能力)\r\n */\r\n clear() {\r\n if (this.destroyed) return;\r\n try {\r\n if (this.baseFillEntity) (this.baseFillEntity as any).polygon.show = false;\r\n } catch {}\r\n try {\r\n for (const f of this.faceEntities) (f as any).polygon.show = false;\r\n } catch {}\r\n try {\r\n for (const e of this.edgeEntities) (e as any).polyline.positions = [];\r\n } catch {}\r\n try {\r\n if (this.verticalLineEntity) (this.verticalLineEntity as any).polyline.positions = [];\r\n } catch {}\r\n }\r\n}\r\n","/**\r\n * 轻量级“飞机/无人机”游标(键盘控制)\r\n * - 维护当前位置与姿态(heading/pitch/roll),并通过回调通知宿主\r\n * - 支持按住按键连续移动/旋转(基于 requestAnimationFrame 的更新循环)\r\n * - 提供一个由三角面组成的可视化“金字塔箭头”与视锥体、海拔标记\r\n * - 与全局相机事件总线同步 FOV(视场角),动态更新视锥体\r\n */\r\nimport type * as Cesium from 'cesium';\r\nimport { FrustumPyramid } from './FrustumPyramid';\r\nimport { HeightMarker } from './HeightMarker';\r\nimport { globalCameraEventBus } from '../../utils/events';\r\nimport droneModel from '../../assets/wurenji.glb';\r\n\r\nexport interface AirplaneCursorOptions {\r\n /**\r\n * 姿态(位置 + 朝向)变化时的回调\r\n * - 建议在此回调中更新外部 UI、路径点预览、或记录轨迹\r\n */\r\n onPose?: (pose: {\r\n position: Cesium.Cartesian3;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n }) => void;\r\n /**\r\n * 请求宿主在当前姿态插入一个顶点(按下 Enter 触发)\r\n * - insertAt: 顶点插入位置,当前固定为 -1(末尾/默认规则交由宿主处理)\r\n */\r\n onAddVertex?: (pose: {\r\n position: Cesium.Cartesian3;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n insertAt: number;\r\n }) => void;\r\n /** 键盘位移步长(单位:米) */\r\n stepMeters?: number;\r\n /** 航向/俯仰/横滚的角度增量(单位:度,常速) */\r\n angleStepDeg?: number;\r\n /** 按住 Shift 时的加速倍率(位移与角度均受影响) */\r\n fastFactor?: number;\r\n /** 游标可视化颜色(部分用于视锥体) */\r\n color?: Cesium.Color;\r\n /** 视锥体 FOV(度) */\r\n fovDeg?: number;\r\n /** 最小高度(米),默认 0,游标不能低于此高度 */\r\n minHeight?: number;\r\n}\r\n\r\n/** Lightweight airplane (UAV) cursor controlled by keyboard; notifies host of pose + add-vertex intent. */\r\nexport class AirplaneCursor {\r\n /** 是否已销毁,避免重复操作 */\r\n private destroyed = false;\r\n /** 主实体引用(为兼容右键交互而保留,实际显示由多个三角面实体组成) */\r\n private entity?: Cesium.Entity;\r\n /** 键盘按下事件监听器 */\r\n private keyListener?: (e: KeyboardEvent) => void;\r\n /** 键盘抬起事件监听器 */\r\n private keyupListener?: (e: KeyboardEvent) => void;\r\n /** 当前姿态:位置 + 航向/俯仰/横滚(单位:度) */\r\n private pose: { position: Cesium.Cartesian3; heading: number; pitch: number; roll: number };\r\n /** 位移步长(米) */\r\n private step: number;\r\n /** 角度步长(度) */\r\n private angleStep: number;\r\n /** 加速倍率(按住 Shift 生效) */\r\n private fastFactor: number;\r\n /** 最小高度(米) */\r\n private minHeight: number;\r\n /** 外部传入的行为配置与回调 */\r\n private opts: AirplaneCursorOptions;\r\n // 使用内联的 _FrustumPyramid\r\n private frustum?: FrustumPyramid;\r\n /** 海拔标记(显示当前高度) */\r\n private heightMarker?: HeightMarker;\r\n // 记录当前被按下且尚未释放的按键(用于连续更新)\r\n private keysPressed = new Set<string>();\r\n private updateLoopRunning = false;\r\n // 当前 FOV 值(来自外部相机事件总线),用于动态更新视锥体\r\n private currentFOV: number;\r\n // 无人机模型实体\r\n private modelEntity?: Cesium.Entity;\r\n // 存储金字塔的所有面实体,便于拾取/删除\r\n private pyramidEntities: any[] = [];\r\n // 临时数据源,用于存储金字塔实体(避免污染宿主图层)\r\n private pyramidLayer?: any;\r\n // 缓存的缩放因子,仅在相机变化时更新\r\n private cachedScaleFactor = 1;\r\n // 相机变化事件监听器\r\n private cameraChangedListener?: Cesium.Event.RemoveCallback;\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Cesium.Viewer,\r\n startPosition: Cesium.Cartesian3,\r\n opts: AirplaneCursorOptions = {},\r\n ) {\r\n /**\r\n * 构造参数说明:\r\n * - CesiumNS: 运行时传入的 Cesium 命名空间(避免直接依赖全局)\r\n * - viewer: Cesium.Viewer 实例,用于添加数据源与请求渲染\r\n * - startPosition: 初始位置(Cartesian3)\r\n * - opts: 选项与回调(见 AirplaneCursorOptions)\r\n */\r\n const C: any = this.CesiumNS as any;\r\n this.opts = opts;\r\n this.pose = { position: startPosition, heading: 0, pitch: -10, roll: 0 };\r\n this.step = opts.stepMeters ?? 2;\r\n this.angleStep = opts.angleStepDeg ?? 1;\r\n this.fastFactor = opts.fastFactor ?? 5;\r\n this.minHeight = opts.minHeight ?? 0;\r\n this.currentFOV = opts.fovDeg ?? 50; // 初始化当前 FOV\r\n this.ensureEntity(opts.color ?? C.Color.CYAN.withAlpha(0.9));\r\n // frustum 初始化延迟到第一次 updateFrustum\r\n this.attachKeyboard(opts);\r\n // 监听全局 FOV 变化事件\r\n this.setupFOVListener();\r\n }\r\n\r\n private ensureEntity(color: any) {\r\n // 确保构建用于表示游标的实体集合(仅初始化一次)\r\n if (this.entity) return;\r\n const C: any = this.CesiumNS as any;\r\n \r\n // Create a temporary layer for model entity if not exists\r\n if (!this.pyramidLayer) {\r\n this.pyramidLayer = new C.CustomDataSource('AirplaneCursorModel');\r\n this.viewer.dataSources.add(this.pyramidLayer);\r\n }\r\n \r\n // 模型参数\r\n const modelHeadingOffset = 270; // 模型初始朝向偏移(度),根据模型调整\r\n const baseVerticalOffset = 10; // 基础垂直偏移(米)\r\n const baseForwardOffset = 5; // 基础前向偏移(米)\r\n const baseRightOffset = -9; // 基础右向偏移(米)\r\n \r\n // 缩放参数\r\n const baseScale = 0.15; // 基础缩放(初始大小)\r\n const minScale = 0.025; // 最小缩放\r\n const maxScale = 1.5; // 最大缩放\r\n const referenceDistance = 800; // 参考距离(米),在此距离时使用基础缩放\r\n \r\n // 计算缩放比例(基于相机距离)\r\n const computeScaleFactor = () => {\r\n try {\r\n const cameraPos = this.viewer.camera.positionWC;\r\n const modelPos = this.pose.position;\r\n const distance = C.Cartesian3.distance(cameraPos, modelPos);\r\n // 距离近时缩小,距离远时放大\r\n const rawScale = baseScale * (distance / referenceDistance);\r\n const clampedScale = Math.max(minScale, Math.min(maxScale, rawScale));\r\n return clampedScale / baseScale;\r\n } catch {\r\n return 1;\r\n }\r\n };\r\n \r\n // 初始化缩放因子\r\n this.cachedScaleFactor = computeScaleFactor();\r\n \r\n // 监听相机变化事件,更新缩放因子\r\n this.cameraChangedListener = this.viewer.camera.changed.addEventListener(() => {\r\n this.cachedScaleFactor = computeScaleFactor();\r\n this.viewer.scene?.requestRender?.();\r\n });\r\n \r\n // 使用无人机 glTF 模型\r\n this.modelEntity = this.pyramidLayer.entities.add({\r\n position: new C.CallbackProperty(() => {\r\n // 应用偏移,让模型中心与指示点对齐\r\n // 偏移量需要考虑 heading 和 pitch,并随缩放同步变化\r\n const pos = this.pose.position;\r\n const headingRad = C.Math.toRadians(this.pose.heading);\r\n const pitchRad = C.Math.toRadians(this.pose.pitch);\r\n const scaleFactor = this.cachedScaleFactor;\r\n \r\n // 偏移量随缩放同步变化\r\n const modelVerticalOffset = baseVerticalOffset * scaleFactor;\r\n const modelForwardOffset = baseForwardOffset * scaleFactor;\r\n const modelRightOffset = baseRightOffset * scaleFactor;\r\n \r\n // 计算 ENU 坐标系\r\n const enu = C.Transforms.eastNorthUpToFixedFrame(pos);\r\n const east = C.Cartesian3.fromCartesian4(C.Matrix4.getColumn(enu, 0, new C.Cartesian4()));\r\n const north = C.Cartesian3.fromCartesian4(C.Matrix4.getColumn(enu, 1, new C.Cartesian4()));\r\n const up = C.Cartesian3.fromCartesian4(C.Matrix4.getColumn(enu, 2, new C.Cartesian4()));\r\n \r\n // 根据 heading 计算水平方向\r\n const horizForward = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(east, Math.sin(headingRad), new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(north, Math.cos(headingRad), new C.Cartesian3()),\r\n new C.Cartesian3()\r\n );\r\n const right = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(east, Math.cos(headingRad), new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(north, -Math.sin(headingRad), new C.Cartesian3()),\r\n new C.Cartesian3()\r\n );\r\n \r\n // 根据 pitch 调整前向和上向(让偏移随 pitch 旋转)\r\n const forward = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(horizForward, Math.cos(pitchRad), new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(up, Math.sin(pitchRad), new C.Cartesian3()),\r\n new C.Cartesian3()\r\n );\r\n const upRotated = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(horizForward, -Math.sin(pitchRad), new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(up, Math.cos(pitchRad), new C.Cartesian3()),\r\n new C.Cartesian3()\r\n );\r\n \r\n // 应用偏移(随 heading、pitch 和缩放一起变化)\r\n let result = C.Cartesian3.clone(pos);\r\n result = C.Cartesian3.add(result, C.Cartesian3.multiplyByScalar(forward, modelForwardOffset, new C.Cartesian3()), result);\r\n result = C.Cartesian3.add(result, C.Cartesian3.multiplyByScalar(right, modelRightOffset, new C.Cartesian3()), result);\r\n result = C.Cartesian3.add(result, C.Cartesian3.multiplyByScalar(upRotated, modelVerticalOffset, new C.Cartesian3()), result);\r\n \r\n return result;\r\n }, false),\r\n orientation: new C.CallbackProperty(() => {\r\n // 计算基于 heading/pitch/roll 的方向四元数,加上模型朝向偏移\r\n const hpr = new C.HeadingPitchRoll(\r\n C.Math.toRadians(this.pose.heading + modelHeadingOffset),\r\n C.Math.toRadians(this.pose.pitch),\r\n C.Math.toRadians(this.pose.roll)\r\n );\r\n return C.Transforms.headingPitchRollQuaternion(this.pose.position, hpr);\r\n }, false),\r\n model: {\r\n uri: droneModel,\r\n scale: new C.CallbackProperty(() => {\r\n return baseScale * this.cachedScaleFactor;\r\n }, false),\r\n minimumPixelSize: 24,\r\n silhouetteColor: C.Color.CYAN,\r\n silhouetteSize: 1.0,\r\n },\r\n properties: { _type: 'airplane-cursor' },\r\n } as any);\r\n \r\n // Store reference for compatibility\r\n this.entity = this.modelEntity;\r\n this.pyramidEntities = [this.modelEntity];\r\n }\r\n\r\n // private computeHeadingLine(): Cesium.Cartesian3[] {\r\n // const C: any = this.CesiumNS as any;\r\n // const len = 15;\r\n // try {\r\n // const { position, heading } = this.pose;\r\n // const enu = C.Transforms.eastNorthUpToFixedFrame(position);\r\n // const east = C.Matrix4.getColumn(enu, 0, new C.Cartesian4());\r\n // const north = C.Matrix4.getColumn(enu, 1, new C.Cartesian4());\r\n // const e3 = new C.Cartesian3(east.x, east.y, east.z);\r\n // const n3 = new C.Cartesian3(north.x, north.y, north.z);\r\n // const hr = C.Math.toRadians(heading);\r\n // const dir = C.Cartesian3.add(\r\n // C.Cartesian3.multiplyByScalar(e3, Math.sin(hr) * len, new C.Cartesian3()),\r\n // C.Cartesian3.multiplyByScalar(n3, Math.cos(hr) * len, new C.Cartesian3()),\r\n // new C.Cartesian3(),\r\n // );\r\n // const end = C.Cartesian3.add(position, dir, new C.Cartesian3());\r\n // return [position, end];\r\n // } catch {\r\n // return [this.pose.position, this.pose.position];\r\n // }\r\n // }\r\n\r\n // billboard icon removed; 3D arrow polygon used instead\r\n\r\n /**\r\n * 注册键盘控制:\r\n * - 移动:W/S(前/后)、A/D(左/右)、Z/C(上/下)\r\n * - 旋转:Q/E(航向左/右)、I/K(俯仰上/下)、U/O(横滚左/右)\r\n * - 添加:Enter(请求宿主添加顶点)\r\n * - 加速:按住 Shift(位移与角度步长乘以 fastFactor)\r\n *\r\n * 设计要点:按键按下只记录到集合,真正更新在 RAF 循环中完成,避免频繁处理 keydown 事件。\r\n */\r\n private attachKeyboard(opts: AirplaneCursorOptions) {\r\n const keyHandler = (ev: KeyboardEvent) => {\r\n if (this.destroyed) return;\r\n const key = ev.key.toLowerCase();\r\n \r\n // Handle Enter key immediately (single action)\r\n if (key === 'enter') {\r\n ev.preventDefault();\r\n this.opts?.onAddVertex?.({ ...this.pose, insertAt: -1 });\r\n return;\r\n }\r\n \r\n // For movement/rotation keys, just track pressed state\r\n // const movementKeys = ['w', 's', 'a', 'd', 'z', 'c', 'q', 'e', 'i', 'k', 'u', 'o'];\r\n const movementKeys = ['w', 's', 'a', 'd', 'z', 'c', 'q', 'e', 'i', 'k'];\r\n if (movementKeys.includes(key)) {\r\n ev.preventDefault();\r\n const wasEmpty = this.keysPressed.size === 0;\r\n this.keysPressed.add(key);\r\n \r\n // Start update loop if not already running\r\n if (wasEmpty && !this.updateLoopRunning) {\r\n this.startUpdateLoop();\r\n }\r\n }\r\n };\r\n \r\n const keyupHandler = (ev: KeyboardEvent) => {\r\n if (this.destroyed) return;\r\n const key = ev.key.toLowerCase();\r\n this.keysPressed.delete(key);\r\n };\r\n \r\n window.addEventListener('keydown', keyHandler, { passive: false } as any);\r\n window.addEventListener('keyup', keyupHandler, { passive: false } as any);\r\n this.keyListener = keyHandler;\r\n this.keyupListener = keyupHandler;\r\n }\r\n\r\n /**\r\n * 监听全局 FOV 变化事件,同步更新视锥体\r\n */\r\n private setupFOVListener() {\r\n // 订阅全局 FOV 变化事件,更新本地 currentFOV;视锥体通过动态回调实时读取\r\n globalCameraEventBus.onFOVChange.on((event) => {\r\n // 更新当前 FOV 值,showAtDynamic 的回调会自动使用新值\r\n this.currentFOV = event.fov;\r\n });\r\n }\r\n \r\n private startUpdateLoop() {\r\n // 启动基于 requestAnimationFrame 的更新循环,仅在存在被按下的按键时运行\r\n if (this.updateLoopRunning || this.destroyed) return;\r\n this.updateLoopRunning = true;\r\n \r\n const update = () => {\r\n if (this.destroyed || this.keysPressed.size === 0) {\r\n this.updateLoopRunning = false;\r\n return;\r\n }\r\n \r\n // Process all currently pressed keys\r\n const C: any = this.CesiumNS as any;\r\n const fast = this.keysPressed.has('shift') ? this.fastFactor : 1;\r\n let moved = false;\r\n const step = this.step * fast;\r\n const ang = this.angleStep * fast;\r\n const pose = this.pose;\r\n // 将当前位置构建 ENU(东-北-天)局部坐标系,便于做方向向量计算\r\n const enu = C.Transforms.eastNorthUpToFixedFrame(pose.position);\r\n const east = C.Matrix4.getColumn(enu, 0, new C.Cartesian4());\r\n const north = C.Matrix4.getColumn(enu, 1, new C.Cartesian4());\r\n const up = C.Matrix4.getColumn(enu, 2, new C.Cartesian4());\r\n const e3 = new C.Cartesian3(east.x, east.y, east.z);\r\n const n3 = new C.Cartesian3(north.x, north.y, north.z);\r\n const u3 = new C.Cartesian3(up.x, up.y, up.z);\r\n const addVec = (src: any, v: any) => C.Cartesian3.add(src, v, new C.Cartesian3());\r\n const setPos = (p: any) => (pose.position = p);\r\n\r\n if (this.keysPressed.has('w')) {\r\n // forward in heading plane\r\n const hr = C.Math.toRadians(pose.heading);\r\n const dir = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(e3, Math.sin(hr) * step, new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(n3, Math.cos(hr) * step, new C.Cartesian3()),\r\n new C.Cartesian3(),\r\n );\r\n setPos(addVec(pose.position, dir));\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('s')) {\r\n // backward\r\n const hr = C.Math.toRadians(pose.heading);\r\n const dir = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(e3, -Math.sin(hr) * step, new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(n3, -Math.cos(hr) * step, new C.Cartesian3()),\r\n new C.Cartesian3(),\r\n );\r\n setPos(addVec(pose.position, dir));\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('a')) {\r\n // left\r\n setPos(addVec(pose.position, C.Cartesian3.multiplyByScalar(e3, -step, new C.Cartesian3())));\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('d')) {\r\n // right\r\n setPos(addVec(pose.position, C.Cartesian3.multiplyByScalar(e3, step, new C.Cartesian3())));\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('c')) {\r\n // up\r\n setPos(addVec(pose.position, C.Cartesian3.multiplyByScalar(u3, step, new C.Cartesian3())));\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('z')) {\r\n // down - 检查最小高度限制\r\n const newPos = addVec(pose.position, C.Cartesian3.multiplyByScalar(u3, -step, new C.Cartesian3()));\r\n const newCarto = C.Cartographic.fromCartesian(newPos);\r\n if (newCarto && newCarto.height >= this.minHeight) {\r\n setPos(newPos);\r\n moved = true;\r\n }\r\n }\r\n if (this.keysPressed.has('q')) {\r\n // heading left\r\n pose.heading = clampDeg(pose.heading - ang);\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('e')) {\r\n // heading right\r\n pose.heading = clampDeg(pose.heading + ang);\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('i')) {\r\n // pitch up\r\n pose.pitch = clampRange(pose.pitch + ang, -90, 70);\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('k')) {\r\n // pitch down\r\n pose.pitch = clampRange(pose.pitch - ang, -90, 70);\r\n moved = true;\r\n }\r\n // if (this.keysPressed.has('u')) {\r\n // // roll left\r\n // pose.roll = clampRange(pose.roll - ang, -90, 90);\r\n // moved = true;\r\n // }\r\n // if (this.keysPressed.has('o')) {\r\n // // roll right\r\n // pose.roll = clampRange(pose.roll + ang, -90, 90);\r\n // moved = true;\r\n // }\r\n\r\n if (moved) {\r\n // 姿态变化:通知宿主、请求渲染、并确保视锥体/可视化同步\r\n this.opts?.onPose?.({ ...pose });\r\n this.viewer.scene?.requestRender?.();\r\n this.updateFrustum();\r\n // 广播游标姿态变化事件\r\n this.broadcastPoseChange();\r\n // Pyramid updates automatically via CallbackProperty - no manual update needed\r\n }\r\n \r\n // Continue loop\r\n requestAnimationFrame(update);\r\n };\r\n \r\n requestAnimationFrame(update);\r\n }\r\n // Future: add method to update options if required\r\n /**\r\n * 更新配置(非破坏式合并)。\r\n * 注意:不会立即改变现有实体样式,更多用于动态调整回调与步长参数。\r\n */\r\n updateOptions(partial: AirplaneCursorOptions) {\r\n this.opts = { ...this.opts, ...partial };\r\n }\r\n\r\n /** 同步当前路径数据供插入计算使用 */\r\n // syncPath 与自动插入计算已删除;保留空占位可在未来扩展(例如路径辅助显示)\r\n\r\n /**\r\n * 延迟创建并维护视锥体与海拔标记:\r\n * - 首次调用时创建 FrustumPyramid 与 HeightMarker,并绑定动态回调\r\n * - 后续只依赖回调读取 pose 与 currentFOV 即可自动更新\r\n */\r\n private updateFrustum() {\r\n try {\r\n if (!this.frustum) {\r\n // 选取已有 datasource; 没有则创建一个临时的\r\n let layer = (this.viewer.dataSources as any)?._dataSources?.[0];\r\n const C: any = this.CesiumNS as any;\r\n if (!layer) {\r\n layer = new C.CustomDataSource('FrustumLayer');\r\n this.viewer.dataSources.add(layer);\r\n }\r\n \r\n this.frustum = new FrustumPyramid(this.CesiumNS, layer, {\r\n fov: this.opts.fovDeg ?? 50,\r\n length: 500,\r\n color: this.opts.color as any,\r\n fillAlpha: 0.25,\r\n width: 2,\r\n // 启用角度变化日志(输出到浏览器控制台),并设置节流间隔\r\n logAngles: false,\r\n logThrottleMs: 300,\r\n });\r\n \r\n // 使用 showAtDynamic 方法,传入回调函数持续读取姿态\r\n this.frustum.showAtDynamic(\r\n () => this.pose.position,\r\n () => this.pose.heading,\r\n () => this.pose.pitch,\r\n () => this.pose.roll,\r\n () => this.currentFOV, // 使用动态更新的 currentFOV\r\n () => 1000\r\n );\r\n \r\n // Initialize height marker in the same layer to avoid clutter\r\n try {\r\n this.heightMarker = new HeightMarker(this.CesiumNS, this.viewer, layer);\r\n // 使用 showAtDynamic 方法,传入回调函数持续读取位置\r\n this.heightMarker.showAtDynamic(() => this.pose.position);\r\n } catch {}\r\n }\r\n } catch {}\r\n }\r\n\r\n /** 获取当前姿态(包含高度信息) */\r\n getPose() {\r\n const C: any = this.CesiumNS as any;\r\n const cartographic = C.Cartographic.fromCartesian(this.pose.position);\r\n const altitude = cartographic ? cartographic.height : 0;\r\n return {\r\n ...this.pose,\r\n altitude,\r\n };\r\n }\r\n\r\n /** 获取内部实体(用于拾取识别) */\r\n getEntity() {\r\n return this.entity;\r\n }\r\n\r\n /** 检查给定实体是否属于此游标(包括所有金字塔各个面实体) */\r\n containsEntity(entity: Cesium.Entity | undefined): boolean {\r\n if (!entity) return false;\r\n\r\n const C: any = this.CesiumNS as any;\r\n const now =\r\n this.viewer?.clock?.currentTime ??\r\n (typeof C?.JulianDate?.now === 'function' ? C.JulianDate.now() : undefined);\r\n\r\n const getPropertyValue = (properties: any, key: string) => {\r\n if (!properties) return undefined;\r\n const prop = properties[key];\r\n if (!prop) return undefined;\r\n if (typeof prop.getValue === 'function') {\r\n try {\r\n return prop.getValue(now);\r\n } catch {\r\n try {\r\n return prop.getValue(undefined);\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n }\r\n return prop;\r\n };\r\n\r\n const targetId = (entity as any).id;\r\n const targetProps = (entity as any).properties;\r\n const targetType = getPropertyValue(targetProps, '_type');\r\n const targetPart = getPropertyValue(targetProps, '_pyramidPart');\r\n\r\n return this.pyramidEntities.some((pyramidEntity) => {\r\n if (!pyramidEntity) return false;\r\n if (pyramidEntity === entity) return true;\r\n\r\n if (targetId && pyramidEntity.id === targetId) {\r\n return true;\r\n }\r\n\r\n if (targetType) {\r\n const pyramidType = getPropertyValue((pyramidEntity as any).properties, '_type');\r\n if (pyramidType === targetType) {\r\n if (!targetPart) return true;\r\n const pyramidPart = getPropertyValue((pyramidEntity as any).properties, '_pyramidPart');\r\n if (pyramidPart === targetPart) return true;\r\n }\r\n }\r\n\r\n return false;\r\n });\r\n }\r\n\r\n /** 外部设置姿态(用于选中顶点后同步游标) */\r\n setPose(position: Cesium.Cartesian3, heading: number, pitch: number, roll: number) {\r\n this.pose.position = position;\r\n this.pose.heading = clampDeg(heading);\r\n this.pose.pitch = clampRange(pitch, -90, 70);\r\n this.pose.roll = clampRange(roll, -90, 90);\r\n try {\r\n this.opts?.onPose?.({ ...this.pose });\r\n } catch {}\r\n this.updateFrustum();\r\n this.broadcastPoseChange();\r\n this.viewer.scene?.requestRender?.();\r\n }\r\n\r\n /**\r\n * 广播游标姿态变化事件到全局事件总线\r\n */\r\n private broadcastPoseChange() {\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const cartographic = C.Cartographic.fromCartesian(this.pose.position);\r\n const altitude = cartographic ? cartographic.height : 0;\r\n \r\n console.log('[AirplaneCursor] 📡 广播姿态变化:', {\r\n heading: this.pose.heading,\r\n pitch: this.pose.pitch,\r\n altitude,\r\n });\r\n \r\n globalCameraEventBus.onCursorPoseChange.emit({\r\n position: this.pose.position,\r\n heading: this.pose.heading,\r\n pitch: this.pose.pitch,\r\n roll: this.pose.roll,\r\n altitude,\r\n source: 'cursor',\r\n });\r\n } catch (e) {\r\n // 忽略广播错误\r\n }\r\n }\r\n\r\n /**\r\n * 模拟按键按下(用于虚拟控制器)\r\n * @param key 按键名称 (w/a/s/d/q/e/c/z)\r\n * @param duration 按键持续时间(毫秒),默认 100ms\r\n */\r\n simulateKeyPress(key: string, duration: number = 100) {\r\n const lowerKey = key.toLowerCase();\r\n // 映射 C/Z 到实际的高度控制键\r\n const keyMap: Record<string, string> = {\r\n 'c': 'c', // 上升\r\n 'z': 'z', // 下降\r\n };\r\n const mappedKey = keyMap[lowerKey] || lowerKey;\r\n \r\n console.log('[AirplaneCursor] 🎮 simulateKeyPress:', mappedKey, 'duration:', duration);\r\n console.log('[AirplaneCursor] 🎮 updateLoopRunning:', this.updateLoopRunning);\r\n \r\n this.keysPressed.add(mappedKey);\r\n if (!this.updateLoopRunning) {\r\n console.log('[AirplaneCursor] 🎮 启动 updateLoop');\r\n this.startUpdateLoop();\r\n }\r\n \r\n // 自动释放按键\r\n setTimeout(() => {\r\n this.keysPressed.delete(mappedKey);\r\n }, duration);\r\n }\r\n\r\n destroy() {\r\n // 释放事件与图形资源,防止内存泄漏;重复调用将被忽略\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n this.keysPressed.clear();\r\n this.updateLoopRunning = false;\r\n try {\r\n if (this.entity) this.viewer.entities.remove(this.entity);\r\n } catch {}\r\n this.entity = undefined;\r\n \r\n // Clean up pyramid entities\r\n try {\r\n this.pyramidEntities.forEach(entity => {\r\n try {\r\n this.pyramidLayer?.entities.remove(entity);\r\n } catch {}\r\n });\r\n this.pyramidEntities = [];\r\n } catch {}\r\n \r\n // Remove pyramid layer\r\n try {\r\n if (this.pyramidLayer) {\r\n this.viewer.dataSources.remove(this.pyramidLayer);\r\n }\r\n } catch {}\r\n this.pyramidLayer = undefined;\r\n \r\n // 移除相机变化事件监听器\r\n try {\r\n this.cameraChangedListener?.();\r\n } catch {}\r\n this.cameraChangedListener = undefined;\r\n \r\n try {\r\n this.frustum?.destroy();\r\n } catch {}\r\n this.frustum = undefined;\r\n try {\r\n this.heightMarker?.destroy();\r\n } catch {}\r\n this.heightMarker = undefined;\r\n try {\r\n if (this.keyListener) window.removeEventListener('keydown', this.keyListener as any);\r\n if (this.keyupListener) window.removeEventListener('keyup', this.keyupListener as any);\r\n } catch {}\r\n }\r\n}\r\n\r\n/**\r\n * 将角度标准化到 [0, 360) 区间\r\n */\r\nfunction clampDeg(v: number) {\r\n return ((v % 360) + 360) % 360;\r\n}\r\n/**\r\n * 将数值限制在指定闭区间 [min, max] 内\r\n */\r\nfunction clampRange(v: number, min: number, max: number) {\r\n return Math.max(min, Math.min(max, v));\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\n/**\r\n * 顶点标签配置选项\r\n */\r\nexport interface VertexLabelOptions {\r\n /** 标签大小(像素) */\r\n size?: number;\r\n /** 普通状态颜色 */\r\n normalColor?: string;\r\n /** 编辑状态颜色 */\r\n editedColor?: string;\r\n /** 选中状态颜色 */\r\n selectedColor?: string;\r\n /** 第一个航点颜色 */\r\n startColor?: string;\r\n /** 选中时边框颜色 */\r\n outlineColor?: string;\r\n /** 文字颜色 */\r\n textColor?: string;\r\n /** 垂直偏移量 */\r\n pixelOffsetY?: number;\r\n}\r\n\r\n/**\r\n * 顶点标签状态\r\n */\r\nexport type VertexLabelState = 'normal' | 'edited' | 'selected';\r\n\r\n/**\r\n * 顶点标签管理器\r\n * 负责创建、更新和销毁路径编辑中的顶点标签(倒三角形+序号)\r\n */\r\nexport class VertexLabelManager {\r\n private CesiumNS: typeof Cesium;\r\n private layer: Cesium.CustomDataSource;\r\n private ownerId: string;\r\n private labels: Array<Cesium.Entity | undefined> = [];\r\n private options: Required<VertexLabelOptions>;\r\n private hiddenClimbIndex?: number;\r\n\r\n constructor(\r\n CesiumNS: typeof Cesium,\r\n layer: Cesium.CustomDataSource,\r\n ownerId: string,\r\n hiddenClimbIndex?: number,\r\n options?: VertexLabelOptions,\r\n ) {\r\n this.CesiumNS = CesiumNS;\r\n this.layer = layer;\r\n this.ownerId = ownerId;\r\n this.hiddenClimbIndex = hiddenClimbIndex;\r\n this.options = {\r\n size: options?.size ?? 48,\r\n normalColor: options?.normalColor ?? '#00FF00',\r\n editedColor: options?.editedColor ?? '#9370DB',\r\n selectedColor: options?.selectedColor ?? '#1E90FF',\r\n startColor: options?.startColor ?? '#FF6B6B',\r\n outlineColor: options?.outlineColor ?? '#FFFFFF',\r\n textColor: options?.textColor ?? '#FFFFFF',\r\n pixelOffsetY: options?.pixelOffsetY ?? -10,\r\n };\r\n }\r\n\r\n /**\r\n * 创建顶点标签\r\n * @param position 顶点位置\r\n * @param index 顶点索引\r\n * @param state 标签状态\r\n * @returns 创建的标签实体,如果跳过则返回 undefined\r\n */\r\n createLabel(\r\n position: Cesium.Cartesian3,\r\n index: number,\r\n state: VertexLabelState = 'normal',\r\n ): Cesium.Entity | undefined {\r\n try {\r\n // 跳过隐藏爬升点\r\n if (this.hiddenClimbIndex !== undefined && index === this.hiddenClimbIndex) {\r\n return undefined;\r\n }\r\n\r\n // 判断是否为第一个航点(显示 \"S\")\r\n const isFirstWaypoint =\r\n (this.hiddenClimbIndex === 1 && index === 2) ||\r\n (this.hiddenClimbIndex === undefined && index === 0);\r\n\r\n if (isFirstWaypoint) {\r\n // 第一个航点使用特殊标记 \"S\"\r\n return this.createStartLabel(position, state === 'selected');\r\n }\r\n\r\n // 跳过起始点(index 0)- 只有当有 takeOffRefPoint 时才跳过\r\n if (index === 0 && this.hiddenClimbIndex === 1) {\r\n return undefined;\r\n }\r\n\r\n // 生成倒三角形 SVG 图标,带序号\r\n const svg = this.generateTriangleSVG(index, state, false);\r\n const blob = new Blob([svg], { type: 'image/svg+xml' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const C = this.CesiumNS as any;\r\n return this.layer.entities.add({\r\n position: position,\r\n billboard: {\r\n image: url,\r\n width: this.options.size,\r\n height: this.options.size,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n horizontalOrigin: C.HorizontalOrigin.CENTER,\r\n pixelOffset: new C.Cartesian2(0, this.options.pixelOffsetY),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: {\r\n _type: 'vertex-label',\r\n _ownerId: this.ownerId,\r\n _vertexIndex: index,\r\n },\r\n } as any);\r\n } catch (e) {\r\n console.error('Failed to create vertex label:', e);\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 创建第一个航点标签(显示 \"S\")\r\n */\r\n private createStartLabel(position: Cesium.Cartesian3, isSelected: boolean): Cesium.Entity | undefined {\r\n try {\r\n const svg = this.generateTriangleSVG(0, isSelected ? 'selected' : 'normal', true);\r\n const blob = new Blob([svg], { type: 'image/svg+xml' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const C = this.CesiumNS as any;\r\n // 根据是否有隐藏爬升点确定第一个航点的 index\r\n const firstWaypointIndex = this.hiddenClimbIndex === 1 ? 2 : 1;\r\n\r\n return this.layer.entities.add({\r\n position: position,\r\n billboard: {\r\n image: url,\r\n width: this.options.size,\r\n height: this.options.size,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n horizontalOrigin: C.HorizontalOrigin.CENTER,\r\n pixelOffset: new C.Cartesian2(0, this.options.pixelOffsetY),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: {\r\n _type: 'vertex-label',\r\n _ownerId: this.ownerId,\r\n _vertexIndex: firstWaypointIndex,\r\n },\r\n } as any);\r\n } catch (e) {\r\n console.error('Failed to create start label:', e);\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 生成倒三角形 SVG\r\n */\r\n private generateTriangleSVG(index: number, state: VertexLabelState, isStart: boolean): string {\r\n const size = this.options.size;\r\n let triangleColor: string;\r\n let outlineColor: string;\r\n let outlineWidth: number;\r\n\r\n if (state === 'selected') {\r\n triangleColor = isStart ? this.options.startColor : this.options.selectedColor;\r\n outlineColor = this.options.outlineColor;\r\n outlineWidth = 2;\r\n } else if (isStart) {\r\n triangleColor = this.options.startColor;\r\n outlineColor = 'none';\r\n outlineWidth = 0;\r\n } else if (state === 'edited') {\r\n triangleColor = this.options.editedColor;\r\n outlineColor = 'none';\r\n outlineWidth = 0;\r\n } else {\r\n triangleColor = this.options.normalColor;\r\n outlineColor = 'none';\r\n outlineWidth = 0;\r\n }\r\n\r\n const textColor = this.options.textColor;\r\n\r\n // 计算显示内容\r\n let displayText: string;\r\n if (isStart) {\r\n displayText = 'S';\r\n } else {\r\n // 计算显示序号:无论什么情况,标签都是 \"S\", \"2\", \"3\", \"4\", \"5\"...\r\n let displayNumber: number;\r\n if (this.hiddenClimbIndex === 1) {\r\n // 有隐藏爬升点:index 2 显示为 S,index 3 显示为 2,index 4 显示为 3...\r\n displayNumber = index - 1; // index 3 -> 2, index 4 -> 3, index 5 -> 4...\r\n } else {\r\n // 无隐藏爬升点:index 0 显示为 S,index 1 显示为 2,index 2 显示为 3...\r\n displayNumber = index + 1; // index 1 -> 2, index 2 -> 3, index 3 -> 4...\r\n }\r\n displayText = displayNumber.toString();\r\n }\r\n\r\n const fontSize = isStart ? 20 : 18;\r\n\r\n return `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <polygon points=\"${size / 2},${size - 6} 6,10 ${size - 6},10\" \r\n fill=\"${triangleColor}\" \r\n stroke=\"${outlineColor}\" \r\n stroke-width=\"${outlineWidth}\"/>\r\n <text x=\"${size / 2}\" y=\"22\" \r\n font-family=\"Arial, sans-serif\" \r\n font-size=\"${fontSize}\" \r\n font-weight=\"bold\" \r\n fill=\"${textColor}\" \r\n text-anchor=\"middle\" \r\n dominant-baseline=\"middle\">${displayText}</text>\r\n </svg>\r\n `;\r\n }\r\n\r\n /**\r\n * 初始化所有顶点的标签\r\n */\r\n initializeLabels(positions: Cesium.Cartesian3[]): void {\r\n this.labels = [];\r\n for (let i = 0; i < positions.length; i++) {\r\n this.labels[i] = this.createLabel(positions[i], i, 'normal');\r\n }\r\n }\r\n\r\n /**\r\n * 更新指定索引的标签\r\n */\r\n updateLabel(index: number, position: Cesium.Cartesian3, state: VertexLabelState = 'normal'): void {\r\n try {\r\n // 跳过隐藏爬升点\r\n if (this.hiddenClimbIndex !== undefined && index === this.hiddenClimbIndex) {\r\n return;\r\n }\r\n\r\n // 移除旧标签\r\n if (this.labels[index]) {\r\n (this.layer.entities as any).remove(this.labels[index]);\r\n }\r\n\r\n // 创建新标签\r\n this.labels[index] = this.createLabel(position, index, state);\r\n } catch (e) {\r\n console.error('Failed to update vertex label:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 仅更新标签位置(不重建标签,用于拖动时的流畅更新)\r\n * @param index 顶点索引\r\n * @param position 新位置\r\n */\r\n updateLabelPosition(index: number, position: Cesium.Cartesian3): void {\r\n try {\r\n // 跳过隐藏爬升点\r\n if (this.hiddenClimbIndex !== undefined && index === this.hiddenClimbIndex) {\r\n return;\r\n }\r\n\r\n const label = this.labels[index];\r\n if (label && label.position) {\r\n (label.position as any).setValue(position);\r\n }\r\n } catch (e) {\r\n console.error('Failed to update vertex label position:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 插入新标签(在指定索引处)\r\n */\r\n insertLabel(insertAt: number, position: Cesium.Cartesian3, state: VertexLabelState = 'normal'): void {\r\n try {\r\n // 插入新标签\r\n const newLabel = this.createLabel(position, insertAt, state);\r\n this.labels.splice(insertAt, 0, newLabel);\r\n\r\n // 重新创建所有标签以更新序号\r\n this.recreateAllLabels();\r\n } catch (e) {\r\n console.error('Failed to insert vertex label:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 删除指定索引的标签\r\n * 注意:此方法只删除标签实体和更新内部数组,不会重新创建标签。\r\n * 调用方需要在删除数据后手动调用 recreateAllLabels(positions, editedIndices, selectedIndex) 来重建所有标签。\r\n */\r\n removeLabel(index: number): void {\r\n try {\r\n if (this.labels[index]) {\r\n (this.layer.entities as any).remove(this.labels[index]);\r\n this.labels.splice(index, 1);\r\n }\r\n } catch (e) {\r\n console.error('Failed to remove vertex label:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 重新创建所有标签(用于序号更新)\r\n */\r\n recreateAllLabels(positions?: Cesium.Cartesian3[], editedIndices?: Set<number>, selectedIndex?: number): void {\r\n try {\r\n // 清除所有现有标签\r\n for (let i = 0; i < this.labels.length; i++) {\r\n if (this.labels[i] && i !== this.hiddenClimbIndex) {\r\n (this.layer.entities as any).remove(this.labels[i]);\r\n }\r\n }\r\n\r\n // 重新创建标签\r\n if (positions) {\r\n for (let i = 0; i < positions.length; i++) {\r\n const isEdited = editedIndices?.has(i) ?? false;\r\n const isSelected = i === selectedIndex;\r\n const state: VertexLabelState = isSelected ? 'selected' : isEdited ? 'edited' : 'normal';\r\n this.labels[i] = this.createLabel(positions[i], i, state);\r\n }\r\n }\r\n } catch (e) {\r\n console.error('Failed to recreate all labels:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 获取指定索引的标签\r\n */\r\n getLabel(index: number): Cesium.Entity | undefined {\r\n return this.labels[index];\r\n }\r\n\r\n /**\r\n * 销毁所有标签\r\n */\r\n destroy(): void {\r\n try {\r\n this.labels.forEach((label) => {\r\n if (label) {\r\n (this.layer.entities as any).remove(label);\r\n }\r\n });\r\n this.labels = [];\r\n } catch (e) {\r\n console.error('Failed to destroy vertex labels:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 更新隐藏爬升点索引\r\n */\r\n setHiddenClimbIndex(index: number | undefined): void {\r\n this.hiddenClimbIndex = index;\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\n/**\r\n * 路径编辑工具函数集合\r\n */\r\n\r\n/**\r\n * 计算从原点到目标点的航向角(度数)\r\n * @param CesiumNS Cesium 命名空间\r\n * @param origin 原点位置(Cartesian3)\r\n * @param target 目标点位置(Cartesian3)\r\n * @returns 航向角(度数,0-360)\r\n */\r\nexport function computeHeadingDegFromTo(\r\n CesiumNS: typeof Cesium,\r\n origin: Cesium.Cartesian3,\r\n target: Cesium.Cartesian3,\r\n): number {\r\n try {\r\n const C = CesiumNS as any;\r\n const dir = C.Cartesian3.normalize(\r\n C.Cartesian3.subtract(target, origin, new C.Cartesian3()),\r\n new C.Cartesian3(),\r\n );\r\n const enu = C.Transforms.eastNorthUpToFixedFrame(origin);\r\n const inv = C.Matrix4.inverse(enu, new C.Matrix4());\r\n const local = C.Matrix4.multiplyByPointAsVector(inv, dir, new C.Cartesian3());\r\n const heading = Math.atan2(local.x, local.y); // east, north\r\n const deg = C.Math.toDegrees(heading);\r\n return (deg + 360) % 360;\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * 从屏幕位置拾取顶点索引\r\n * @param viewer Cesium Viewer 实例\r\n * @param screenPosition 屏幕位置\r\n * @param hiddenClimbIndex 隐藏爬升点索引(需要跳过)\r\n * @returns 顶点索引,如果没有拾取到或拾取到隐藏点则返回 undefined\r\n */\r\nexport function pickVertexIndex(\r\n viewer: Cesium.Viewer,\r\n screenPosition: { x: number; y: number },\r\n hiddenClimbIndex?: number,\r\n): number | undefined {\r\n try {\r\n const picked = (viewer.scene as any).pick?.(screenPosition);\r\n const eid = picked?.id as any;\r\n const idx = eid?.properties?._vertexIndex?.getValue?.() ?? eid?.properties?._vertexIndex;\r\n \r\n // 保护隐藏爬升点\r\n if (typeof idx === 'number' && hiddenClimbIndex === idx) {\r\n return undefined;\r\n }\r\n \r\n return typeof idx === 'number' ? idx : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * 确保实体所在的图层存在,如果不存在则创建新图层\r\n * @param viewer Cesium Viewer 实例\r\n * @param entity 实体对象\r\n * @param CesiumNS Cesium 命名空间\r\n * @returns 实体所在的数据源(图层)\r\n */\r\nexport function ensureLayerForEntity(\r\n viewer: Cesium.Viewer,\r\n entity: Cesium.Entity,\r\n CesiumNS: typeof Cesium,\r\n): Cesium.CustomDataSource {\r\n const ds: any = (entity as any)?.entityCollection?._owner;\r\n if (ds) return ds;\r\n \r\n const C: any = CesiumNS as any;\r\n const fallback = new C.CustomDataSource('Paths');\r\n viewer.dataSources.add(fallback);\r\n \r\n try {\r\n (viewer.entities as any).remove(entity);\r\n } catch {}\r\n \r\n try {\r\n fallback.entities.add(entity);\r\n } catch {}\r\n \r\n return fallback;\r\n}\r\n\r\n/**\r\n * 计算航线距离(不包含起始点和隐藏转折点)\r\n * \r\n * 计算从起始点(或隐藏转折点后的第一个点)到指定索引点的累计距离。\r\n * 距离计算会跳过起始点(index 0)和隐藏转折点(index 1,如果存在)。\r\n * \r\n * @param CesiumNS Cesium 命名空间\r\n * @param positions 所有顶点位置数组\r\n * @param targetIndex 目标顶点索引(计算到此点的累计距离)\r\n * @param hiddenClimbIndex 隐藏转折点索引(通常为 1,如果不存在则为 undefined)\r\n * @returns 累计距离(米),如果无法计算则返回 0\r\n * \r\n * @example\r\n * ```typescript\r\n * // 计算到第 3 个点的距离(假设有隐藏转折点在 index 1)\r\n * const distance = calculatePathDistance(Cesium, positions, 3, 1);\r\n * // 这会计算从 index 2 到 index 3 的距离(跳过 index 0 和 1)\r\n * ```\r\n */\r\nexport function calculatePathDistance(\r\n CesiumNS: typeof Cesium,\r\n positions: Cesium.Cartesian3[],\r\n targetIndex: number,\r\n hiddenClimbIndex?: number,\r\n): number {\r\n if (!positions || positions.length < 2) return 0;\r\n if (targetIndex < 0 || targetIndex >= positions.length) return 0;\r\n \r\n const C = CesiumNS as any;\r\n let totalDistance = 0;\r\n \r\n // 确定起始索引:跳过起始点(0)和隐藏转折点(1,如果存在)\r\n const startIndex = hiddenClimbIndex === 1 ? 2 : 1;\r\n \r\n // 如果目标索引小于等于起始索引,返回 0\r\n if (targetIndex <= startIndex) return 0;\r\n \r\n // 从起始索引开始,累计到目标索引的距离\r\n for (let i = startIndex; i <= targetIndex; i++) {\r\n try {\r\n const prevPos = positions[i - 1];\r\n const currPos = positions[i];\r\n if (prevPos && currPos) {\r\n const segmentDistance = C.Cartesian3.distance(prevPos, currPos) || 0;\r\n totalDistance += segmentDistance;\r\n }\r\n } catch {\r\n // 忽略计算错误,继续下一个段\r\n }\r\n }\r\n \r\n return totalDistance;\r\n}","import type * as Cesium from 'cesium';\r\nimport { VertexLabelManager } from './VertexLabelManager';\r\nimport { HeightMarker } from '../HeightMarker';\r\nimport { computeHeadingDegFromTo } from './PathEditingUtils';\r\nimport type { AirplaneCursor } from '../AirplaneCursor';\r\n\r\n/**\r\n * 顶点插入配置选项\r\n */\r\nexport interface VertexInsertionOptions {\r\n /** Cesium 命名空间 */\r\n CesiumNS: typeof Cesium;\r\n /** 图层(数据源) */\r\n layer: Cesium.CustomDataSource;\r\n /** 实体 ID */\r\n ownerId: string;\r\n /** 隐藏爬升点索引 */\r\n hiddenClimbIndex?: number;\r\n}\r\n\r\n/**\r\n * 顶点姿态信息\r\n */\r\nexport interface VertexPose {\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n}\r\n\r\n/**\r\n * 顶点插入处理器\r\n * 负责处理路径编辑中的顶点插入逻辑\r\n */\r\nexport class VertexInsertionHandler {\r\n private CesiumNS: typeof Cesium;\r\n private layer: Cesium.CustomDataSource;\r\n private ownerId: string;\r\n private hiddenClimbIndex?: number;\r\n\r\n constructor(options: VertexInsertionOptions) {\r\n this.CesiumNS = options.CesiumNS;\r\n this.layer = options.layer;\r\n this.ownerId = options.ownerId;\r\n this.hiddenClimbIndex = options.hiddenClimbIndex;\r\n }\r\n\r\n /**\r\n * 插入新顶点\r\n * @param insertAt 插入位置索引\r\n * @param position 顶点位置\r\n * @param positions 所有顶点位置数组(引用)\r\n * @param handles 所有顶点句柄数组(引用)\r\n * @param headings 所有航向角数组(引用)\r\n * @param pitches 所有俯仰角数组(引用)\r\n * @param rolls 所有横滚角数组(引用)\r\n * @param fovs 所有视场角数组(引用)\r\n * @param editedIndices 已编辑顶点索引集合(引用)\r\n * @param vertexLabelManager 顶点标签管理器\r\n * @param heightMarkers 高度标记数组(引用)\r\n * @param airplaneCursor 飞机游标(可选)\r\n * @param poseOrient 顶点姿态(可选)\r\n * @returns 实际插入的索引\r\n */\r\n insertVertex(\r\n insertAt: number,\r\n position: Cesium.Cartesian3,\r\n positions: Cesium.Cartesian3[],\r\n handles: Cesium.Entity[],\r\n headings: number[],\r\n pitches: number[],\r\n rolls: number[],\r\n fovs: number[],\r\n editedIndices: Set<number>,\r\n vertexLabelManager: VertexLabelManager,\r\n heightMarkers: Array<HeightMarker | undefined>,\r\n airplaneCursor?: AirplaneCursor,\r\n poseOrient?: VertexPose,\r\n ): number {\r\n const C = this.CesiumNS as any;\r\n\r\n // 防止插入到隐藏爬升点之前\r\n if (this.hiddenClimbIndex === 1 && insertAt <= 1) {\r\n insertAt = 2;\r\n }\r\n\r\n // 插入位置\r\n positions.splice(insertAt, 0, position);\r\n\r\n // 创建顶点句柄\r\n const handle = this.layer.entities.add({\r\n position: position,\r\n point: {\r\n pixelSize: 10,\r\n color: C.Color.YELLOW,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n },\r\n properties: {\r\n _type: 'path-vertex',\r\n _ownerId: this.ownerId,\r\n _vertexIndex: insertAt,\r\n },\r\n } as any);\r\n handles.splice(insertAt, 0, handle);\r\n\r\n // 重新索引所有句柄\r\n this.reindexHandles(handles);\r\n\r\n // 更新已编辑索引集合\r\n this.updateEditedIndices(editedIndices, insertAt);\r\n\r\n // 使用 VertexLabelManager 插入新标签并重新创建所有标签以更新序号\r\n vertexLabelManager.insertLabel(insertAt, position, 'selected');\r\n vertexLabelManager.recreateAllLabels(positions, editedIndices, insertAt);\r\n\r\n // 初始化顶点姿态\r\n const pose = this.initializeVertexPose(\r\n insertAt,\r\n positions,\r\n airplaneCursor,\r\n poseOrient,\r\n );\r\n\r\n headings.splice(insertAt, 0, pose.heading);\r\n pitches.splice(insertAt, 0, pose.pitch);\r\n rolls.splice(insertAt, 0, pose.roll);\r\n fovs.splice(insertAt, 0, 50);\r\n\r\n // 返回实际插入的索引\r\n return insertAt;\r\n }\r\n\r\n /**\r\n * 重新索引所有顶点句柄\r\n */\r\n private reindexHandles(handles: Cesium.Entity[]): void {\r\n handles.forEach((handle, index) => {\r\n try {\r\n if (!handle) return;\r\n const props: any = (handle as any).properties || {};\r\n const type = props?._type?.getValue?.() ?? props?._type ?? 'path-vertex';\r\n const ownerId = props?._ownerId?.getValue?.() ?? props?._ownerId ?? this.ownerId;\r\n (handle as any).properties = {\r\n _type: type,\r\n _ownerId: ownerId,\r\n _vertexIndex: index,\r\n } as any;\r\n } catch {}\r\n });\r\n }\r\n\r\n /**\r\n * 更新已编辑顶点索引集合\r\n */\r\n private updateEditedIndices(editedIndices: Set<number>, insertAt: number): void {\r\n const shifted = new Set<number>();\r\n editedIndices.forEach((i) => shifted.add(i >= insertAt ? i + 1 : i));\r\n shifted.add(insertAt);\r\n editedIndices.clear();\r\n shifted.forEach((i) => editedIndices.add(i));\r\n }\r\n\r\n /**\r\n * 初始化顶点姿态\r\n */\r\n private initializeVertexPose(\r\n insertAt: number,\r\n positions: Cesium.Cartesian3[],\r\n airplaneCursor?: AirplaneCursor,\r\n poseOrient?: VertexPose,\r\n ): VertexPose {\r\n let heading = 0;\r\n let pitch = -10;\r\n let roll = 0;\r\n\r\n if (poseOrient) {\r\n // 优先使用提供的姿态\r\n heading = poseOrient.heading;\r\n pitch = poseOrient.pitch;\r\n roll = poseOrient.roll;\r\n } else if (airplaneCursor) {\r\n // 使用飞机游标当前姿态\r\n try {\r\n const currentPose = airplaneCursor.getPose();\r\n heading = currentPose.heading;\r\n pitch = currentPose.pitch;\r\n roll = currentPose.roll;\r\n } catch {}\r\n\r\n // 如果航向为 0 且有下一个点,计算朝向下一个点\r\n if (heading === 0 && insertAt < positions.length - 1) {\r\n heading = computeHeadingDegFromTo(\r\n this.CesiumNS,\r\n positions[insertAt],\r\n positions[insertAt + 1],\r\n );\r\n }\r\n } else if (insertAt < positions.length - 1) {\r\n // 回退:计算朝向下一个点\r\n heading = computeHeadingDegFromTo(\r\n this.CesiumNS,\r\n positions[insertAt],\r\n positions[insertAt + 1],\r\n );\r\n }\r\n\r\n return { heading, pitch, roll };\r\n }\r\n\r\n /**\r\n * 调整插入索引(确保不插入到隐藏爬升点之前)\r\n */\r\n adjustInsertIndex(insertAt: number): number {\r\n if (this.hiddenClimbIndex === 1 && insertAt <= 1) {\r\n return 2;\r\n }\r\n return insertAt;\r\n }\r\n}\r\n","/**\r\n * 上下文菜单配置选项\r\n */\r\nexport interface ContextMenuOptions {\r\n /** 菜单背景颜色 */\r\n backgroundColor?: string;\r\n /** 文字颜色 */\r\n textColor?: string;\r\n /** 内边距 */\r\n padding?: string;\r\n /** 边框 */\r\n border?: string;\r\n /** 字体大小 */\r\n fontSize?: string;\r\n /** 圆角 */\r\n borderRadius?: string;\r\n /** 背景模糊 */\r\n backdropFilter?: string;\r\n /** 阴影 */\r\n boxShadow?: string;\r\n /** z-index */\r\n zIndex?: string;\r\n /** 菜单项悬停背景色 */\r\n itemHoverBackground?: string;\r\n /** 菜单项内边距 */\r\n itemPadding?: string;\r\n}\r\n\r\n/**\r\n * 菜单项配置\r\n */\r\nexport interface MenuItem {\r\n /** 菜单项文本 */\r\n label: string;\r\n /** 点击回调 */\r\n action: () => void;\r\n /** 是否禁用 */\r\n disabled?: boolean;\r\n}\r\n\r\n/**\r\n * 屏幕位置\r\n */\r\nexport interface ScreenPosition {\r\n x: number;\r\n y: number;\r\n}\r\n\r\n/**\r\n * 右键上下文菜单管理器\r\n * 负责创建、显示和销毁路径编辑中的右键菜单\r\n */\r\nexport class ContextMenuManager {\r\n private menuElement?: HTMLDivElement;\r\n private options: Required<ContextMenuOptions>;\r\n private clickAwayListener?: (event: MouseEvent) => void;\r\n\r\n constructor(options?: ContextMenuOptions) {\r\n this.options = {\r\n backgroundColor: options?.backgroundColor ?? 'rgba(30,30,30,0.9)',\r\n textColor: options?.textColor ?? '#fff',\r\n padding: options?.padding ?? '6px 8px',\r\n border: options?.border ?? '1px solid #444',\r\n fontSize: options?.fontSize ?? '12px',\r\n borderRadius: options?.borderRadius ?? '4px',\r\n backdropFilter: options?.backdropFilter ?? 'blur(4px)',\r\n boxShadow: options?.boxShadow ?? '0 2px 6px rgba(0,0,0,0.4)',\r\n zIndex: options?.zIndex ?? '9999',\r\n itemHoverBackground: options?.itemHoverBackground ?? 'rgba(255,255,255,0.12)',\r\n itemPadding: options?.itemPadding ?? '4px 6px',\r\n };\r\n }\r\n\r\n /**\r\n * 显示上下文菜单\r\n * @param position 屏幕位置\r\n * @param items 菜单项列表\r\n */\r\n show(position: ScreenPosition, items: MenuItem[]): void {\r\n // 移除旧菜单\r\n this.hide();\r\n\r\n // 创建菜单元素\r\n this.menuElement = document.createElement('div');\r\n this.applyMenuStyles(position);\r\n\r\n // 添加菜单项\r\n items.forEach((item) => {\r\n this.addMenuItem(item);\r\n });\r\n\r\n // 添加到 DOM\r\n document.body.appendChild(this.menuElement);\r\n\r\n // 设置点击外部关闭\r\n this.setupClickAwayListener();\r\n }\r\n\r\n /**\r\n * 隐藏/移除菜单\r\n */\r\n hide(): void {\r\n if (this.menuElement?.parentElement) {\r\n this.menuElement.parentElement.removeChild(this.menuElement);\r\n }\r\n this.menuElement = undefined;\r\n\r\n // 移除点击外部监听器\r\n if (this.clickAwayListener) {\r\n window.removeEventListener('mousedown', this.clickAwayListener);\r\n this.clickAwayListener = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 检查菜单是否可见\r\n */\r\n isVisible(): boolean {\r\n return this.menuElement !== undefined;\r\n }\r\n\r\n /**\r\n * 应用菜单样式\r\n */\r\n private applyMenuStyles(position: ScreenPosition): void {\r\n if (!this.menuElement) return;\r\n\r\n const styles = this.menuElement.style;\r\n styles.position = 'absolute';\r\n styles.zIndex = this.options.zIndex;\r\n styles.background = this.options.backgroundColor;\r\n styles.color = this.options.textColor;\r\n styles.padding = this.options.padding;\r\n styles.border = this.options.border;\r\n styles.fontSize = this.options.fontSize;\r\n styles.borderRadius = this.options.borderRadius;\r\n styles.backdropFilter = this.options.backdropFilter;\r\n styles.userSelect = 'none';\r\n styles.cursor = 'default';\r\n styles.boxShadow = this.options.boxShadow;\r\n styles.left = `${position.x}px`;\r\n styles.top = `${position.y}px`;\r\n }\r\n\r\n /**\r\n * 添加菜单项\r\n */\r\n private addMenuItem(item: MenuItem): void {\r\n if (!this.menuElement) return;\r\n\r\n const itemElement = document.createElement('div');\r\n itemElement.textContent = item.label;\r\n itemElement.style.padding = this.options.itemPadding;\r\n itemElement.style.whiteSpace = 'nowrap';\r\n\r\n // 禁用状态\r\n if (item.disabled) {\r\n itemElement.style.opacity = '0.5';\r\n itemElement.style.cursor = 'not-allowed';\r\n } else {\r\n // 悬停效果\r\n itemElement.onmouseenter = () => {\r\n itemElement.style.background = this.options.itemHoverBackground;\r\n };\r\n itemElement.onmouseleave = () => {\r\n itemElement.style.background = 'transparent';\r\n };\r\n\r\n // 点击事件\r\n itemElement.onclick = () => {\r\n item.action();\r\n this.hide();\r\n };\r\n }\r\n\r\n this.menuElement.appendChild(itemElement);\r\n }\r\n\r\n /**\r\n * 设置点击外部关闭监听器\r\n */\r\n private setupClickAwayListener(): void {\r\n this.clickAwayListener = (event: MouseEvent) => {\r\n if (!this.menuElement) return;\r\n if (!this.menuElement.contains(event.target as Node)) {\r\n this.hide();\r\n }\r\n };\r\n\r\n // 使用 setTimeout 避免立即触发\r\n setTimeout(() => {\r\n if (this.clickAwayListener) {\r\n window.addEventListener('mousedown', this.clickAwayListener, { once: true });\r\n }\r\n }, 0);\r\n }\r\n\r\n /**\r\n * 销毁菜单管理器\r\n */\r\n destroy(): void {\r\n this.hide();\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\n/**\r\n * 拖动状态\r\n */\r\ninterface DragState {\r\n /** 是否正在拖动 */\r\n isDragging: boolean;\r\n /** 被拖动的顶点索引 */\r\n draggedVertexIndex: number;\r\n /** 是否按下 Alt 键(垂直拖动模式) */\r\n isAltPressed: boolean;\r\n /** 拖动开始时的顶点位置 */\r\n startPosition: Cesium.Cartesian3;\r\n /** 拖动开始时的屏幕坐标 */\r\n startScreenPosition: { x: number; y: number };\r\n /** 拖动开始时的高度 */\r\n startHeight: number;\r\n /** 拖动开始时的经纬度 */\r\n startLonLat: { lon: number; lat: number };\r\n}\r\n\r\n/**\r\n * 顶点拖动处理器配置选项\r\n */\r\nexport interface VertexDragHandlerOptions {\r\n /** Cesium 命名空间 */\r\n CesiumNS: typeof Cesium;\r\n /** Cesium Viewer 实例 */\r\n viewer: Cesium.Viewer;\r\n /** 隐藏爬升点索引 */\r\n hiddenClimbIndex?: number;\r\n /** 航点最小高度(米),默认 0,航点不能低于此高度 */\r\n minHeight?: number;\r\n}\r\n\r\n/**\r\n * 顶点拖动回调函数\r\n */\r\nexport interface VertexDragCallbacks {\r\n /** 拖动开始回调 */\r\n onDragStart?: (index: number) => void;\r\n /** 拖动中回调(实时更新位置) */\r\n onDragMove?: (index: number, newPosition: Cesium.Cartesian3) => void;\r\n /** 拖动结束回调 */\r\n onDragEnd?: (index: number, finalPosition: Cesium.Cartesian3) => void;\r\n /** 获取所有位置 */\r\n getPositions?: () => Cesium.Cartesian3[];\r\n}\r\n\r\n/**\r\n * 顶点拖动处理器\r\n * 负责处理顶点标签的拖动操作\r\n * - 普通拖动(左键):水平移动顶点(保持高度不变)\r\n * - Alt + 拖动(Alt + 左键):垂直移动顶点(保持水平位置不变)\r\n */\r\nexport class VertexDragHandler {\r\n private CesiumNS: typeof Cesium;\r\n private viewer: Cesium.Viewer;\r\n private hiddenClimbIndex?: number;\r\n private minHeight: number;\r\n private callbacks: VertexDragCallbacks;\r\n private dragState: DragState | null = null;\r\n private canvas: HTMLCanvasElement;\r\n private keydownHandler?: (e: KeyboardEvent) => void;\r\n private keyupHandler?: (e: KeyboardEvent) => void;\r\n\r\n constructor(options: VertexDragHandlerOptions, callbacks: VertexDragCallbacks) {\r\n this.CesiumNS = options.CesiumNS;\r\n this.viewer = options.viewer;\r\n this.hiddenClimbIndex = options.hiddenClimbIndex;\r\n this.minHeight = options.minHeight ?? 0;\r\n this.callbacks = callbacks;\r\n this.canvas = (this.viewer.scene as any).canvas;\r\n\r\n this.setupKeyboardListeners();\r\n }\r\n\r\n /**\r\n * 设置键盘监听器(Alt 键)\r\n */\r\n private setupKeyboardListeners(): void {\r\n this.keydownHandler = (e: KeyboardEvent) => {\r\n if (e.key === 'Alt' && this.dragState) {\r\n this.dragState.isAltPressed = true;\r\n this.updateCursor();\r\n }\r\n };\r\n\r\n this.keyupHandler = (e: KeyboardEvent) => {\r\n if (e.key === 'Alt' && this.dragState) {\r\n this.dragState.isAltPressed = false;\r\n this.updateCursor();\r\n }\r\n // ESC 键取消拖动\r\n if (e.key === 'Escape' && this.dragState) {\r\n this.cancelDrag();\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', this.keydownHandler);\r\n window.addEventListener('keyup', this.keyupHandler);\r\n }\r\n\r\n /**\r\n * 更新光标样式\r\n */\r\n private updateCursor(): void {\r\n if (!this.dragState) {\r\n this.canvas.style.cursor = '';\r\n return;\r\n }\r\n\r\n if (this.dragState.isDragging) {\r\n this.canvas.style.cursor = this.dragState.isAltPressed ? 'ns-resize' : 'grabbing';\r\n } else {\r\n // 准备拖动状态,显示 grab 光标\r\n this.canvas.style.cursor = 'grab';\r\n }\r\n }\r\n\r\n /**\r\n * 禁用相机控制器(防止与地图拖动冲突)\r\n */\r\n private disableCameraController(): void {\r\n try {\r\n const controller = (this.viewer.scene as any).screenSpaceCameraController;\r\n if (controller) {\r\n controller.enableInputs = false;\r\n }\r\n } catch (error) {\r\n console.warn('Failed to disable camera controller:', error);\r\n }\r\n }\r\n\r\n /**\r\n * 恢复相机控制器\r\n */\r\n private enableCameraController(): void {\r\n try {\r\n const controller = (this.viewer.scene as any).screenSpaceCameraController;\r\n if (controller) {\r\n controller.enableInputs = true;\r\n }\r\n } catch (error) {\r\n console.warn('Failed to enable camera controller:', error);\r\n }\r\n }\r\n\r\n /**\r\n * 检查顶点是否可以拖动\r\n */\r\n private canDragVertex(index: number): boolean {\r\n // 不允许拖动起点\r\n if (index === 0) {\r\n return false;\r\n }\r\n\r\n // 不允许拖动隐藏爬升点\r\n if (this.hiddenClimbIndex !== undefined && index === this.hiddenClimbIndex) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * 开始拖动\r\n * @param vertexIndex 顶点索引\r\n * @param screenPosition 屏幕坐标\r\n * @returns 是否成功开始拖动\r\n */\r\n startDrag(vertexIndex: number, screenPosition: { x: number; y: number }): boolean {\r\n // 检查是否可以拖动\r\n if (!this.canDragVertex(vertexIndex)) {\r\n return false;\r\n }\r\n\r\n const positions = this.callbacks.getPositions?.() || [];\r\n const position = positions[vertexIndex];\r\n if (!position) {\r\n return false;\r\n }\r\n\r\n try {\r\n const C = this.CesiumNS as any;\r\n const cartographic = C.Cartographic.fromCartesian(position);\r\n \r\n // 创建拖动状态并立即开始拖动\r\n this.dragState = {\r\n isDragging: true,\r\n draggedVertexIndex: vertexIndex,\r\n isAltPressed: false,\r\n startPosition: position.clone(),\r\n startScreenPosition: { x: screenPosition.x, y: screenPosition.y },\r\n startHeight: cartographic.height,\r\n startLonLat: {\r\n lon: C.Math.toDegrees(cartographic.longitude),\r\n lat: C.Math.toDegrees(cartographic.latitude),\r\n },\r\n };\r\n\r\n // 禁用相机控制器\r\n this.disableCameraController();\r\n\r\n this.updateCursor();\r\n\r\n if (this.callbacks.onDragStart) {\r\n this.callbacks.onDragStart(vertexIndex);\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n console.error('Error starting vertex drag:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * 处理拖动移动\r\n * @param screenPosition 当前屏幕坐标\r\n */\r\n handleMove(screenPosition: { x: number; y: number }): void {\r\n if (!this.dragState || !this.dragState.isDragging) {\r\n return;\r\n }\r\n\r\n try {\r\n const newPosition = this.dragState.isAltPressed\r\n ? this.computeVerticalMove(screenPosition)\r\n : this.computeHorizontalMove(screenPosition);\r\n\r\n if (newPosition && this.callbacks.onDragMove) {\r\n this.callbacks.onDragMove(this.dragState.draggedVertexIndex, newPosition);\r\n }\r\n } catch (error) {\r\n console.error('Error handling vertex drag move:', error);\r\n }\r\n }\r\n\r\n /**\r\n * 计算水平移动(保持高度不变)\r\n */\r\n private computeHorizontalMove(screenPosition: { x: number; y: number }): Cesium.Cartesian3 | null {\r\n if (!this.dragState) return null;\r\n\r\n try {\r\n const C = this.CesiumNS as any;\r\n const scene = this.viewer.scene as any;\r\n const camera = this.viewer.camera as any;\r\n\r\n // 获取射线\r\n const ray = camera.getPickRay(screenPosition);\r\n if (!ray) return null;\r\n\r\n // 创建固定高度的平面(以地球中心为原点,法向量为起始位置的方向)\r\n const height = this.dragState.startHeight;\r\n \r\n // 使用地球表面射线交点方法\r\n const globe = scene.globe;\r\n if (!globe) return null;\r\n\r\n // 先获取射线与地球表面的交点\r\n const surfacePosition = globe.pick(ray, scene);\r\n if (!surfacePosition) return null;\r\n\r\n // 转换为经纬高\r\n const surfaceCartographic = C.Cartographic.fromCartesian(surfacePosition);\r\n \r\n // 保持原高度,使用新的经纬度\r\n const newPosition = C.Cartesian3.fromRadians(\r\n surfaceCartographic.longitude,\r\n surfaceCartographic.latitude,\r\n height\r\n );\r\n\r\n return newPosition;\r\n } catch (error) {\r\n console.error('Error computing horizontal move:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 计算垂直移动(保持经纬度不变)\r\n */\r\n private computeVerticalMove(screenPosition: { x: number; y: number }): Cesium.Cartesian3 | null {\r\n if (!this.dragState) return null;\r\n\r\n try {\r\n const C = this.CesiumNS as any;\r\n\r\n // 计算屏幕垂直方向的移动距离\r\n const deltaY = screenPosition.y - this.dragState.startScreenPosition.y;\r\n\r\n // 转换为高度变化(负数因为屏幕 Y 轴向下,高度向上)\r\n // 比例因子:根据相机距离调整灵敏度\r\n const cameraHeight = (this.viewer.camera as any).positionCartographic.height;\r\n const scaleFactor = Math.max(cameraHeight / 1000, 0.5); // 动态调整灵敏度\r\n const heightDelta = -deltaY * scaleFactor;\r\n\r\n // 计算新高度(限制最小高度)\r\n const newHeight = Math.max(this.minHeight, this.dragState.startHeight + heightDelta);\r\n\r\n // 使用原经纬度和新高度创建新位置\r\n const newPosition = C.Cartesian3.fromDegrees(\r\n this.dragState.startLonLat.lon,\r\n this.dragState.startLonLat.lat,\r\n newHeight\r\n );\r\n\r\n return newPosition;\r\n } catch (error) {\r\n console.error('Error computing vertical move:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 结束拖动\r\n */\r\n endDrag(): void {\r\n if (!this.dragState) {\r\n return;\r\n }\r\n\r\n try {\r\n const positions = this.callbacks.getPositions?.() || [];\r\n const finalPosition = positions[this.dragState.draggedVertexIndex];\r\n\r\n if (finalPosition && this.callbacks.onDragEnd) {\r\n this.callbacks.onDragEnd(this.dragState.draggedVertexIndex, finalPosition);\r\n }\r\n } catch (error) {\r\n console.error('Error ending vertex drag:', error);\r\n } finally {\r\n // 恢复相机控制器\r\n this.enableCameraController();\r\n \r\n this.dragState = null;\r\n this.updateCursor();\r\n }\r\n }\r\n\r\n /**\r\n * 取消拖动(恢复原位置)\r\n */\r\n cancelDrag(): void {\r\n if (!this.dragState) {\r\n return;\r\n }\r\n\r\n try {\r\n if (this.callbacks.onDragMove && this.dragState.startPosition) {\r\n this.callbacks.onDragMove(\r\n this.dragState.draggedVertexIndex,\r\n this.dragState.startPosition\r\n );\r\n }\r\n } catch (error) {\r\n console.error('Error canceling vertex drag:', error);\r\n } finally {\r\n // 恢复相机控制器\r\n this.enableCameraController();\r\n \r\n this.dragState = null;\r\n this.updateCursor();\r\n }\r\n }\r\n\r\n /**\r\n * 检查是否正在拖动\r\n */\r\n isDragging(): boolean {\r\n return this.dragState !== null && this.dragState.isDragging;\r\n }\r\n\r\n /**\r\n * 获取当前拖动的顶点索引\r\n */\r\n getDraggedVertexIndex(): number | undefined {\r\n return this.dragState?.draggedVertexIndex;\r\n }\r\n\r\n /**\r\n * 销毁处理器\r\n */\r\n destroy(): void {\r\n // 如果正在拖动,恢复相机控制器\r\n if (this.dragState?.isDragging) {\r\n this.enableCameraController();\r\n }\r\n\r\n // 移除键盘监听器\r\n if (this.keydownHandler) {\r\n window.removeEventListener('keydown', this.keydownHandler);\r\n }\r\n if (this.keyupHandler) {\r\n window.removeEventListener('keyup', this.keyupHandler);\r\n }\r\n\r\n // 恢复光标\r\n this.canvas.style.cursor = '';\r\n\r\n // 清除拖动状态\r\n this.dragState = null;\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { ContextMenuManager } from './ContextMenuManager';\r\nimport type { MenuItem } from './ContextMenuManager';\r\nimport { pickVertexIndex } from './PathEditingUtils';\r\nimport type { AirplaneCursor } from '../AirplaneCursor.ts';\r\nimport { VertexDragHandler } from './VertexDragHandler';\r\nimport type { VertexDetailInfo, VertexOperationInfo } from './VertexDetailInfo';\r\n\r\n/**\r\n * 事件处理器配置选项\r\n */\r\nexport interface PathEditingEventHandlerOptions {\r\n /** Cesium 命名空间 */\r\n CesiumNS: typeof Cesium;\r\n /** Cesium Viewer 实例 */\r\n viewer: Cesium.Viewer;\r\n /** 隐藏爬升点索引 */\r\n hiddenClimbIndex?: number;\r\n /** 航点最小高度(米),默认 0,航点不能低于此高度 */\r\n minHeight?: number;\r\n}\r\n\r\n/**\r\n * 事件回调函数\r\n */\r\nexport interface PathEditingEventCallbacks {\r\n /** 顶点选择回调 */\r\n onVertexSelect?: (index: number) => void;\r\n /** 顶点选中详细信息回调 */\r\n onVertexSelectDetail?: (info: VertexDetailInfo) => void;\r\n /** 插入顶点回调 */\r\n onInsertVertex?: (\r\n insertAt: number,\r\n position: Cesium.Cartesian3,\r\n pose: { heading: number; pitch: number; roll: number },\r\n ) => void;\r\n /** 顶点插入完成详细信息回调 */\r\n onVertexInsertDetail?: (info: VertexOperationInfo) => void;\r\n /** 删除顶点回调 */\r\n onDeleteVertex?: (index: number) => void;\r\n /** 顶点删除完成详细信息回调 */\r\n onVertexDeleteDetail?: (info: VertexOperationInfo) => void;\r\n /** 顶点拖动开始回调 */\r\n onVertexDragStart?: (index: number) => void;\r\n /** 顶点拖动中回调(实时更新位置) */\r\n onVertexDragMove?: (index: number, newPosition: Cesium.Cartesian3) => void;\r\n /** 顶点拖动结束回调 */\r\n onVertexDragEnd?: (index: number, finalPosition: Cesium.Cartesian3) => void;\r\n /** 顶点拖动完成详细信息回调 */\r\n onVertexDragCompleteDetail?: (info: VertexOperationInfo) => void;\r\n /** 获取当前选中索引 */\r\n getActiveIndex?: () => number | undefined;\r\n /** 获取所有位置 */\r\n getPositions?: () => Cesium.Cartesian3[];\r\n /** 获取飞机游标 */\r\n getAirplaneCursor?: () => AirplaneCursor | undefined;\r\n /** 获取姿态数据 */\r\n getPoseData?: () => {\r\n headings: number[];\r\n pitches: number[];\r\n rolls: number[];\r\n fovs: number[];\r\n };\r\n /** 获取实体引用 */\r\n getEntity?: () => Cesium.Entity | undefined;\r\n /** 🆕 获取快速编辑是否启用 */\r\n getQuickEditEnabled?: () => boolean;\r\n /** 🆕 获取快速编辑选项 */\r\n getQuickEditOptions?: () => {\r\n climbHeight: number;\r\n altitudeMode: string;\r\n };\r\n /** 模拟按键控制飞机游标(用于虚拟控制器) */\r\n simulateKeyPress?: (key: string, duration?: number) => void;\r\n /** 获取游标当前姿态(包含高度) */\r\n getCursorPose?: () => { position: any; heading: number; pitch: number; roll: number; altitude: number } | undefined;\r\n}\r\n\r\n/**\r\n * 路径编辑事件处理器\r\n * 负责处理用户交互事件(左键点击、右键菜单等)\r\n */\r\nexport class PathEditingEventHandler {\r\n private CesiumNS: typeof Cesium;\r\n private viewer: Cesium.Viewer;\r\n private hiddenClimbIndex?: number;\r\n private handler: any;\r\n private contextMenuManager: ContextMenuManager;\r\n private vertexDragHandler: VertexDragHandler;\r\n private callbacks: PathEditingEventCallbacks;\r\n private keydownListener?: (e: KeyboardEvent) => void;\r\n\r\n constructor(options: PathEditingEventHandlerOptions, callbacks: PathEditingEventCallbacks) {\r\n this.CesiumNS = options.CesiumNS;\r\n this.viewer = options.viewer;\r\n this.hiddenClimbIndex = options.hiddenClimbIndex;\r\n this.callbacks = callbacks;\r\n\r\n const C = this.CesiumNS as any;\r\n this.handler = new C.ScreenSpaceEventHandler((this.viewer.scene as any).canvas);\r\n this.contextMenuManager = new ContextMenuManager();\r\n\r\n // 创建顶点拖动处理器\r\n this.vertexDragHandler = new VertexDragHandler(\r\n {\r\n CesiumNS: this.CesiumNS,\r\n viewer: this.viewer,\r\n hiddenClimbIndex: this.hiddenClimbIndex,\r\n minHeight: options.minHeight,\r\n },\r\n {\r\n onDragStart: (index) => {\r\n if (this.callbacks.onVertexDragStart) {\r\n this.callbacks.onVertexDragStart(index);\r\n }\r\n },\r\n onDragMove: (index, newPosition) => {\r\n if (this.callbacks.onVertexDragMove) {\r\n this.callbacks.onVertexDragMove(index, newPosition);\r\n }\r\n },\r\n onDragEnd: (index, finalPosition) => {\r\n if (this.callbacks.onVertexDragEnd) {\r\n this.callbacks.onVertexDragEnd(index, finalPosition);\r\n }\r\n },\r\n getPositions: () => this.callbacks.getPositions?.() || [],\r\n },\r\n );\r\n\r\n this.setupEventHandlers();\r\n }\r\n\r\n /**\r\n * 设置所有事件处理器\r\n */\r\n private setupEventHandlers(): void {\r\n const C = this.CesiumNS as any;\r\n\r\n // LEFT_DOWN: 检测拖动或选择顶点\r\n this.handler.setInputAction((movement: any) => {\r\n const scene = this.viewer.scene as any;\r\n const picked = scene.pick?.(movement.position);\r\n const entity = picked?.id as any;\r\n const currentActiveIndex = this.callbacks.getActiveIndex?.();\r\n\r\n // 优先检查是否点击了顶点标签\r\n if (entity?.properties?._type?.getValue?.() === 'vertex-label') {\r\n const index = entity.properties._vertexIndex?.getValue?.();\r\n if (typeof index === 'number') {\r\n // 判断是否点击的是已选中的顶点\r\n if (currentActiveIndex === index) {\r\n // 点击已选中的顶点 → 开始拖动\r\n this.vertexDragHandler.startDrag(index, movement.position);\r\n } else {\r\n // 点击未选中的顶点 → 仅选中该顶点(标签变蓝)\r\n if (this.callbacks.onVertexSelect) {\r\n this.callbacks.onVertexSelect(index);\r\n }\r\n // 触发详细信息回调\r\n console.log('[PathEditingEventHandler] 顶点被点击,索引:', index, '回调存在:', !!this.callbacks.onVertexSelectDetail);\r\n if (this.callbacks.onVertexSelectDetail) {\r\n try {\r\n const detailInfo = this.buildVertexDetailInfo(index);\r\n console.log('[PathEditingEventHandler] 调用 onVertexSelectDetail 回调');\r\n this.callbacks.onVertexSelectDetail(detailInfo);\r\n } catch (error) {\r\n console.error('[PathEditingEventHandler] Error building vertex detail info:', error);\r\n }\r\n }\r\n }\r\n return;\r\n }\r\n }\r\n\r\n // 检查是否点击了顶点句柄(选择顶点)\r\n const idx = pickVertexIndex(this.viewer, movement.position, this.hiddenClimbIndex);\r\n if (typeof idx === 'number') {\r\n if (this.callbacks.onVertexSelect) {\r\n this.callbacks.onVertexSelect(idx);\r\n }\r\n // 触发详细信息回调\r\n if (this.callbacks.onVertexSelectDetail) {\r\n try {\r\n const detailInfo = this.buildVertexDetailInfo(idx);\r\n this.callbacks.onVertexSelectDetail(detailInfo);\r\n } catch (error) {\r\n console.error('Error building vertex detail info:', error);\r\n }\r\n }\r\n }\r\n }, C.ScreenSpaceEventType.LEFT_DOWN);\r\n\r\n // MOUSE_MOVE: 处理拖动\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.vertexDragHandler.isDragging()) {\r\n this.vertexDragHandler.handleMove(movement.endPosition);\r\n }\r\n }, C.ScreenSpaceEventType.MOUSE_MOVE);\r\n\r\n // LEFT_UP: 结束拖动\r\n this.handler.setInputAction(() => {\r\n if (this.vertexDragHandler.isDragging()) {\r\n this.vertexDragHandler.endDrag();\r\n }\r\n }, C.ScreenSpaceEventType.LEFT_UP);\r\n\r\n // LEFT_CLICK: 选择顶点或快速编辑添加顶点\r\n this.handler.setInputAction((movement: any) => {\r\n // 如果刚刚结束拖动,不触发选择\r\n if (this.vertexDragHandler.isDragging()) {\r\n return;\r\n }\r\n\r\n // 1. 优先检查是否点击了顶点\r\n const idx = pickVertexIndex(this.viewer, movement.position, this.hiddenClimbIndex);\r\n if (typeof idx === 'number') {\r\n // 点击了顶点,执行选择逻辑\r\n if (this.callbacks.onVertexSelect) {\r\n this.callbacks.onVertexSelect(idx);\r\n }\r\n // 触发详细信息回调\r\n if (this.callbacks.onVertexSelectDetail) {\r\n try {\r\n const detailInfo = this.buildVertexDetailInfo(idx);\r\n this.callbacks.onVertexSelectDetail(detailInfo);\r\n } catch (error) {\r\n console.error('Error building vertex detail info:', error);\r\n }\r\n }\r\n return; // 💡 重要:点击了顶点就返回,不执行快速编辑\r\n }\r\n\r\n // 2. 🆕 检查快速编辑模式\r\n const quickEditEnabled = this.callbacks.getQuickEditEnabled?.();\r\n if (quickEditEnabled) {\r\n // 快速编辑模式:点击地图添加顶点\r\n this.handleQuickEditClick(movement);\r\n return;\r\n }\r\n\r\n // 3. 默认:不做任何操作\r\n }, C.ScreenSpaceEventType.LEFT_CLICK);\r\n\r\n // RIGHT_CLICK: 显示上下文菜单或取消拖动\r\n this.handler.setInputAction((movement: any) => {\r\n // 如果正在拖动,取消拖动\r\n if (this.vertexDragHandler.isDragging()) {\r\n this.vertexDragHandler.cancelDrag();\r\n return;\r\n }\r\n\r\n this.handleRightClick(movement);\r\n }, C.ScreenSpaceEventType.RIGHT_CLICK);\r\n\r\n // SPACE: 快捷键在飞机游标位置添加航点到末尾\r\n this.keydownListener = (e: KeyboardEvent) => {\r\n // 仅处理空格键\r\n if (e.code !== 'Space') return;\r\n \r\n // 防止与输入框冲突\r\n const target = e.target as HTMLElement;\r\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\r\n return;\r\n }\r\n \r\n // 正在拖动时忽略\r\n if (this.vertexDragHandler.isDragging()) return;\r\n \r\n // 阻止默认行为(页面滚动)\r\n e.preventDefault();\r\n \r\n // 执行快捷插入\r\n this.handleSpaceKeyInsert();\r\n };\r\n \r\n document.addEventListener('keydown', this.keydownListener);\r\n }\r\n\r\n /**\r\n * 处理空格键快捷插入航点\r\n * 在飞机游标当前位置,将航点添加到所有航点末尾\r\n */\r\n private handleSpaceKeyInsert(): void {\r\n // 获取飞机游标\r\n const airplaneCursor = this.callbacks.getAirplaneCursor?.();\r\n if (!airplaneCursor) {\r\n console.warn('[PathEditingEventHandler] 空格键插入:飞机游标不存在');\r\n return;\r\n }\r\n\r\n // 获取当前姿态\r\n const pose = airplaneCursor.getPose();\r\n if (!pose || !pose.position) {\r\n console.warn('[PathEditingEventHandler] 空格键插入:无法获取游标姿态');\r\n return;\r\n }\r\n\r\n // 计算插入位置(末尾)\r\n const positions = this.callbacks.getPositions?.() || [];\r\n const insertAt = positions.length;\r\n\r\n console.log('[PathEditingEventHandler] 空格键快捷插入航点,位置索引:', insertAt);\r\n\r\n // 调用插入方法\r\n this.handleInsertVertex(insertAt, pose, 'after');\r\n }\r\n\r\n /**\r\n * 处理右键点击事件\r\n * 判断点击目标是飞机游标还是顶点\r\n * 如果是飞机游标,显示插入菜单:添加第一个航点、插入到选中点前/后\r\n * 如果是顶点,显示菜单:删除航点(顶点)\r\n */\r\n private handleRightClick(movement: any): void {\r\n this.contextMenuManager.hide();\r\n\r\n try {\r\n const picked = (this.viewer.scene as any).pick?.(movement.position);\r\n const entity = picked?.id as any;\r\n const airplaneCursor = this.callbacks.getAirplaneCursor?.();\r\n\r\n // 检查是否点击了顶点\r\n const vertexIndex = pickVertexIndex(this.viewer, movement.position, this.hiddenClimbIndex);\r\n\r\n // 将 canvas 坐标转换为视口坐标\r\n const viewportPosition = this.canvasToViewportPosition(movement.position);\r\n\r\n if (typeof vertexIndex === 'number') {\r\n // 点击了顶点,显示删除菜单\r\n const menuItems = this.buildVertexContextMenuItems(vertexIndex);\r\n this.contextMenuManager.show(viewportPosition, menuItems);\r\n } else if (airplaneCursor && airplaneCursor.containsEntity(entity)) {\r\n // 检查是否点击了飞机游标,显示插入菜单\r\n const menuItems = this.buildAirplaneCursorContextMenuItems();\r\n this.contextMenuManager.show(viewportPosition, menuItems);\r\n }\r\n } catch (error) {\r\n console.error('Error handling right click:', error);\r\n }\r\n }\r\n\r\n /**\r\n * 构建飞机游标的上下文菜单项(插入航点)\r\n */\r\n private buildAirplaneCursorContextMenuItems(): MenuItem[] {\r\n const menuItems: MenuItem[] = [];\r\n const activeIndex = this.callbacks.getActiveIndex?.();\r\n const airplaneCursor = this.callbacks.getAirplaneCursor?.();\r\n const positions = this.callbacks.getPositions?.() || [];\r\n\r\n if (!airplaneCursor) {\r\n return [\r\n {\r\n label: '未选择顶点',\r\n action: () => {},\r\n disabled: true,\r\n },\r\n ];\r\n }\r\n\r\n const pose = airplaneCursor.getPose();\r\n const visibleVertexCount = positions.length - (this.hiddenClimbIndex === 1 ? 1 : 0);\r\n\r\n if (activeIndex !== undefined && pose) {\r\n // 已选中顶点,显示插入选项\r\n menuItems.push({\r\n label: '插入到选中点前',\r\n action: () => {\r\n this.handleInsertVertex(activeIndex, pose, 'before');\r\n },\r\n });\r\n\r\n menuItems.push({\r\n label: '插入到选中点后',\r\n action: () => {\r\n this.handleInsertVertex(activeIndex + 1, pose, 'after');\r\n },\r\n });\r\n } else if (pose && visibleVertexCount <= 1) {\r\n // 仅有起始点,允许添加第一个航点\r\n menuItems.push({\r\n label: '添加第一个航点',\r\n action: () => {\r\n let insertAt = positions.length;\r\n if (this.hiddenClimbIndex === 1) {\r\n insertAt = 2;\r\n } else {\r\n insertAt = 1;\r\n }\r\n if (insertAt > positions.length) {\r\n insertAt = positions.length;\r\n }\r\n this.handleInsertVertex(insertAt, pose, 'first');\r\n },\r\n });\r\n } else {\r\n menuItems.push({\r\n label: '未选择顶点',\r\n action: () => {},\r\n disabled: true,\r\n });\r\n }\r\n\r\n return menuItems;\r\n }\r\n\r\n /**\r\n * 构建顶点的上下文菜单项(删除航点)\r\n */\r\n private buildVertexContextMenuItems(vertexIndex: number): MenuItem[] {\r\n const menuItems: MenuItem[] = [];\r\n const positions = this.callbacks.getPositions?.() || [];\r\n\r\n // 计算可见顶点数量(排除隐藏爬升点)\r\n const visibleVertexCount = positions.length - (this.hiddenClimbIndex === 1 ? 1 : 0);\r\n\r\n // 判断是否可以删除(至少保留起点)\r\n const canDelete = visibleVertexCount > 1;\r\n\r\n // 判断是否为起点(索引0或隐藏爬升点后的第一个可见点)\r\n const isStartPoint = vertexIndex === 0 || (this.hiddenClimbIndex === 1 && vertexIndex === 1);\r\n\r\n if (canDelete && !isStartPoint) {\r\n menuItems.push({\r\n label: `删除航点 ${this.getVertexDisplayNumber(vertexIndex)}`,\r\n action: () => {\r\n this.handleDeleteVertex(vertexIndex);\r\n },\r\n });\r\n } else if (isStartPoint) {\r\n menuItems.push({\r\n label: '起点不可删除',\r\n action: () => {},\r\n disabled: true,\r\n });\r\n } else {\r\n menuItems.push({\r\n label: '至少保留一个航点',\r\n action: () => {},\r\n disabled: true,\r\n });\r\n }\r\n\r\n return menuItems;\r\n }\r\n\r\n /**\r\n * 获取顶点的显示编号(跳过隐藏爬升点)\r\n */\r\n private getVertexDisplayNumber(index: number): number {\r\n if (this.hiddenClimbIndex === 1 && index > 1) {\r\n return index - 1;\r\n }\r\n return index;\r\n }\r\n\r\n /**\r\n * 构建顶点详细信息\r\n */\r\n private buildVertexDetailInfo(index: number): VertexDetailInfo {\r\n const positions = this.callbacks.getPositions?.() || [];\r\n const poseData = this.callbacks.getPoseData?.();\r\n const entity = this.callbacks.getEntity?.();\r\n \r\n const position = positions[index];\r\n const C = this.CesiumNS as any;\r\n \r\n // 转换为经纬度高度\r\n let coordinates = { longitude: 0, latitude: 0, height: 0 };\r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(position);\r\n coordinates = {\r\n longitude: C.Math.toDegrees(cartographic.longitude),\r\n latitude: C.Math.toDegrees(cartographic.latitude),\r\n height: cartographic.height,\r\n };\r\n } catch {}\r\n \r\n // 姿态信息\r\n let pose: VertexDetailInfo['pose'] | undefined;\r\n if (poseData) {\r\n pose = {\r\n heading: poseData.headings[index] ?? 0,\r\n pitch: poseData.pitches[index] ?? 0,\r\n roll: poseData.rolls[index] ?? 0,\r\n fov: poseData.fovs[index] ?? 50,\r\n };\r\n }\r\n \r\n // 计算可见顶点数量\r\n const totalVertices = positions.length;\r\n const totalVisibleVertices = totalVertices - (this.hiddenClimbIndex === 1 ? 1 : 0);\r\n \r\n // 判断是否为起点\r\n const isStartPoint = index === 0 || (this.hiddenClimbIndex === 1 && index === 1);\r\n \r\n // 判断是否为隐藏爬升点\r\n const isHiddenClimb = this.hiddenClimbIndex === 1 && index === 1;\r\n \r\n // 判断是否可删除\r\n const canDelete = totalVisibleVertices > 1 && !isStartPoint;\r\n \r\n // 提取路径属性\r\n let pathProperties: VertexDetailInfo['pathProperties'] | undefined;\r\n if (entity) {\r\n try {\r\n const props: any = (entity as any).properties;\r\n pathProperties = {\r\n altitudeMode: props?._altitudeMode?.getValue?.() ?? props?._altitudeMode,\r\n climbHeight: props?._climbHeight?.getValue?.() ?? props?._climbHeight,\r\n hasHiddenClimb: props?._hasHiddenClimb?.getValue?.() ?? props?._hasHiddenClimb,\r\n };\r\n } catch {}\r\n }\r\n \r\n return {\r\n index,\r\n displayNumber: this.getVertexDisplayNumber(index),\r\n position,\r\n coordinates,\r\n pose,\r\n isStartPoint,\r\n isHiddenClimb,\r\n canDelete,\r\n totalVisibleVertices,\r\n totalVertices,\r\n entity,\r\n pathProperties,\r\n };\r\n }\r\n\r\n /**\r\n * 构建顶点操作信息\r\n */\r\n private buildVertexOperationInfo(\r\n type: 'insert' | 'delete' | 'move' | 'select',\r\n index: number,\r\n options?: {\r\n totalBefore?: number;\r\n totalAfter?: number;\r\n newVertex?: VertexDetailInfo;\r\n newPosition?: Cesium.Cartesian3;\r\n },\r\n ): VertexOperationInfo {\r\n const positions = this.callbacks.getPositions?.() || [];\r\n const totalVertices = positions.length;\r\n \r\n return {\r\n type,\r\n index,\r\n displayNumber: this.getVertexDisplayNumber(index),\r\n totalVerticesBefore: options?.totalBefore ?? totalVertices,\r\n totalVerticesAfter: options?.totalAfter ?? totalVertices,\r\n newVertex: options?.newVertex,\r\n newPosition: options?.newPosition,\r\n timestamp: new Date(),\r\n };\r\n }\r\n\r\n /**\r\n * 处理插入顶点\r\n */\r\n private handleInsertVertex(\r\n insertAt: number,\r\n pose: { position: Cesium.Cartesian3; heading: number; pitch: number; roll: number },\r\n type: 'before' | 'after' | 'first',\r\n ): void {\r\n // 跳过隐藏爬升点\r\n if (this.hiddenClimbIndex === 1 && insertAt <= 1) {\r\n insertAt = 2;\r\n }\r\n\r\n if (this.callbacks.onInsertVertex) {\r\n this.callbacks.onInsertVertex(insertAt, pose.position, {\r\n heading: pose.heading,\r\n pitch: pose.pitch,\r\n roll: pose.roll,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 处理删除顶点\r\n */\r\n private handleDeleteVertex(index: number): void {\r\n if (this.callbacks.onDeleteVertex) {\r\n this.callbacks.onDeleteVertex(index);\r\n }\r\n }\r\n\r\n /**\r\n * 更新回调函数\r\n */\r\n updateCallbacks(callbacks: Partial<PathEditingEventCallbacks>): void {\r\n this.callbacks = { ...this.callbacks, ...callbacks };\r\n }\r\n\r\n /**\r\n * 隐藏上下文菜单\r\n */\r\n hideContextMenu(): void {\r\n this.contextMenuManager.hide();\r\n }\r\n\r\n /**\r\n * 🆕 处理快速编辑模式的点击\r\n */\r\n private handleQuickEditClick(movement: any): void {\r\n // 1. 获取点击位置\r\n const position = this.getPositionFromMouse(movement);\r\n if (!position) {\r\n console.warn('[QuickEdit] 无法获取点击位置');\r\n return;\r\n }\r\n\r\n // 2. 获取快速编辑选项\r\n const quickEditOptions = this.callbacks.getQuickEditOptions?.();\r\n if (!quickEditOptions) return;\r\n\r\n const { climbHeight, altitudeMode } = quickEditOptions;\r\n\r\n // 🐛 调试:显示原始点击高度\r\n const C = this.CesiumNS as any;\r\n const originalCarto = C.Cartographic.fromCartesian(position);\r\n const originalHeight = originalCarto.height;\r\n\r\n // 3. 计算新顶点位置(应用爬升高度)\r\n const newPosition = this.applyClimbHeight(position, climbHeight, altitudeMode);\r\n\r\n // 🐛 调试:显示计算后的高度\r\n const newCarto = C.Cartographic.fromCartesian(newPosition);\r\n const newHeight = newCarto.height;\r\n\r\n // 4. 获取当前位置数组\r\n const positions = this.callbacks.getPositions?.() || [];\r\n const insertAt = positions.length; // 插入到末尾\r\n\r\n // 5. 计算航向角(从上一个点指向新点)\r\n let heading = 0;\r\n if (positions.length > 0) {\r\n const lastPosition = positions[positions.length - 1];\r\n heading = this.calculateHeading(lastPosition, newPosition);\r\n }\r\n\r\n // 6. 调用插入顶点回调\r\n if (this.callbacks.onInsertVertex) {\r\n console.log('[QuickEdit] 添加新顶点:', {\r\n insertAt,\r\n heading: heading.toFixed(2),\r\n altitudeMode,\r\n climbHeight,\r\n originalHeight: originalHeight.toFixed(2),\r\n finalHeight: newHeight.toFixed(2),\r\n });\r\n\r\n this.callbacks.onInsertVertex(insertAt, newPosition, {\r\n heading,\r\n pitch: -10, // 默认俯仰角\r\n roll: 0,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 🆕 应用爬升高度到位置\r\n */\r\n private applyClimbHeight(\r\n position: Cesium.Cartesian3,\r\n climbHeight: number,\r\n altitudeMode: string\r\n ): Cesium.Cartesian3 {\r\n const C = this.CesiumNS as any;\r\n\r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(position);\r\n const lon = C.Math.toDegrees(cartographic.longitude);\r\n const lat = C.Math.toDegrees(cartographic.latitude);\r\n let height = cartographic.height;\r\n\r\n // 根据高度模式计算最终高度\r\n if (altitudeMode === 'relativeToGround' || altitudeMode === 'relativeToStart') {\r\n // 相对模式:在点击位置的高度上增加 climbHeight\r\n height += climbHeight;\r\n } else if (altitudeMode === 'absolute') {\r\n // 绝对模式:直接使用 climbHeight 作为绝对高度值\r\n height = climbHeight;\r\n }\r\n\r\n return C.Cartesian3.fromDegrees(lon, lat, height);\r\n } catch (error) {\r\n console.error('[QuickEdit] 高度计算失败:', error);\r\n return position;\r\n }\r\n }\r\n\r\n /**\r\n * 🆕 计算航向角\r\n */\r\n private calculateHeading(from: Cesium.Cartesian3, to: Cesium.Cartesian3): number {\r\n const C = this.CesiumNS as any;\r\n\r\n try {\r\n const fromCarto = C.Cartographic.fromCartesian(from);\r\n const toCarto = C.Cartographic.fromCartesian(to);\r\n\r\n const deltaLon = toCarto.longitude - fromCarto.longitude;\r\n\r\n let heading = Math.atan2(\r\n Math.sin(deltaLon) * Math.cos(toCarto.latitude),\r\n Math.cos(fromCarto.latitude) * Math.sin(toCarto.latitude) -\r\n Math.sin(fromCarto.latitude) * Math.cos(toCarto.latitude) * Math.cos(deltaLon)\r\n );\r\n\r\n heading = C.Math.toDegrees(heading);\r\n\r\n // 归一化到 [-180, 180]\r\n if (heading > 180) heading -= 360;\r\n if (heading < -180) heading += 360;\r\n\r\n return heading;\r\n } catch (error) {\r\n console.error('[QuickEdit] 航向角计算失败:', error);\r\n return 0;\r\n }\r\n }\r\n\r\n /**\r\n * 将 canvas 坐标转换为视口坐标\r\n * Cesium 事件返回的坐标是相对于 canvas 的,而菜单需要相对于视口的坐标\r\n */\r\n private canvasToViewportPosition(canvasPosition: { x: number; y: number }): { x: number; y: number } {\r\n const canvas = (this.viewer.scene as any).canvas as HTMLCanvasElement;\r\n const rect = canvas.getBoundingClientRect();\r\n return {\r\n x: canvasPosition.x + rect.left,\r\n y: canvasPosition.y + rect.top,\r\n };\r\n }\r\n\r\n /**\r\n * 🆕 从鼠标事件获取位置\r\n */\r\n private getPositionFromMouse(movement: any): Cesium.Cartesian3 | undefined {\r\n const scene = this.viewer.scene as any;\r\n const winPos = movement?.position;\r\n if (!winPos) return undefined;\r\n\r\n let cart: any | undefined;\r\n try {\r\n // 优先使用 pickPosition(深度缓冲)\r\n cart = scene.pickPosition?.(winPos);\r\n } catch {}\r\n\r\n if (!cart) {\r\n // 回退到 globe.pick\r\n try {\r\n const ray = this.viewer.camera.getPickRay?.(winPos);\r\n cart = ray ? scene.globe?.pick?.(ray, scene) : undefined;\r\n } catch {}\r\n }\r\n\r\n return cart;\r\n }\r\n\r\n /**\r\n * 销毁事件处理器\r\n */\r\n destroy(): void {\r\n // 移除键盘事件监听器\r\n if (this.keydownListener) {\r\n document.removeEventListener('keydown', this.keydownListener);\r\n this.keydownListener = undefined;\r\n }\r\n\r\n try {\r\n this.vertexDragHandler.destroy();\r\n } catch {}\r\n\r\n try {\r\n this.contextMenuManager.destroy();\r\n } catch {}\r\n\r\n try {\r\n this.handler?.destroy();\r\n } catch {}\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\n/**\r\n * 顶点句柄样式配置\r\n */\r\nexport interface VertexHandleStyle {\r\n pixelSize: number;\r\n color: Cesium.Color;\r\n outlineColor: Cesium.Color;\r\n outlineWidth: number;\r\n}\r\n\r\n/**\r\n * 顶点句柄样式选项\r\n */\r\nexport interface VertexHandleStyleOptions {\r\n /** 普通状态样式 */\r\n normal?: Partial<VertexHandleStyle>;\r\n /** 编辑状态样式 */\r\n edited?: Partial<VertexHandleStyle>;\r\n /** 选中状态样式 */\r\n selected?: Partial<VertexHandleStyle>;\r\n}\r\n\r\n/**\r\n * 顶点句柄状态\r\n */\r\nexport type VertexHandleState = 'normal' | 'edited' | 'selected';\r\n\r\n/**\r\n * 顶点句柄样式管理器\r\n * 负责管理路径编辑中顶点句柄的样式(普通、编辑、选中)\r\n */\r\nexport class VertexHandleStyleManager {\r\n private normalStyle: VertexHandleStyle;\r\n private editedStyle: VertexHandleStyle;\r\n private selectedStyle: VertexHandleStyle;\r\n\r\n constructor(CesiumNS: typeof Cesium, options?: VertexHandleStyleOptions) {\r\n const C = CesiumNS as any;\r\n\r\n // 默认样式配置\r\n this.normalStyle = {\r\n pixelSize: options?.normal?.pixelSize ?? 10,\r\n color: options?.normal?.color ?? C.Color.YELLOW,\r\n outlineColor: options?.normal?.outlineColor ?? C.Color.BLACK,\r\n outlineWidth: options?.normal?.outlineWidth ?? 1,\r\n };\r\n\r\n this.editedStyle = {\r\n pixelSize: options?.edited?.pixelSize ?? 10,\r\n color: options?.edited?.color ?? C.Color.CYAN,\r\n outlineColor: options?.edited?.outlineColor ?? C.Color.BLACK,\r\n outlineWidth: options?.edited?.outlineWidth ?? 1,\r\n };\r\n\r\n this.selectedStyle = {\r\n pixelSize: options?.selected?.pixelSize ?? 14,\r\n color: options?.selected?.color ?? C.Color.ORANGE,\r\n outlineColor: options?.selected?.outlineColor ?? C.Color.BLACK,\r\n outlineWidth: options?.selected?.outlineWidth ?? 2,\r\n };\r\n }\r\n\r\n /**\r\n * 应用样式到顶点句柄\r\n * @param handle 顶点句柄实体\r\n * @param state 状态类型\r\n */\r\n applyStyle(handle: Cesium.Entity, state: VertexHandleState): void {\r\n const style = this.getStyleByState(state);\r\n this.applyHandleStyle(handle, style);\r\n }\r\n\r\n /**\r\n * 根据状态获取样式\r\n */\r\n private getStyleByState(state: VertexHandleState): VertexHandleStyle {\r\n switch (state) {\r\n case 'normal':\r\n return this.normalStyle;\r\n case 'edited':\r\n return this.editedStyle;\r\n case 'selected':\r\n return this.selectedStyle;\r\n default:\r\n return this.normalStyle;\r\n }\r\n }\r\n\r\n /**\r\n * 应用样式到句柄\r\n */\r\n private applyHandleStyle(handle: Cesium.Entity, style: VertexHandleStyle): void {\r\n try {\r\n const point = (handle as any).point;\r\n if (!point) return;\r\n\r\n if (style.pixelSize !== undefined) {\r\n point.pixelSize = style.pixelSize;\r\n }\r\n if (style.color !== undefined) {\r\n point.color = style.color;\r\n }\r\n if (style.outlineColor !== undefined) {\r\n point.outlineColor = style.outlineColor;\r\n }\r\n if (style.outlineWidth !== undefined) {\r\n point.outlineWidth = style.outlineWidth;\r\n }\r\n } catch (error) {\r\n console.error('Failed to apply handle style:', error);\r\n }\r\n }\r\n\r\n /**\r\n * 根据编辑状态获取句柄状态\r\n * @param isEdited 是否已编辑\r\n * @param isSelected 是否选中\r\n */\r\n getHandleState(isEdited: boolean, isSelected: boolean): VertexHandleState {\r\n if (isSelected) return 'selected';\r\n if (isEdited) return 'edited';\r\n return 'normal';\r\n }\r\n\r\n /**\r\n * 更新样式配置\r\n */\r\n updateStyles(options: VertexHandleStyleOptions): void {\r\n if (options.normal) {\r\n this.normalStyle = {\r\n ...this.normalStyle,\r\n ...options.normal,\r\n };\r\n }\r\n\r\n if (options.edited) {\r\n this.editedStyle = {\r\n ...this.editedStyle,\r\n ...options.edited,\r\n };\r\n }\r\n\r\n if (options.selected) {\r\n this.selectedStyle = {\r\n ...this.selectedStyle,\r\n ...options.selected,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 获取普通样式\r\n */\r\n getNormalStyle(): VertexHandleStyle {\r\n return { ...this.normalStyle };\r\n }\r\n\r\n /**\r\n * 获取编辑样式\r\n */\r\n getEditedStyle(): VertexHandleStyle {\r\n return { ...this.editedStyle };\r\n }\r\n\r\n /**\r\n * 获取选中样式\r\n */\r\n getSelectedStyle(): VertexHandleStyle {\r\n return { ...this.selectedStyle };\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport type { HeightMarker } from '../HeightMarker';\r\n\r\n/**\r\n * 路径状态管理器\r\n * 负责保存、恢复和持久化路径编辑状态\r\n */\r\nexport class PathStateManager {\r\n private entity: Cesium.Entity;\r\n \r\n // 原始状态(用于回滚)\r\n private originalPositions: Cesium.Cartesian3[];\r\n private originalHeadings: number[];\r\n private originalPitches: number[];\r\n private originalRolls: number[];\r\n private originalFovs: number[];\r\n\r\n constructor(\r\n entity: Cesium.Entity,\r\n positions: Cesium.Cartesian3[],\r\n headings: number[],\r\n pitches: number[],\r\n rolls: number[],\r\n fovs: number[],\r\n ) {\r\n this.entity = entity;\r\n \r\n // 保存原始状态\r\n this.originalPositions = positions.slice();\r\n this.originalHeadings = headings.slice();\r\n this.originalPitches = pitches.slice();\r\n this.originalRolls = rolls.slice();\r\n this.originalFovs = fovs.slice();\r\n }\r\n\r\n /**\r\n * 将当前状态持久化到实体\r\n * @param positions 当前位置数组\r\n * @param headings 当前航向数组\r\n * @param pitches 当前俯仰数组\r\n * @param rolls 当前翻滚数组\r\n * @param fovs 当前视场角数组\r\n */\r\n persistToEntity(\r\n positions: Cesium.Cartesian3[],\r\n headings: number[],\r\n pitches: number[],\r\n rolls: number[],\r\n fovs: number[],\r\n ): void {\r\n try {\r\n (this.entity as any).polyline.positions = positions.slice();\r\n } catch (err) {\r\n console.warn('Failed to persist positions to entity:', err);\r\n }\r\n \r\n try {\r\n (this.entity as any).properties = {\r\n ...(this.entity as any).properties,\r\n _vertexHeadings: headings.slice(),\r\n _vertexPitch: pitches.slice(),\r\n _vertexRoll: rolls.slice(),\r\n _vertexFov: fovs.slice(),\r\n };\r\n } catch (err) {\r\n console.warn('Failed to persist properties to entity:', err);\r\n }\r\n }\r\n\r\n /**\r\n * 恢复到原始状态\r\n * @param positions 位置数组(会被修改)\r\n * @param headings 航向数组(会被修改)\r\n * @param pitches 俯仰数组(会被修改)\r\n * @param rolls 翻滚数组(会被修改)\r\n * @param fovs 视场角数组(会被修改)\r\n * @param handles 顶点句柄数组\r\n * @param heightMarkers 高度标记数组\r\n * @param createOrUpdateMarkerForIndex 创建或更新高度标记的回调函数\r\n */\r\n revertToOriginal(\r\n positions: Cesium.Cartesian3[],\r\n headings: number[],\r\n pitches: number[],\r\n rolls: number[],\r\n fovs: number[],\r\n handles: any[],\r\n heightMarkers: (HeightMarker | undefined)[],\r\n createOrUpdateMarkerForIndex: (index: number) => void,\r\n ): void {\r\n // 清空并恢复位置\r\n positions.length = 0;\r\n this.originalPositions.forEach((p) => positions.push(p));\r\n \r\n // 清空并恢复航向\r\n headings.length = 0;\r\n this.originalHeadings.forEach((v) => headings.push(v));\r\n \r\n // 清空并恢复俯仰\r\n pitches.length = 0;\r\n this.originalPitches.forEach((v) => pitches.push(v));\r\n \r\n // 清空并恢复翻滚\r\n rolls.length = 0;\r\n this.originalRolls.forEach((v) => rolls.push(v));\r\n \r\n // 清空并恢复视场角\r\n fovs.length = 0;\r\n this.originalFovs.forEach((v) => fovs.push(v));\r\n \r\n // 更新句柄位置\r\n handles.forEach((h, i) => {\r\n try {\r\n if (positions[i]) (h as any).position = positions[i];\r\n } catch (err) {\r\n console.warn(`Failed to update handle position at index ${i}:`, err);\r\n }\r\n });\r\n \r\n // 更新高度标记以匹配恢复的位置\r\n for (let i = 0; i < positions.length; i++) {\r\n try {\r\n createOrUpdateMarkerForIndex(i);\r\n } catch (err) {\r\n console.warn(`Failed to update height marker at index ${i}:`, err);\r\n }\r\n }\r\n \r\n // 持久化恢复后的状态到实体\r\n this.persistToEntity(positions, headings, pitches, rolls, fovs);\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { HeightMarker } from './HeightMarker';\r\nimport { PathPreview } from './PathPreview';\r\nimport { AirplaneCursor } from './AirplaneCursor';\r\nimport { VertexLabelManager } from './editing/VertexLabelManager';\r\nimport { computeHeadingDegFromTo, ensureLayerForEntity, calculatePathDistance } from './editing/PathEditingUtils';\r\nimport { VertexInsertionHandler } from './editing/VertexInsertionHandler';\r\nimport { PathEditingEventHandler } from './editing/PathEditingEventHandler';\r\nimport { VertexHandleStyleManager } from './editing/VertexHandleStyleManager';\r\nimport { PathStateManager } from './editing/PathStateManager';\r\nimport { globalCameraEventBus } from '../../utils/events';\r\nimport type { VertexDetailInfo, VertexOperationInfo, VertexDragMoveInfo, WaypointUpdateData, WaypointBatchUpdate } from './editing/VertexDetailInfo';\r\n\r\n/**\r\n * 🆕 快速编辑模式配置选项\r\n */\r\nexport interface QuickEditOptions {\r\n /** 是否启用(默认 false) */\r\n enabled?: boolean;\r\n /** 新顶点的默认爬升高度(米) */\r\n climbHeight?: number;\r\n /** 高度模式 */\r\n altitudeMode?: 'absolute' | 'relativeToStart' | 'relativeToGround';\r\n}\r\n\r\n/**\r\n * 飞航路线编辑模式的入口函数。\r\n * 允许选择已有顶点,移动顶点(键盘),插入新顶点(鼠标点击或键盘)。\r\n * 需要提供已有的 polyline 实体(entityOrId)。\r\n * @param CesiumNS Cesium 命名空间\r\n * @param viewer viewer 实例\r\n * @param entityOrId polyline id 或实体对象\r\n * @param options \r\n * @returns \r\n */\r\nexport function startPathEditing(\r\n CesiumNS: typeof Cesium,\r\n viewer: Cesium.Viewer,\r\n entityOrId: Cesium.Entity | string,\r\n options?: {\r\n layer?: Cesium.CustomDataSource;\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n preview?: {\r\n enabled?: boolean;\r\n container?: HTMLElement;\r\n showFootprint?: boolean;\r\n fov?: number; // degrees\r\n pitch?: number; // degrees\r\n roll?: number; // degrees\r\n lengthFactor?: number; // multiplier for frustum length relative to camera distance (default 0.3)\r\n };\r\n /** 顶点选中详细信息回调 */\r\n onVertexSelectDetail?: (info: VertexDetailInfo) => void;\r\n /** 顶点拖动完成详细信息回调 */\r\n onVertexDragCompleteDetail?: (info: VertexOperationInfo) => void;\r\n /** 顶点插入完成详细信息回调 */\r\n onVertexInsertDetail?: (info: VertexOperationInfo) => void;\r\n /** 顶点删除完成详细信息回调 */\r\n onVertexDeleteDetail?: (info: VertexOperationInfo) => void;\r\n /** 🆕 顶点拖动中实时回调(用于 UI 实时同步) */\r\n onVertexDragMoveDetail?: (info: VertexDragMoveInfo) => void;\r\n /** 🆕 快速编辑模式配置 */\r\n quickEdit?: boolean | QuickEditOptions;\r\n /** 航点最小高度(米),默认 0,航点拖动时不能低于此高度 */\r\n minHeight?: number;\r\n },\r\n): {\r\n saveAndStop: () => {\r\n entity: Cesium.Entity;\r\n positions: Cesium.Cartesian3[];\r\n startPoint: {\r\n position: Cesium.Cartesian3;\r\n };\r\n climbHeight?: number;\r\n waypointData: Array<{\r\n position: Cesium.Cartesian3;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n fov: number;\r\n index: number;\r\n distance: number;\r\n }>;\r\n altitudeMode?: string;\r\n hasHiddenClimb?: boolean;\r\n };\r\n stop: () => void;\r\n /** 获取当前选中顶点的详细信息 */\r\n getSelectedVertex: () => VertexDetailInfo | null;\r\n /** 获取所有顶点的详细信息 */\r\n getAllVertices: () => VertexDetailInfo[];\r\n /** 获取指定索引顶点的详细信息 */\r\n getVertexByIndex: (index: number) => VertexDetailInfo | null;\r\n /** 🆕 启用快速编辑模式 */\r\n enableQuickEdit: (opts?: QuickEditOptions) => void;\r\n /** 🆕 禁用快速编辑模式 */\r\n disableQuickEdit: () => void;\r\n /** 🆕 检查快速编辑模式是否启用 */\r\n isQuickEditEnabled: () => boolean;\r\n /** 🆕 程序化更新指定航点 */\r\n updateWaypoint: (index: number, updates: Partial<WaypointUpdateData>) => boolean;\r\n /** 🆕 更新航点位置 */\r\n updateWaypointPosition: (index: number, position: Cesium.Cartesian3) => boolean;\r\n /** 🆕 更新航点高度 */\r\n updateWaypointAltitude: (index: number, altitude: number) => boolean;\r\n /** 🆕 更新航点偏航角 */\r\n updateWaypointHeading: (index: number, heading: number) => boolean;\r\n /** 🆕 更新航点俯仰角 */\r\n updateWaypointPitch: (index: number, pitch: number) => boolean;\r\n /** 🆕 更新航点视野角 */\r\n updateWaypointFov: (index: number, fov: number) => boolean;\r\n /** 🆕 批量更新航点 */\r\n batchUpdateWaypoints: (updates: WaypointBatchUpdate[]) => boolean;\r\n /** 🆕 程序化选中指定航点(移动飞机游标到该航点) */\r\n selectVertex: (index: number) => boolean;\r\n /** 🆕 模拟按键控制飞机游标(用于虚拟控制器) */\r\n simulateKeyPress: (key: string, duration?: number) => void;\r\n /** 🆕 获取游标当前姿态(包含高度) */\r\n getCursorPose: () => { position: any; heading: number; pitch: number; roll: number; altitude: number } | undefined;\r\n /** 🆕 动态更新爬升高度(安全飞行高度) */\r\n updateClimbHeight: (climbHeight: number) => boolean;\r\n /** 🆕 获取起飞点信息 */\r\n getStartPoint: () => { position: any; latitude: number; longitude: number; altitude: number } | null;\r\n} | undefined {\r\n const entity =\r\n typeof entityOrId === 'string'\r\n ? (viewer.entities.getById(entityOrId) as any)\r\n : (entityOrId as any);\r\n\r\n if (!entity || !entity.polyline) return undefined;\r\n\r\n const C: any = CesiumNS as any;\r\n // Ensure editing layer\r\n const layer: any = options?.layer ?? ensureLayerForEntity(viewer, entity, CesiumNS);\r\n\r\n // Preview will be created after AirplaneCursor is initialized\r\n let preview: PathPreview | undefined = undefined;\r\n\r\n const headings: number[] = [];\r\n const pitches: number[] = [];\r\n const rolls: number[] = [];\r\n const fovs: number[] = [];\r\n\r\n // Extract current positions\r\n const now = C.JulianDate.now();\r\n const polyPos: any = entity.polyline.positions;\r\n let positions: any[] = [];\r\n try {\r\n positions =\r\n typeof polyPos?.getValue === 'function'\r\n ? polyPos.getValue(now).slice()\r\n : (polyPos?.slice?.() ?? []);\r\n } catch {\r\n positions = [];\r\n }\r\n\r\n // Hidden climb point protection (from startPathDrawing). If entity has _hasHiddenClimb true and at least 2 positions,\r\n // we treat index 1 as a hidden climb vertex: no handle, not selectable/movable, insertion cannot occur before it.\r\n let hiddenClimbIndex: number | undefined;\r\n try {\r\n const props: any = (entity as any).properties;\r\n const hFlag = props?._hasHiddenClimb?.getValue?.() ?? props?._hasHiddenClimb;\r\n if (hFlag && positions.length >= 2) hiddenClimbIndex = 1;\r\n } catch {}\r\n\r\n // 🆕 快速编辑状态\r\n let quickEditEnabled = false;\r\n let quickEditOptions: QuickEditOptions = {\r\n enabled: false,\r\n climbHeight: 100,\r\n altitudeMode: 'absolute',\r\n };\r\n\r\n // 初始化快速编辑选项\r\n if (options?.quickEdit) {\r\n if (typeof options.quickEdit === 'boolean') {\r\n quickEditEnabled = options.quickEdit;\r\n quickEditOptions.enabled = options.quickEdit;\r\n } else {\r\n quickEditEnabled = options.quickEdit.enabled ?? false;\r\n quickEditOptions = {\r\n ...quickEditOptions,\r\n ...options.quickEdit,\r\n };\r\n }\r\n }\r\n\r\n // Handles (draggable points)\r\n // Reuse existing persistent vertex handles kept from drawing if any\r\n const ownerId: string | undefined = (entity as any).id;\r\n const allEntities: any[] = (layer.entities as any)._entities?._array ?? [];\r\n const existing: Record<number, any> = {};\r\n try {\r\n for (const e of allEntities) {\r\n try {\r\n const props: any = (e as any).properties;\r\n const t = props?._type?.getValue?.() ?? props?._type;\r\n const oid = props?._ownerId?.getValue?.() ?? props?._ownerId;\r\n const vid = props?._vertexIndex?.getValue?.() ?? props?._vertexIndex;\r\n if (t === 'path-vertex' && oid === ownerId && typeof vid === 'number') {\r\n existing[vid] = e;\r\n }\r\n } catch {}\r\n }\r\n } catch {}\r\n const handles: any[] = positions.map((p, i) => {\r\n if (hiddenClimbIndex === i) return undefined as any; // skip creating handle for hidden climb\r\n\r\n // 检查是否为起飞点(已经有箭头标记,不需要 point)\r\n const isStartPoint = i === 0;\r\n\r\n const h = existing[i];\r\n if (h) {\r\n try {\r\n (h as any).position = p;\r\n if (!isStartPoint) {\r\n (h as any).point = (h as any).point ?? { pixelSize: 10 };\r\n (h as any).point.pixelSize = 10;\r\n (h as any).point.color = C.Color.YELLOW;\r\n (h as any).point.outlineColor = C.Color.BLACK;\r\n (h as any).point.outlineWidth = 1;\r\n }\r\n (h as any).properties = { _type: 'path-vertex', _ownerId: ownerId, _vertexIndex: i } as any;\r\n } catch {}\r\n return h;\r\n }\r\n\r\n // 起飞点不创建 point(已有箭头标记)\r\n if (isStartPoint) {\r\n return layer.entities.add({\r\n position: p,\r\n properties: { _type: 'path-vertex', _ownerId: ownerId, _vertexIndex: i },\r\n } as any);\r\n }\r\n\r\n return layer.entities.add({\r\n position: p,\r\n point: { pixelSize: 10, color: C.Color.YELLOW, outlineColor: C.Color.BLACK, outlineWidth: 1 },\r\n properties: { _type: 'path-vertex', _ownerId: ownerId, _vertexIndex: i },\r\n } as any);\r\n });\r\n\r\n // 顶点标签管理器\r\n const vertexLabelManager = new VertexLabelManager(\r\n CesiumNS,\r\n layer,\r\n ownerId ?? '',\r\n hiddenClimbIndex,\r\n );\r\n vertexLabelManager.initializeLabels(positions);\r\n\r\n // Height markers for vertices (excluding initial and hidden climb)\r\n const heightMarkers: Array<HeightMarker | undefined> = [];\r\n const ensureMarkerLayer = (): any => {\r\n // Reuse provided layer for consistency\r\n return layer;\r\n };\r\n const createOrUpdateMarkerForIndex = (idx: number) => {\r\n try {\r\n if (hiddenClimbIndex === 1 && idx === 1) return; // skip hidden\r\n if (idx === 0) return; // skip initial\r\n const pos = positions[idx];\r\n if (!pos) return;\r\n const markerLayer = ensureMarkerLayer();\r\n if (!heightMarkers[idx]) {\r\n heightMarkers[idx] = new HeightMarker(CesiumNS as any, viewer, markerLayer);\r\n }\r\n heightMarkers[idx]?.showAt(pos);\r\n } catch {}\r\n };\r\n // Initialize markers for existing vertices\r\n for (let i = 0; i < positions.length; i++) createOrUpdateMarkerForIndex(i);\r\n // Initialize headings (default toward next point or 0)\r\n for (let i = 0; i < positions.length; i++) {\r\n let hd = 0;\r\n if (i < positions.length - 1)\r\n hd = computeHeadingDegFromTo(CesiumNS, positions[i], positions[i + 1]);\r\n // Normalize heading to [-180,180]\r\n if (hd > 180) hd -= 360;\r\n headings[i] = hd;\r\n // Initialize pitch/roll/fov from properties or defaults\r\n try {\r\n const props: any = (entity as any).properties ?? {};\r\n const getArr = (k: string): number[] | undefined => {\r\n const v = props[k]?.getValue?.() ?? props[k];\r\n return Array.isArray(v) ? (v as number[]) : undefined;\r\n };\r\n const pArr = getArr('_vertexPitch');\r\n const rArr = getArr('_vertexRoll');\r\n const fArr = getArr('_vertexFov');\r\n (pitches as any)[i] = typeof pArr?.[i] === 'number' ? pArr[i] : -10;\r\n (rolls as any)[i] = typeof rArr?.[i] === 'number' ? rArr[i] : 0;\r\n (fovs as any)[i] = typeof fArr?.[i] === 'number' ? fArr[i] : 50;\r\n } catch {\r\n (pitches as any)[i] = -10;\r\n (rolls as any)[i] = 0;\r\n (fovs as any)[i] = 50;\r\n }\r\n }\r\n\r\n // Keep polyline dynamic while editing; use PathStateManager for state management\r\n entity.polyline.positions = new C.CallbackProperty(() => positions.slice(), false);\r\n\r\n // 状态管理器\r\n const stateManager = new PathStateManager(entity, positions, headings, pitches, rolls, fovs);\r\n\r\n // Events\r\n let activeIndex: number | undefined; // currently selected vertex index\r\n // Track which vertices have been edited during this session\r\n let editedIndices = new Set<number>();\r\n\r\n // 顶点句柄样式管理器\r\n const handleStyleManager = new VertexHandleStyleManager(CesiumNS);\r\n\r\n /**\r\n * Set the active vertex index and update handle styles accordingly.\r\n * @param idx The index of the vertex to set as active.\r\n */\r\n const setActiveIndex = (idx: number | undefined) => {\r\n // reset previous\r\n if (activeIndex !== undefined && handles[activeIndex]) {\r\n // If previously edited, revert to edited style; else normal\r\n const prevState = handleStyleManager.getHandleState(editedIndices.has(activeIndex), false);\r\n handleStyleManager.applyStyle(handles[activeIndex], prevState);\r\n // 更新上一个顶点的标签(恢复为编辑或普通状态)\r\n const prevLabelState = editedIndices.has(activeIndex) ? 'edited' : 'normal';\r\n vertexLabelManager.updateLabel(activeIndex, positions[activeIndex], prevLabelState);\r\n }\r\n activeIndex = idx;\r\n if (activeIndex !== undefined && handles[activeIndex]) {\r\n handleStyleManager.applyStyle(handles[activeIndex], 'selected');\r\n // 更新当前顶点的标签为选中状态\r\n vertexLabelManager.updateLabel(activeIndex, positions[activeIndex], 'selected');\r\n }\r\n // Update preview pose when selection changes\r\n try {\r\n if (preview && activeIndex !== undefined) {\r\n const pos = positions[activeIndex];\r\n if (pos)\r\n preview.setPose(\r\n pos,\r\n headings[activeIndex] ?? 0,\r\n pitches[activeIndex] ?? -10,\r\n 0,\r\n fovs[activeIndex] ?? 50,\r\n );\r\n }\r\n } catch {}\r\n // 将飞机游标移动到选中点并同步其姿态\r\n try {\r\n if (airplaneCursor && activeIndex !== undefined) {\r\n const pos = positions[activeIndex];\r\n if (pos) {\r\n const hd = headings[activeIndex] ?? 0;\r\n const pt = pitches[activeIndex] ?? -10;\r\n const rl = rolls[activeIndex] ?? 0;\r\n airplaneCursor.setPose(pos, hd, pt, rl);\r\n }\r\n }\r\n } catch {}\r\n };\r\n\r\n /**\r\n * 🆕 计算航线总里程(米)\r\n * 从第一个可见航点累计到最后一个航点的距离\r\n */\r\n const getTotalDistance = (): number => {\r\n if (positions.length < 2) return 0;\r\n // 使用工具函数计算到最后一个航点的距离\r\n return calculatePathDistance(CesiumNS, positions, positions.length - 1, hiddenClimbIndex);\r\n };\r\n\r\n // 顶点插入处理器\r\n const vertexInsertionHandler = new VertexInsertionHandler({\r\n CesiumNS,\r\n layer,\r\n ownerId: ownerId ?? '',\r\n hiddenClimbIndex,\r\n });\r\n\r\n // Initialize airplane cursor at last existing visible point or start\r\n let cursorStart = positions[positions.length - 1];\r\n if (!cursorStart) cursorStart = positions[hiddenClimbIndex === 1 ? 1 : 0];\r\n let airplaneCursor: AirplaneCursor | undefined; // kept in scope for lifecycle & future option updates\r\n\r\n const insertVertex = (\r\n insertAt: number,\r\n p3: any,\r\n poseOrient?: { heading: number; pitch: number; roll: number },\r\n ) => {\r\n console.log('[PathEditing] 插入顶点前 positions 长度:', positions.length, 'insertAt:', insertAt);\r\n \r\n const actualIndex = vertexInsertionHandler.insertVertex(\r\n insertAt,\r\n p3,\r\n positions,\r\n handles,\r\n headings,\r\n pitches,\r\n rolls,\r\n fovs,\r\n editedIndices,\r\n vertexLabelManager,\r\n heightMarkers,\r\n airplaneCursor,\r\n poseOrient,\r\n );\r\n\r\n console.log('[PathEditing] 插入顶点后 positions 长度:', positions.length, 'actualIndex:', actualIndex);\r\n\r\n // 🔧 强制刷新 polyline 以确保 Cesium 检测到变化\r\n // 重新设置 CallbackProperty 来触发更新\r\n entity.polyline.positions = new C.CallbackProperty(() => positions.slice(), false);\r\n\r\n // 设置为选中状态\r\n setActiveIndex(actualIndex);\r\n\r\n // Create marker for the new vertex (skipping rules handled inside)\r\n createOrUpdateMarkerForIndex(actualIndex);\r\n };\r\n\r\n /**\r\n * 删除指定索引的顶点\r\n * @param deleteAt 要删除的顶点索引\r\n */\r\n const deleteVertex = (deleteAt: number) => {\r\n try {\r\n // 保护:不能删除起点\r\n if (deleteAt === 0 || (hiddenClimbIndex === 1 && deleteAt === 1)) {\r\n console.warn('Cannot delete start point');\r\n return;\r\n }\r\n\r\n // 保护:不能删除隐藏爬升点\r\n if (hiddenClimbIndex !== undefined && deleteAt === hiddenClimbIndex) {\r\n console.warn('Cannot delete hidden climb point');\r\n return;\r\n }\r\n\r\n // 保护:至少保留起点(确保有可见顶点)\r\n const visibleVertexCount = positions.length - (hiddenClimbIndex === 1 ? 1 : 0);\r\n if (visibleVertexCount <= 1) {\r\n console.warn('Cannot delete last vertex');\r\n return;\r\n }\r\n\r\n // 移除顶点句柄\r\n if (handles[deleteAt]) {\r\n try {\r\n (layer.entities as any).remove(handles[deleteAt]);\r\n } catch {}\r\n }\r\n\r\n // 移除高度标记\r\n if (heightMarkers[deleteAt]) {\r\n try {\r\n heightMarkers[deleteAt]?.destroy();\r\n } catch {}\r\n }\r\n\r\n // 从数组中删除\r\n console.log('[PathEditing] 删除顶点前 positions 长度:', positions.length, 'deleteAt:', deleteAt);\r\n \r\n positions.splice(deleteAt, 1);\r\n handles.splice(deleteAt, 1);\r\n headings.splice(deleteAt, 1);\r\n pitches.splice(deleteAt, 1);\r\n rolls.splice(deleteAt, 1);\r\n fovs.splice(deleteAt, 1);\r\n heightMarkers.splice(deleteAt, 1);\r\n \r\n console.log('[PathEditing] 删除顶点后 positions 长度:', positions.length);\r\n \r\n // 🔧 强制刷新 polyline 以确保 Cesium 检测到变化\r\n entity.polyline.positions = new C.CallbackProperty(() => positions.slice(), false);\r\n\r\n // 更新编辑过的索引集合\r\n const newEditedIndices = new Set<number>();\r\n editedIndices.forEach((idx) => {\r\n if (idx < deleteAt) {\r\n newEditedIndices.add(idx);\r\n } else if (idx > deleteAt) {\r\n newEditedIndices.add(idx - 1);\r\n }\r\n // idx === deleteAt 时不添加(已删除)\r\n });\r\n editedIndices = newEditedIndices;\r\n\r\n // 更新所有顶点句柄的 _vertexIndex 属性\r\n for (let i = 0; i < handles.length; i++) {\r\n if (handles[i]) {\r\n try {\r\n (handles[i] as any).properties = {\r\n _type: 'path-vertex',\r\n _ownerId: ownerId,\r\n _vertexIndex: i,\r\n };\r\n } catch {}\r\n }\r\n }\r\n\r\n // 删除标签并重新创建所有标签以更新序号\r\n vertexLabelManager.removeLabel(deleteAt);\r\n\r\n // 更新活动索引\r\n let newActiveIndex: number | undefined = activeIndex;\r\n if (activeIndex !== undefined) {\r\n if (activeIndex === deleteAt) {\r\n // 删除的是当前选中的点,取消选中\r\n newActiveIndex = undefined;\r\n } else if (activeIndex > deleteAt) {\r\n // 当前选中点在删除点之后,索引需要减1\r\n newActiveIndex = activeIndex - 1;\r\n }\r\n // activeIndex < deleteAt 时,索引不变\r\n }\r\n\r\n // 重新创建所有标签(使用更新后的数据)\r\n vertexLabelManager.recreateAllLabels(positions, editedIndices, newActiveIndex);\r\n\r\n // 更新活动索引和样式\r\n if (newActiveIndex !== activeIndex) {\r\n activeIndex = newActiveIndex; // 直接更新索引而不触发 setActiveIndex\r\n // 手动更新句柄样式\r\n if (newActiveIndex !== undefined && handles[newActiveIndex]) {\r\n handleStyleManager.applyStyle(handles[newActiveIndex], 'selected');\r\n }\r\n }\r\n\r\n // 重新创建所有高度标记\r\n for (let i = 0; i < positions.length; i++) {\r\n createOrUpdateMarkerForIndex(i);\r\n }\r\n } catch (error) {\r\n console.error('Error deleting vertex:', error);\r\n }\r\n };\r\n\r\n try {\r\n if (cursorStart) {\r\n // Step 1: Create AirplaneCursor first (without onPose callback initially)\r\n airplaneCursor = new AirplaneCursor(CesiumNS as any, viewer, cursorStart, {\r\n onPose: undefined, // Will be set later after preview is created\r\n onAddVertex: (pose) => {\r\n // 仍允许通过回调直接插入(若 host 通过 Enter 想立即插入,可在 UI 里决定)\r\n if (pose.insertAt >= 0) {\r\n insertVertex(pose.insertAt, pose.position, {\r\n heading: pose.heading,\r\n pitch: pose.pitch,\r\n roll: pose.roll,\r\n });\r\n }\r\n },\r\n // frustumLengthFactor: options?.preview?.lengthFactor ?? 0.3,\r\n fovDeg: options?.preview?.fov ?? 50,\r\n minHeight: options?.minHeight, // 传递最小高度限制\r\n });\r\n\r\n // Create PathPreview based on AirplaneCursor's initial pose\r\n if (options?.preview?.enabled !== false && airplaneCursor) {\r\n preview = new PathPreview(CesiumNS as any, viewer, {\r\n container: options?.preview?.container,\r\n showFootprint: options?.preview?.showFootprint ?? false,\r\n fov: options?.preview?.fov ?? 50,\r\n pitch: options?.preview?.pitch ?? -10,\r\n roll: options?.preview?.roll ?? 0,\r\n });\r\n\r\n // Set initial preview pose from AirplaneCursor\r\n try {\r\n const initialPose = airplaneCursor.getPose();\r\n console.log('Initial airplane cursor pose for preview:', preview, initialPose);\r\n preview.setPose(\r\n initialPose.position,\r\n initialPose.heading,\r\n initialPose.pitch,\r\n initialPose.roll,\r\n options?.preview?.fov ?? 50,\r\n );\r\n } catch {\r\n console.warn('PathEditing: failed to set initial preview pose');\r\n }\r\n\r\n // Now update AirplaneCursor's onPose callback to sync with preview\r\n airplaneCursor.updateOptions({\r\n onPose: (pose) => {\r\n try {\r\n if (preview) {\r\n preview.setPose(pose.position, pose.heading, pose.pitch, pose.roll, 50);\r\n }\r\n } catch {}\r\n },\r\n });\r\n }\r\n }\r\n } catch {}\r\n\r\n // 事件处理器\r\n // 创建事件处理器\r\n console.log('[PathEditing] 创建事件处理器,回调配置:', {\r\n onVertexSelectDetail: !!options?.onVertexSelectDetail,\r\n });\r\n \r\n const eventHandler = new PathEditingEventHandler(\r\n {\r\n CesiumNS,\r\n viewer,\r\n hiddenClimbIndex,\r\n minHeight: options?.minHeight,\r\n },\r\n {\r\n onVertexSelect: (index) => setActiveIndex(index),\r\n onVertexSelectDetail: options?.onVertexSelectDetail,\r\n onInsertVertex: (insertAt, position, pose) => {\r\n const totalBefore = positions.length;\r\n insertVertex(insertAt, position, pose);\r\n // 触发插入完成回调\r\n if (options?.onVertexInsertDetail) {\r\n try {\r\n const totalAfter = positions.length;\r\n const newVertex = buildVertexDetailInfo(insertAt);\r\n const operationInfo: VertexOperationInfo = {\r\n type: 'insert',\r\n index: insertAt,\r\n displayNumber: newVertex.displayNumber,\r\n totalVerticesBefore: totalBefore,\r\n totalVerticesAfter: totalAfter,\r\n newVertex,\r\n timestamp: new Date(),\r\n totalDistance: getTotalDistance(), // 🆕 航线总里程\r\n };\r\n options.onVertexInsertDetail(operationInfo);\r\n } catch (error) {\r\n console.error('Error in onVertexInsertDetail:', error);\r\n }\r\n }\r\n },\r\n onDeleteVertex: (index) => {\r\n const totalBefore = positions.length;\r\n const displayNumber = (hiddenClimbIndex === 1 && index > 1) ? index - 1 : index;\r\n deleteVertex(index);\r\n // 触发删除完成回调\r\n if (options?.onVertexDeleteDetail) {\r\n try {\r\n const totalAfter = positions.length;\r\n const operationInfo: VertexOperationInfo = {\r\n type: 'delete',\r\n index,\r\n displayNumber,\r\n totalVerticesBefore: totalBefore,\r\n totalVerticesAfter: totalAfter,\r\n timestamp: new Date(),\r\n totalDistance: getTotalDistance(), // 🆕 航线总里程\r\n };\r\n options.onVertexDeleteDetail(operationInfo);\r\n } catch (error) {\r\n console.error('Error in onVertexDeleteDetail:', error);\r\n }\r\n }\r\n },\r\n onVertexDragStart: (index) => {\r\n // 拖动开始时,顶点已经在 PathEditingEventHandler 中被选中\r\n // 这里不需要再次调用 setActiveIndex,避免标签重建导致闪烁\r\n \r\n // 将高度标记切换到动态模式,以实现流畅跟随\r\n try {\r\n if (heightMarkers[index]) {\r\n heightMarkers[index]?.showAtDynamic(() => positions[index]);\r\n }\r\n } catch {}\r\n },\r\n onVertexDragMove: (index, newPosition) => {\r\n // 实时更新位置数组\r\n positions[index] = newPosition;\r\n\r\n // 更新顶点句柄位置\r\n if (handles[index]) {\r\n try {\r\n (handles[index] as any).position = newPosition;\r\n } catch {}\r\n }\r\n\r\n // 仅更新标签位置(不重建,保持流畅)\r\n try {\r\n vertexLabelManager.updateLabelPosition(index, newPosition);\r\n } catch {}\r\n\r\n // 不需要更新高度标记,因为已经在动态模式下自动跟随\r\n \r\n // 🆕 触发实时拖动回调(用于 UI 实时同步)\r\n if (options?.onVertexDragMoveDetail) {\r\n try {\r\n // 转换为经纬度高度\r\n let coordinates = { longitude: 0, latitude: 0, height: 0 };\r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(newPosition);\r\n coordinates = {\r\n longitude: C.Math.toDegrees(cartographic.longitude),\r\n latitude: C.Math.toDegrees(cartographic.latitude),\r\n height: cartographic.height,\r\n };\r\n } catch {}\r\n \r\n // 计算显示编号\r\n const displayNumber = (hiddenClimbIndex === 1 && index > 1) ? index - 1 : index;\r\n \r\n const dragMoveInfo: VertexDragMoveInfo = {\r\n index,\r\n displayNumber,\r\n position: newPosition,\r\n coordinates,\r\n timestamp: new Date(),\r\n };\r\n options.onVertexDragMoveDetail(dragMoveInfo);\r\n } catch (error) {\r\n console.error('Error in onVertexDragMoveDetail:', error);\r\n }\r\n }\r\n },\r\n onVertexDragEnd: (index, finalPosition) => {\r\n // 标记为已编辑\r\n editedIndices.add(index);\r\n\r\n // 更新最终位置\r\n positions[index] = finalPosition;\r\n\r\n // 更新句柄样式为编辑状态\r\n if (handles[index]) {\r\n handleStyleManager.applyStyle(handles[index], 'edited');\r\n }\r\n\r\n // 更新标签状态:如果是当前选中的顶点,保持选中状态(蓝色),否则显示为编辑状态(紫色)\r\n try {\r\n const labelState = activeIndex === index ? 'selected' : 'edited';\r\n vertexLabelManager.updateLabel(index, finalPosition, labelState);\r\n } catch {}\r\n\r\n // 将高度标记切换回静态模式(使用最终位置)\r\n try {\r\n createOrUpdateMarkerForIndex(index);\r\n } catch {}\r\n\r\n // 触发拖动完成详细信息回调\r\n if (options?.onVertexDragCompleteDetail) {\r\n try {\r\n const vertexInfo = buildVertexDetailInfo(index);\r\n const operationInfo: VertexOperationInfo = {\r\n type: 'move',\r\n index,\r\n displayNumber: vertexInfo.displayNumber,\r\n totalVerticesBefore: positions.length,\r\n totalVerticesAfter: positions.length,\r\n newVertex: vertexInfo,\r\n newPosition: finalPosition,\r\n timestamp: new Date(),\r\n totalDistance: getTotalDistance(), // 🆕 航线总里程\r\n };\r\n options.onVertexDragCompleteDetail(operationInfo);\r\n } catch (error) {\r\n console.error('Error in onVertexDragCompleteDetail:', error);\r\n }\r\n }\r\n },\r\n getActiveIndex: () => activeIndex,\r\n getPositions: () => positions,\r\n getAirplaneCursor: () => airplaneCursor,\r\n getPoseData: () => ({ headings, pitches, rolls, fovs }),\r\n getEntity: () => entity,\r\n /** 模拟按键控制飞机游标(用于虚拟控制器) */\r\n simulateKeyPress: (key: string, duration?: number) => {\r\n airplaneCursor?.simulateKeyPress(key, duration);\r\n },\r\n /** 获取游标当前姿态(包含高度) */\r\n getCursorPose: () => airplaneCursor?.getPose(),\r\n // 🆕 快速编辑回调\r\n getQuickEditEnabled: () => quickEditEnabled,\r\n getQuickEditOptions: () => ({\r\n climbHeight: quickEditOptions.climbHeight ?? 100,\r\n altitudeMode: quickEditOptions.altitudeMode ?? 'absolute',\r\n }),\r\n },\r\n );\r\n\r\n // Remove default Cesium right-click finishing behavior: no handler set for RIGHT_CLICK now.\r\n\r\n const cleanupSession = () => {\r\n setActiveIndex(undefined);\r\n try {\r\n // preview?.destroy();\r\n } catch {}\r\n // 🔧 清理顶点句柄(handles)\r\n try {\r\n handles.forEach((handle) => {\r\n if (handle) {\r\n try {\r\n layer.entities.remove(handle);\r\n } catch {}\r\n }\r\n });\r\n handles.length = 0; // 清空数组\r\n } catch {}\r\n // Destroy height markers\r\n try {\r\n heightMarkers.forEach((m) => m?.destroy());\r\n } catch {}\r\n // Destroy vertex labels\r\n try {\r\n vertexLabelManager.destroy();\r\n } catch {}\r\n // Destroy event handler (includes context menu)\r\n try {\r\n eventHandler.destroy();\r\n } catch {}\r\n // 无需销毁单独 frustum\r\n try {\r\n // touch airplaneCursor so TS sees it used even if no callbacks triggered yet\r\n if (airplaneCursor) {\r\n // potential place for flushing any pending pose -> vertex sync in future\r\n airplaneCursor.updateOptions({});\r\n airplaneCursor.destroy();\r\n }\r\n } catch {}\r\n };\r\n\r\n // 辅助函数:构建顶点详细信息\r\n const buildVertexDetailInfo = (index: number): VertexDetailInfo => {\r\n const position = positions[index];\r\n \r\n // 转换为经纬度高度\r\n let coordinates = { longitude: 0, latitude: 0, height: 0 };\r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(position);\r\n coordinates = {\r\n longitude: C.Math.toDegrees(cartographic.longitude),\r\n latitude: C.Math.toDegrees(cartographic.latitude),\r\n height: cartographic.height,\r\n };\r\n } catch {}\r\n \r\n // 姿态信息\r\n const pose = {\r\n heading: headings[index] ?? 0,\r\n pitch: pitches[index] ?? 0,\r\n roll: rolls[index] ?? 0,\r\n fov: fovs[index] ?? 50,\r\n };\r\n \r\n // 计算可见顶点数量\r\n const totalVertices = positions.length;\r\n const totalVisibleVertices = totalVertices - (hiddenClimbIndex === 1 ? 1 : 0);\r\n \r\n // 判断是否为起点\r\n const isStartPoint = index === 0 || (hiddenClimbIndex === 1 && index === 1);\r\n \r\n // 判断是否为隐藏爬升点\r\n const isHiddenClimb = hiddenClimbIndex === 1 && index === 1;\r\n \r\n // 判断是否可删除\r\n const canDelete = totalVisibleVertices > 1 && !isStartPoint;\r\n \r\n // 显示编号\r\n const displayNumber = (hiddenClimbIndex === 1 && index > 1) ? index - 1 : index;\r\n \r\n // 提取路径属性\r\n let pathProperties: VertexDetailInfo['pathProperties'] | undefined;\r\n try {\r\n const props: any = (entity as any).properties;\r\n pathProperties = {\r\n altitudeMode: props?._altitudeMode?.getValue?.() ?? props?._altitudeMode,\r\n climbHeight: props?._climbHeight?.getValue?.() ?? props?._climbHeight,\r\n hasHiddenClimb: props?._hasHiddenClimb?.getValue?.() ?? props?._hasHiddenClimb,\r\n };\r\n } catch {}\r\n \r\n return {\r\n index,\r\n displayNumber,\r\n position,\r\n coordinates,\r\n pose,\r\n isStartPoint,\r\n isHiddenClimb,\r\n canDelete,\r\n totalVisibleVertices,\r\n totalVertices,\r\n entity,\r\n pathProperties,\r\n };\r\n };\r\n\r\n return {\r\n /** 保存并退出编辑模式 */\r\n saveAndStop: () => {\r\n // 保存到实体\r\n stateManager.persistToEntity(positions, headings, pitches, rolls, fovs);\r\n \r\n // 提取起始点(index 0)的位置\r\n const startPoint = {\r\n position: positions[0],\r\n };\r\n\r\n // 提取实体的额外属性\r\n let altitudeMode: string | undefined;\r\n let climbHeight: number | undefined;\r\n let hasHiddenClimb: boolean | undefined;\r\n\r\n try {\r\n const props: any = (entity as any).properties;\r\n altitudeMode = props?._altitudeMode?.getValue?.() ?? props?._altitudeMode;\r\n climbHeight = props?._climbHeight?.getValue?.() ?? props?._climbHeight;\r\n hasHiddenClimb = props?._hasHiddenClimb?.getValue?.() ?? props?._hasHiddenClimb;\r\n } catch {}\r\n\r\n // waypointData 从 index 2 开始(跳过起始点和隐藏爬升点)\r\n const waypointData = positions\r\n .map((position, index) => ({\r\n position,\r\n heading: headings[index] ?? 0,\r\n pitch: pitches[index] ?? -10,\r\n roll: rolls[index] ?? 0,\r\n fov: fovs[index] ?? 50,\r\n index,\r\n distance: calculatePathDistance(CesiumNS, positions, index, hiddenClimbIndex),\r\n }))\r\n .filter((wp) => wp.index >= 2); // 只保留 index >= 2 的航点\r\n\r\n // 清理编辑会话\r\n cleanupSession();\r\n\r\n // 返回完整数据\r\n return {\r\n entity,\r\n positions: positions.slice(),\r\n startPoint,\r\n climbHeight,\r\n waypointData,\r\n altitudeMode,\r\n hasHiddenClimb,\r\n };\r\n },\r\n /** 不保存退出(回滚到进入编辑时的状态) */\r\n stop: () => {\r\n stateManager.revertToOriginal(\r\n positions,\r\n headings,\r\n pitches,\r\n rolls,\r\n fovs,\r\n handles,\r\n heightMarkers,\r\n createOrUpdateMarkerForIndex,\r\n );\r\n cleanupSession();\r\n },\r\n /** 获取当前选中顶点的详细信息 */\r\n getSelectedVertex: () => {\r\n if (activeIndex === undefined) return null;\r\n try {\r\n return buildVertexDetailInfo(activeIndex);\r\n } catch (error) {\r\n console.error('Error getting selected vertex:', error);\r\n return null;\r\n }\r\n },\r\n /** 获取所有顶点的详细信息 */\r\n getAllVertices: () => {\r\n try {\r\n return positions.map((_, index) => buildVertexDetailInfo(index));\r\n } catch (error) {\r\n console.error('Error getting all vertices:', error);\r\n return [];\r\n }\r\n },\r\n /** 获取指定索引顶点的详细信息 */\r\n getVertexByIndex: (index: number) => {\r\n if (index < 0 || index >= positions.length) return null;\r\n try {\r\n return buildVertexDetailInfo(index);\r\n } catch (error) {\r\n console.error('Error getting vertex by index:', error);\r\n return null;\r\n }\r\n },\r\n /** 🆕 启用快速编辑模式 */\r\n enableQuickEdit: (opts?: QuickEditOptions) => {\r\n quickEditEnabled = true;\r\n if (opts) {\r\n quickEditOptions = {\r\n ...quickEditOptions,\r\n ...opts,\r\n enabled: true,\r\n };\r\n }\r\n console.log('[QuickEdit] ✅ 快速编辑模式已启用');\r\n console.log('[QuickEdit] 💡 左键点击地图添加飞航点');\r\n console.log('[QuickEdit] 配置:', quickEditOptions);\r\n },\r\n /** 🆕 禁用快速编辑模式 */\r\n disableQuickEdit: () => {\r\n quickEditEnabled = false;\r\n quickEditOptions.enabled = false;\r\n console.log('[QuickEdit] ❌ 快速编辑模式已禁用');\r\n },\r\n /** 🆕 检查快速编辑模式是否启用 */\r\n isQuickEditEnabled: () => {\r\n return quickEditEnabled;\r\n },\r\n \r\n // ========================\r\n // 🆕 程序化更新方法\r\n // ========================\r\n \r\n /**\r\n * 🆕 程序化更新指定航点\r\n * @param index 航点索引\r\n * @param updates 需要更新的字段\r\n * @returns 是否更新成功\r\n */\r\n updateWaypoint: (index: number, updates: Partial<WaypointUpdateData>): boolean => {\r\n if (index < 0 || index >= positions.length) {\r\n console.warn(`[updateWaypoint] Invalid index: ${index}, valid range: 0-${positions.length - 1}`);\r\n return false;\r\n }\r\n \r\n try {\r\n let positionUpdated = false;\r\n \r\n // 更新位置(完整 Cartesian3)\r\n if (updates.position) {\r\n positions[index] = updates.position;\r\n positionUpdated = true;\r\n }\r\n \r\n // 更新高度(便捷方法,仅改变高度保持经纬度)\r\n if (updates.altitude !== undefined && !updates.position) {\r\n const currentPos = positions[index];\r\n const cartographic = C.Cartographic.fromCartesian(currentPos);\r\n const newPos = C.Cartesian3.fromRadians(\r\n cartographic.longitude,\r\n cartographic.latitude,\r\n updates.altitude\r\n );\r\n positions[index] = newPos;\r\n positionUpdated = true;\r\n }\r\n \r\n // 如果位置更新了,同步更新相关视觉元素\r\n if (positionUpdated) {\r\n const newPos = positions[index];\r\n \r\n // 更新顶点句柄位置\r\n if (handles[index]) {\r\n try {\r\n (handles[index] as any).position = newPos;\r\n } catch {}\r\n }\r\n \r\n // 更新标签位置\r\n try {\r\n vertexLabelManager.updateLabelPosition(index, newPos);\r\n } catch {}\r\n \r\n // 更新高度标记\r\n try {\r\n createOrUpdateMarkerForIndex(index);\r\n } catch {}\r\n }\r\n \r\n // 更新姿态参数\r\n if (updates.heading !== undefined) headings[index] = updates.heading;\r\n if (updates.pitch !== undefined) pitches[index] = updates.pitch;\r\n if (updates.roll !== undefined) rolls[index] = updates.roll;\r\n if (updates.fov !== undefined) {\r\n fovs[index] = updates.fov;\r\n \r\n // 🆕 如果是当前选中航点,广播 FOV 变化事件到全局事件总线\r\n if (index === activeIndex) {\r\n globalCameraEventBus.onFOVChange.emit({\r\n fov: updates.fov,\r\n focalLength: fovToFocalLength(updates.fov),\r\n source: 'user',\r\n });\r\n }\r\n }\r\n \r\n // 如果是当前选中的航点,更新 AirplaneCursor\r\n if (index === activeIndex && airplaneCursor) {\r\n try {\r\n airplaneCursor.setPose(\r\n positions[index],\r\n headings[index] ?? 0,\r\n pitches[index] ?? -10,\r\n rolls[index] ?? 0,\r\n );\r\n } catch {}\r\n }\r\n \r\n // 持久化到实体\r\n stateManager.persistToEntity(positions, headings, pitches, rolls, fovs);\r\n \r\n return true;\r\n } catch (error) {\r\n console.error('[updateWaypoint] Error:', error);\r\n return false;\r\n }\r\n },\r\n \r\n /**\r\n * 🆕 更新航点位置\r\n */\r\n updateWaypointPosition: function(index: number, position: Cesium.Cartesian3): boolean {\r\n return this.updateWaypoint(index, { position });\r\n },\r\n \r\n /**\r\n * 🆕 更新航点高度(仅垂直方向,保持经纬度不变)\r\n */\r\n updateWaypointAltitude: function(index: number, altitude: number): boolean {\r\n return this.updateWaypoint(index, { altitude });\r\n },\r\n \r\n /**\r\n * 🆕 更新航点偏航角\r\n */\r\n updateWaypointHeading: function(index: number, heading: number): boolean {\r\n return this.updateWaypoint(index, { heading });\r\n },\r\n \r\n /**\r\n * 🆕 更新航点俯仰角\r\n */\r\n updateWaypointPitch: function(index: number, pitch: number): boolean {\r\n return this.updateWaypoint(index, { pitch });\r\n },\r\n \r\n /**\r\n * 🆕 更新航点视野角\r\n */\r\n updateWaypointFov: function(index: number, fov: number): boolean {\r\n return this.updateWaypoint(index, { fov });\r\n },\r\n \r\n /**\r\n * 🆕 批量更新多个航点\r\n */\r\n batchUpdateWaypoints: function(updates: WaypointBatchUpdate[]): boolean {\r\n let allSuccess = true;\r\n for (const { index, data } of updates) {\r\n if (!this.updateWaypoint(index, data)) {\r\n allSuccess = false;\r\n }\r\n }\r\n return allSuccess;\r\n },\r\n \r\n /**\r\n * 🆕 程序化选中指定航点\r\n * 将飞机游标移动到指定航点位置,更新选中状态\r\n * @param index 航点索引\r\n * @returns 是否选中成功\r\n */\r\n selectVertex: (index: number): boolean => {\r\n if (index < 0 || index >= positions.length) {\r\n console.warn(`[selectVertex] Invalid index: ${index}, valid range: 0-${positions.length - 1}`);\r\n return false;\r\n }\r\n \r\n try {\r\n setActiveIndex(index);\r\n return true;\r\n } catch (e) {\r\n console.error('[selectVertex] Failed to select vertex:', e);\r\n return false;\r\n }\r\n },\r\n \r\n /**\r\n * 🆕 模拟按键控制飞机游标(用于虚拟控制器)\r\n * @param key 按键名称 (w/a/s/d/q/e/c/z)\r\n * @param duration 按键持续时间(毫秒)\r\n */\r\n simulateKeyPress: (key: string, duration?: number) => {\r\n airplaneCursor?.simulateKeyPress(key, duration);\r\n },\r\n \r\n /**\r\n * 🆕 获取游标当前姿态(包含高度)\r\n */\r\n getCursorPose: () => airplaneCursor?.getPose(),\r\n \r\n /**\r\n * 🆕 动态更新爬升高度(climbHeight)\r\n * 更新隐藏爬升点(index 1)的高度,实现安全飞行高度的动态调节\r\n * @param climbHeight 新的爬升高度(米)\r\n * @returns 是否更新成功\r\n */\r\n updateClimbHeight: function(climbHeight: number): boolean {\r\n if (hiddenClimbIndex !== 1 || positions.length < 2) {\r\n console.warn('[updateClimbHeight] No hidden climb point exists');\r\n return false;\r\n }\r\n \r\n try {\r\n // 获取起飞点高度\r\n const startPos = positions[0];\r\n const startCarto = C.Cartographic.fromCartesian(startPos);\r\n const newAltitude = startCarto.height + climbHeight;\r\n \r\n // 更新隐藏爬升点(index 1)的高度\r\n const success = this.updateWaypointAltitude(1, newAltitude);\r\n \r\n if (success) {\r\n // 同时更新实体属性中的 _climbHeight\r\n try {\r\n (entity as any).properties._climbHeight = climbHeight;\r\n } catch {}\r\n console.log('[updateClimbHeight] ✅ 爬升高度已更新:', climbHeight, '米');\r\n }\r\n \r\n return success;\r\n } catch (error) {\r\n console.error('[updateClimbHeight] Error:', error);\r\n return false;\r\n }\r\n },\r\n \r\n /**\r\n * 🆕 获取起飞点信息\r\n * @returns 起飞点的经纬度和高度\r\n */\r\n getStartPoint: () => {\r\n if (positions.length < 1) return null;\r\n try {\r\n const startPos = positions[0];\r\n const carto = C.Cartographic.fromCartesian(startPos);\r\n return {\r\n position: startPos,\r\n latitude: C.Math.toDegrees(carto.latitude),\r\n longitude: C.Math.toDegrees(carto.longitude),\r\n altitude: carto.height,\r\n };\r\n } catch {\r\n return null;\r\n }\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * FOV 转等效焦距(基于传感器宽度 36mm,与 CameraFOVController 一致)\r\n * @param fovDeg 视场角(度)\r\n * @returns 等效焦距(mm)\r\n */\r\nfunction fovToFocalLength(fovDeg: number): number {\r\n const sensorWidth = 36; // 与 CameraFOVController 保持一致\r\n const fovRad = (fovDeg * Math.PI) / 180;\r\n return sensorWidth / (2 * Math.tan(fovRad / 2));\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\nexport interface ArrowShapeOptions {\r\n /** arrow total height in meters (default 25) */\r\n height?: number;\r\n /** shaft height in meters (default 17) */\r\n shaftHeight?: number;\r\n /** head (cone) height in meters (default 8) */\r\n headHeight?: number;\r\n /** shaft radius in meters (default 3) */\r\n shaftRadius?: number;\r\n /** head bottom radius in meters (default 6) */\r\n headRadius?: number;\r\n /** base circle radius in meters (default 8) */\r\n baseRadius?: number;\r\n /** color of the arrow (default #FFD700 - Gold) */\r\n color?: string;\r\n /** shaft alpha transparency (default 1.0) */\r\n shaftAlpha?: number;\r\n /** head alpha transparency (default 1.0) */\r\n headAlpha?: number;\r\n /** base alpha transparency (default 0.65) */\r\n baseAlpha?: number;\r\n /** show outline (default false) */\r\n outline?: boolean;\r\n /** outline color (default darker version of color) */\r\n outlineColor?: string;\r\n /** enable dynamic scaling based on camera distance (default false) */\r\n dynamicScale?: boolean;\r\n /** Cesium viewer for dynamic scaling (required if dynamicScale is true) */\r\n viewer?: Cesium.Viewer;\r\n /** reference distance for scaling in meters (default 500) */\r\n referenceDistance?: number;\r\n /** minimum scale factor (default 0.3) */\r\n minScale?: number;\r\n /** maximum scale factor (default 3.0) */\r\n maxScale?: number;\r\n}\r\n\r\n/**\r\n * 3D Arrow shape generator pointing vertically upward to the sky\r\n * Creates a 3D arrow using cylinder (shaft) + cone (head) + ellipse (base)\r\n */\r\nexport class ArrowShape {\r\n private height: number;\r\n private shaftHeight: number;\r\n private headHeight: number;\r\n private shaftRadius: number;\r\n private headRadius: number;\r\n private baseRadius: number;\r\n private color: any;\r\n private shaftAlpha: number;\r\n private headAlpha: number;\r\n private baseAlpha: number;\r\n private outline: boolean;\r\n private outlineColor: any;\r\n // 动态缩放相关\r\n private dynamicScale: boolean;\r\n private viewer?: Cesium.Viewer;\r\n private referenceDistance: number;\r\n private minScale: number;\r\n private maxScale: number;\r\n private cachedScaleFactor: number = 1;\r\n\r\n constructor(private CesiumNS: typeof Cesium, opts: ArrowShapeOptions = {}) {\r\n const C: any = this.CesiumNS as any;\r\n \r\n // Default dimensions\r\n this.shaftHeight = opts.shaftHeight ?? 17;\r\n this.headHeight = opts.headHeight ?? 8;\r\n this.height = opts.height ?? (this.shaftHeight + this.headHeight);\r\n this.shaftRadius = opts.shaftRadius ?? 3;\r\n this.headRadius = opts.headRadius ?? 6;\r\n this.baseRadius = opts.baseRadius ?? 8;\r\n \r\n // Color and transparency\r\n this.color = opts.color \r\n ? C.Color.fromCssColorString(opts.color) \r\n : C.Color.fromCssColorString('#FFD700');\r\n this.shaftAlpha = opts.shaftAlpha ?? 1.0;\r\n this.headAlpha = opts.headAlpha ?? 1.0;\r\n this.baseAlpha = opts.baseAlpha ?? 0.65;\r\n \r\n // Outline\r\n this.outline = opts.outline ?? false;\r\n this.outlineColor = opts.outlineColor \r\n ? C.Color.fromCssColorString(opts.outlineColor)\r\n : this.color.darken(0.3, new C.Color());\r\n \r\n // 动态缩放\r\n this.dynamicScale = opts.dynamicScale ?? false;\r\n this.viewer = opts.viewer;\r\n this.referenceDistance = opts.referenceDistance ?? 500;\r\n this.minScale = opts.minScale ?? 0.3;\r\n this.maxScale = opts.maxScale ?? 3.0;\r\n }\r\n\r\n /**\r\n * Create arrow entities at given position\r\n * Returns array of 3 entities: [shaft, head, base]\r\n * \r\n * @param layer - Cesium CustomDataSource to add entities to\r\n * @param position - Ground position (Cartesian3)\r\n * @param baseHeight - Ground height in meters\r\n * @param properties - Additional properties for entities\r\n * @returns Array of created entities [shaft, head, base]\r\n */\r\n createEntities(\r\n layer: Cesium.CustomDataSource,\r\n position: Cesium.Cartesian3,\r\n baseHeight: number,\r\n properties?: any\r\n ): Cesium.Entity[] {\r\n const C: any = this.CesiumNS as any;\r\n const entities: Cesium.Entity[] = [];\r\n \r\n // Get longitude and latitude from position\r\n const carto = C.Cartographic.fromCartesian(position);\r\n const lon = C.Math.toDegrees(carto.longitude);\r\n const lat = C.Math.toDegrees(carto.latitude);\r\n \r\n // 动态缩放因子计算\r\n const computeScaleFactor = () => {\r\n if (!this.dynamicScale || !this.viewer) return 1;\r\n try {\r\n const cameraPos = this.viewer.camera.positionWC;\r\n const distance = C.Cartesian3.distance(cameraPos, position);\r\n const rawScale = distance / this.referenceDistance;\r\n return Math.max(this.minScale, Math.min(this.maxScale, rawScale));\r\n } catch {\r\n return 1;\r\n }\r\n };\r\n \r\n // 定期更新缩放因子(每帧)\r\n if (this.dynamicScale && this.viewer) {\r\n this.viewer.scene.preRender.addEventListener(() => {\r\n this.cachedScaleFactor = computeScaleFactor();\r\n });\r\n }\r\n \r\n // 使用基准位置计算朝向,确保圆柱体沿 ENU 的 Up 方向\r\n const hpr = new C.HeadingPitchRoll(0, 0, 0);\r\n const baseOrientation = C.Transforms.headingPitchRollQuaternion(position, hpr);\r\n const fixedOrientation = new C.ConstantProperty(baseOrientation);\r\n \r\n // 动态位置和尺寸(如果启用缩放)\r\n const getShaftPosition = () => {\r\n const scale = this.cachedScaleFactor;\r\n return C.Cartesian3.fromDegrees(lon, lat, baseHeight + (this.shaftHeight * scale) / 2);\r\n };\r\n const getHeadPosition = () => {\r\n const scale = this.cachedScaleFactor;\r\n return C.Cartesian3.fromDegrees(lon, lat, baseHeight + this.shaftHeight * scale + (this.headHeight * scale) / 2);\r\n };\r\n \r\n // 1. Shaft (cylinder)\r\n const shaftEntity = (layer as any).entities.add({\r\n position: this.dynamicScale \r\n ? new C.CallbackProperty(getShaftPosition, false)\r\n : new C.ConstantPositionProperty(C.Cartesian3.fromDegrees(lon, lat, baseHeight + this.shaftHeight / 2)),\r\n orientation: fixedOrientation,\r\n cylinder: {\r\n length: this.dynamicScale \r\n ? new C.CallbackProperty(() => this.shaftHeight * this.cachedScaleFactor, false)\r\n : this.shaftHeight,\r\n topRadius: this.dynamicScale\r\n ? new C.CallbackProperty(() => this.shaftRadius * this.cachedScaleFactor, false)\r\n : this.shaftRadius,\r\n bottomRadius: this.dynamicScale\r\n ? new C.CallbackProperty(() => this.shaftRadius * this.cachedScaleFactor, false)\r\n : this.shaftRadius,\r\n material: this.color.withAlpha(this.shaftAlpha),\r\n outline: this.outline,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: 2,\r\n },\r\n properties: {\r\n ...properties,\r\n _arrowPart: 'shaft',\r\n },\r\n } as any);\r\n entities.push(shaftEntity);\r\n \r\n // 2. Head (cone - cylinder with topRadius=0)\r\n const headEntity = (layer as any).entities.add({\r\n position: this.dynamicScale\r\n ? new C.CallbackProperty(getHeadPosition, false)\r\n : new C.ConstantPositionProperty(C.Cartesian3.fromDegrees(lon, lat, baseHeight + this.shaftHeight + this.headHeight / 2)),\r\n orientation: fixedOrientation,\r\n cylinder: {\r\n length: this.dynamicScale\r\n ? new C.CallbackProperty(() => this.headHeight * this.cachedScaleFactor, false)\r\n : this.headHeight,\r\n topRadius: 0, // Creates cone shape\r\n bottomRadius: this.dynamicScale\r\n ? new C.CallbackProperty(() => this.headRadius * this.cachedScaleFactor, false)\r\n : this.headRadius,\r\n material: this.color.withAlpha(this.headAlpha),\r\n outline: this.outline,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: 2,\r\n },\r\n properties: {\r\n ...properties,\r\n _arrowPart: 'head',\r\n },\r\n } as any);\r\n entities.push(headEntity);\r\n \r\n // 3. Base (ellipse/circle)\r\n const baseEntity = (layer as any).entities.add({\r\n position: position,\r\n ellipse: {\r\n semiMajorAxis: this.dynamicScale\r\n ? new C.CallbackProperty(() => this.baseRadius * this.cachedScaleFactor, false)\r\n : this.baseRadius,\r\n semiMinorAxis: this.dynamicScale\r\n ? new C.CallbackProperty(() => this.baseRadius * this.cachedScaleFactor, false)\r\n : this.baseRadius,\r\n height: baseHeight,\r\n material: this.color.withAlpha(this.baseAlpha),\r\n outline: this.outline,\r\n outlineColor: this.outlineColor,\r\n outlineWidth: 2,\r\n },\r\n properties: {\r\n ...properties,\r\n _arrowPart: 'base',\r\n },\r\n } as any);\r\n entities.push(baseEntity);\r\n \r\n return entities;\r\n }\r\n\r\n /**\r\n * Get the color\r\n */\r\n getColor(): any {\r\n return this.color;\r\n }\r\n\r\n /**\r\n * Update arrow color\r\n */\r\n setColor(color: string) {\r\n const C: any = this.CesiumNS as any;\r\n this.color = C.Color.fromCssColorString(color);\r\n }\r\n\r\n /**\r\n * Update dimensions\r\n */\r\n setDimensions(opts: {\r\n shaftHeight?: number;\r\n headHeight?: number;\r\n shaftRadius?: number;\r\n headRadius?: number;\r\n baseRadius?: number;\r\n }) {\r\n if (opts.shaftHeight !== undefined) this.shaftHeight = opts.shaftHeight;\r\n if (opts.headHeight !== undefined) this.headHeight = opts.headHeight;\r\n if (opts.shaftRadius !== undefined) this.shaftRadius = opts.shaftRadius;\r\n if (opts.headRadius !== undefined) this.headRadius = opts.headRadius;\r\n if (opts.baseRadius !== undefined) this.baseRadius = opts.baseRadius;\r\n this.height = this.shaftHeight + this.headHeight;\r\n }\r\n\r\n /**\r\n * Update transparency\r\n */\r\n setAlpha(opts: {\r\n shaftAlpha?: number;\r\n headAlpha?: number;\r\n baseAlpha?: number;\r\n }) {\r\n if (opts.shaftAlpha !== undefined) this.shaftAlpha = opts.shaftAlpha;\r\n if (opts.headAlpha !== undefined) this.headAlpha = opts.headAlpha;\r\n if (opts.baseAlpha !== undefined) this.baseAlpha = opts.baseAlpha;\r\n }\r\n\r\n /**\r\n * Get current dimensions\r\n */\r\n getDimensions() {\r\n return {\r\n height: this.height,\r\n shaftHeight: this.shaftHeight,\r\n headHeight: this.headHeight,\r\n shaftRadius: this.shaftRadius,\r\n headRadius: this.headRadius,\r\n baseRadius: this.baseRadius,\r\n };\r\n }\r\n\r\n /**\r\n * Get current alpha values\r\n */\r\n getAlpha() {\r\n return {\r\n shaftAlpha: this.shaftAlpha,\r\n headAlpha: this.headAlpha,\r\n baseAlpha: this.baseAlpha,\r\n };\r\n }\r\n\r\n /**\r\n * Get total height\r\n */\r\n getHeight(): number {\r\n return this.height;\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { startPathEditing as startPathEditingImpl } from './pathEditing';\r\nimport { ArrowShape } from './ArrowShape';\r\nimport type { VertexDetailInfo } from './editing/VertexDetailInfo';\r\n\r\nexport function startPathDrawing(\r\n CesiumNS: typeof Cesium,\r\n viewer: Cesium.Viewer,\r\n options?: {\r\n layer?: Cesium.CustomDataSource;\r\n idPrefix?: string;\r\n /**\r\n * 默认用于相对高度模式的高度偏移(例如相对地形时的离地高度)\r\n * 对于 absolute 模式不强制添加该偏移(保持点击的原始海拔),保持向后兼容可选。\r\n */\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n /** 航点高度模式 (海拔高度 / 相对起飞点 / 相对地形) */\r\n altitudeMode?: 'absolute' | 'relativeToStart' | 'relativeToGround';\r\n /** 爬升高度(从地面起飞点到第一个空中点之前的垂直段高度)。<=0 表示不生成爬升隐藏折点 */\r\n climbHeight?: number;\r\n /** 创建起飞点后是否自动进入编辑模式 (可传 true 或提供 { preview: {...} } ) */\r\n autoStartEditing?:\r\n | boolean\r\n | {\r\n preview?: {\r\n enabled?: boolean;\r\n showFootprint?: boolean;\r\n fov?: number;\r\n pitch?: number;\r\n roll?: number;\r\n lengthFactor?: number;\r\n container?: HTMLElement;\r\n };\r\n };\r\n /** 当自动进入编辑模式后,通过此回调获取编辑会话 */\r\n onEditingStarted?: (editSession: {\r\n saveAndStop: () => {\r\n entity: any;\r\n positions: any[];\r\n startPoint: {\r\n position: any;\r\n };\r\n climbHeight?: number;\r\n waypointData: Array<{\r\n position: any;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n fov: number;\r\n index: number;\r\n distance: number;\r\n }>;\r\n altitudeMode?: string;\r\n hasHiddenClimb?: boolean;\r\n };\r\n stop: () => void;\r\n }) => void;\r\n /** 🎯 当用户选中顶点时触发,返回完整的顶点详细信息 */\r\n onVertexSelectDetail?: (info: VertexDetailInfo) => void;\r\n },\r\n onComplete?: (entity: Cesium.Entity) => void,\r\n): { stop: () => void } {\r\n const C: any = CesiumNS as any;\r\n const layer: any = options?.layer ?? new C.CustomDataSource('Paths');\r\n if (!options?.layer) viewer.dataSources.add(layer);\r\n const altitudeMode = options?.altitudeMode ?? 'absolute';\r\n const climbHeight = Number(options?.climbHeight) || 100;\r\n\r\n // Styling constants\r\n const DEFAULT_MAIN_WIDTH = options?.width ?? 6;\r\n\r\n // Utilities: (none)\r\n\r\n // 起飞点(地面 0 号 vertex)cartographic 信息\r\n let startCartographic: any | undefined;\r\n // 是否已经建立起飞点\r\n let hasStart = false;\r\n // 隐藏的爬升折点(起飞点垂直向上),仅当 climbHeight > 0 时存在(无需单独句柄)\r\n // 🔧 创建的航线 entity(用于 stop 时清理)\r\n let createdEntity: any = undefined;\r\n\r\n /**\r\n * try to get a Cartesian3 from mouse event\r\n * @param movement - Cesium.ScreenSpaceEventHandler.PositionedEvent | Cesium.ScreenSpaceEventHandler.MotionEvent | Cesium.Cartesian2\r\n * @returns\r\n */\r\n const getPositionFromMouse = (movement: any): any | undefined => {\r\n const scene: any = (viewer as any).scene;\r\n const winPos = movement?.position ?? movement?.endPosition ?? movement; // Window position from mouse event, {x:..., y:...}:cartesian2.\r\n if (!winPos) return undefined;\r\n let cart: any | undefined;\r\n try {\r\n cart = scene.pickPosition?.(winPos); // Returns the cartesian2!!!!! position reconstructed from the depth buffer and window position.\r\n } catch {}\r\n if (!cart) {\r\n const ray = (viewer.camera as any).getPickRay?.(winPos); // Create a ray from the camera position through the pixel at windowPosition in world coordinates, <cartesian3> | undefined.\r\n cart = ray ? scene.globe?.pick?.(ray, scene) : undefined; // try to gets the depth-test ellipsoid. pick(ray, scene) returns the intersection of the ray with the globe, or undefined if there is no intersection.\r\n }\r\n return cart; // Cartesian3 | undefined\r\n };\r\n\r\n /**\r\n * ensure the cartesian has a height (defaultHeight if none)\r\n * @param cart - Cesium.Cartesian3\r\n * @returns\r\n */\r\n const toCartographic = (cart: any): any | undefined => {\r\n try {\r\n return C.Cartographic.fromCartesian(cart);\r\n } catch {\r\n return undefined;\r\n }\r\n };\r\n\r\n // State\r\n let handler: any;\r\n const positions: any[] = [];\r\n const tempHandles: any[] = [];\r\n\r\n handler = new C.ScreenSpaceEventHandler((viewer.scene as any).canvas);\r\n\r\n // Left click: only create the start point (and optional climb) then finalize immediately.\r\n handler.setInputAction((movement: any) => {\r\n if (hasStart) return; // 防止重复创建\r\n const picked = getPositionFromMouse(movement);\r\n if (!picked) return;\r\n const carto = toCartographic(picked);\r\n if (!carto) return;\r\n\r\n // 起飞点\r\n startCartographic = new C.Cartographic(carto.longitude, carto.latitude, carto.height);\r\n const groundPos = C.Cartesian3.fromDegrees(\r\n C.Math.toDegrees(carto.longitude),\r\n C.Math.toDegrees(carto.latitude),\r\n startCartographic.height,\r\n );\r\n positions.push(groundPos);\r\n \r\n // 创建垂直向上的 3D 箭头标记(起飞点)\r\n const arrowCarto = toCartographic(groundPos);\r\n const baseHeight = arrowCarto ? arrowCarto.height : 0;\r\n \r\n // 使用 ArrowShape 类创建箭头(支持动态缩放)\r\n const arrowShape = new ArrowShape(CesiumNS, {\r\n shaftHeight: 12,\r\n headHeight: 12,\r\n shaftRadius: 4,\r\n headRadius: 8,\r\n baseRadius: 12,\r\n color: '#FFD700',\r\n shaftAlpha: 1.0,\r\n headAlpha: 1.0,\r\n baseAlpha: 0.5,\r\n // 启用动态缩放,和无人机模型一样根据相机距离调整大小\r\n dynamicScale: true,\r\n viewer: viewer,\r\n referenceDistance: 300,\r\n minScale: 0.3,\r\n maxScale: 2.0,\r\n });\r\n \r\n // 创建箭头实体(箭身、箭头、底座)\r\n const arrowEntities = arrowShape.createEntities(\r\n layer,\r\n groundPos,\r\n baseHeight,\r\n { _type: 'path-vertex', _vertexIndex: 0, _isStart: true }\r\n );\r\n \r\n // 将所有箭头组件添加到 tempHandles\r\n tempHandles.push(...arrowEntities);\r\n \r\n hasStart = true;\r\n if (climbHeight > 0) {\r\n const climbPos = C.Cartesian3.fromDegrees(\r\n C.Math.toDegrees(startCartographic.longitude),\r\n C.Math.toDegrees(startCartographic.latitude),\r\n startCartographic.height + climbHeight,\r\n );\r\n positions.push(climbPos);\r\n }\r\n\r\n // 仅创建起始结构:实体只含起飞点(+隐藏爬升)。后续航点交由 pathEditing 处理。\r\n let created: any;\r\n try {\r\n const id = `${options?.idPrefix ?? 'path'}-${Date.now().toString(36)}`;\r\n\r\n // 使用 CallbackProperty 包装 positions,使主体与箭头覆盖层能动态获取\r\n const pathPositions = new C.CallbackProperty(() => {\r\n const p = created?.polyline?.positions;\r\n if (p && typeof p.getValue === 'function') {\r\n try {\r\n return p.getValue();\r\n } catch {}\r\n }\r\n return positions.slice();\r\n }, false);\r\n\r\n created = layer.entities.add({\r\n id,\r\n name: 'Path',\r\n polyline: {\r\n positions: pathPositions,\r\n width: DEFAULT_MAIN_WIDTH,\r\n material: new C.PolylineOutlineMaterialProperty({\r\n color: C.Color.LIME,\r\n outlineColor: C.Color.WHITE,\r\n outlineWidth: 2,\r\n }),\r\n clampToGround: false,\r\n },\r\n properties: {\r\n _altitudeMode: altitudeMode,\r\n _climbHeight: climbHeight,\r\n _hasHiddenClimb: climbHeight > 0,\r\n },\r\n } as any);\r\n \r\n // 🔧 同步到外层变量,用于 stop() 时清理\r\n createdEntity = created;\r\n\r\n // 创建箭头覆盖层:复用相同的 positions,稍微抬升,保证视觉悬浮于主路径之上\r\n // try {\r\n // // 若 created 的 positions 将在后续编辑时变化,ArrowPathOverlay 会通过 CallbackProperty 同步\r\n // const overlay = new ArrowPathOverlay(CesiumNS as any, layer as any, pathPositions, {\r\n // width: DEFAULT_MAIN_WIDTH,\r\n // heightOffset: 0.2,\r\n // arrowSpacingMeters: 30,\r\n // color: C.Color.WHITE,\r\n // });\r\n // // 将 overlay id 存在主实体属性中,便于管理(可选)\r\n // try {\r\n // const ent = overlay.getEntity?.();\r\n // if (ent) {\r\n // (created as any).properties = {\r\n // ...(created as any).properties,\r\n // _arrowOverlayId: ent.id,\r\n // } as any;\r\n // }\r\n // } catch {}\r\n // } catch {}\r\n\r\n // 给起飞点 handle 绑定 owner 信息\r\n try {\r\n tempHandles.forEach((hh, idx) => {\r\n try {\r\n (hh as any).properties = {\r\n ...(hh as any).properties,\r\n _type: 'path-vertex',\r\n _ownerId: id,\r\n _vertexIndex: idx,\r\n _isStart: idx === 0,\r\n } as any;\r\n } catch {}\r\n });\r\n } catch {}\r\n } finally {\r\n try {\r\n handler?.destroy();\r\n } catch {}\r\n handler = undefined;\r\n }\r\n if (created) {\r\n try {\r\n onComplete?.(created);\r\n } catch {}\r\n // 自动进入编辑\r\n try {\r\n const auto = options?.autoStartEditing;\r\n if (auto) {\r\n const editOptions: any = {};\r\n if (typeof auto === 'object' && auto.preview) {\r\n editOptions.preview = auto.preview;\r\n } else {\r\n // 默认开启预览窗口\r\n editOptions.preview = { enabled: true };\r\n }\r\n \r\n // 🎯 传递所有顶点操作回调(从 autoStartEditing 对象中获取)\r\n const autoOpts: any = typeof auto === 'object' ? auto : {};\r\n if (autoOpts.onVertexSelectDetail) {\r\n editOptions.onVertexSelectDetail = autoOpts.onVertexSelectDetail;\r\n }\r\n if (autoOpts.onVertexDragMoveDetail) {\r\n editOptions.onVertexDragMoveDetail = autoOpts.onVertexDragMoveDetail;\r\n }\r\n if (autoOpts.onVertexDragCompleteDetail) {\r\n editOptions.onVertexDragCompleteDetail = autoOpts.onVertexDragCompleteDetail;\r\n }\r\n if (autoOpts.onVertexInsertDetail) {\r\n editOptions.onVertexInsertDetail = autoOpts.onVertexInsertDetail;\r\n }\r\n if (autoOpts.onVertexDeleteDetail) {\r\n editOptions.onVertexDeleteDetail = autoOpts.onVertexDeleteDetail;\r\n }\r\n \r\n const editSession = startPathEditingImpl(CesiumNS as any, viewer as any, created as any, editOptions); // 启动编辑模式!!!!\r\n // 通过回调返回编辑会话\r\n if (editSession && options?.onEditingStarted) {\r\n try {\r\n options.onEditingStarted(editSession);\r\n } catch {}\r\n }\r\n }\r\n } catch {}\r\n }\r\n }, C.ScreenSpaceEventType.LEFT_CLICK);\r\n\r\n return {\r\n stop: () => {\r\n // 移除临时句柄\r\n for (const h of tempHandles) {\r\n try {\r\n (layer.entities as any).remove(h);\r\n } catch {}\r\n }\r\n // 销毁事件处理器\r\n try {\r\n handler?.destroy();\r\n } catch {}\r\n // 🔧 移除创建的航线 entity\r\n if (createdEntity) {\r\n try {\r\n (layer.entities as any).remove(createdEntity);\r\n } catch {}\r\n }\r\n },\r\n };\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\n/**\r\n * Sinofly 航点信息接口\r\n */\r\nexport interface SinoflyWaypointInfo {\r\n waypointId: number | string;\r\n waylineId: number | string;\r\n index: number;\r\n latitude: string;\r\n longitude: string;\r\n altitude: string;\r\n action: string;\r\n noReturn: number;\r\n createUserId?: string;\r\n createTime?: string;\r\n modifyUserId?: string;\r\n modifyTime?: string;\r\n}\r\n\r\n/**\r\n * Sinofly 航线路数据结构接口\r\n */\r\nexport interface SinoflyWaylineData {\r\n waylineId: number | string;\r\n waylineName: string;\r\n waylineType: number;\r\n waylineVersion: string;\r\n source: number;\r\n heightType?: string;\r\n droneModelKey: number | string;\r\n relativeHeight: number;\r\n autoFlightSpeed: number;\r\n takeOffSecurityHeight: number;\r\n globalRthHeight: number;\r\n fileId: number | string;\r\n fileMd5: string;\r\n distance: number;\r\n duration: number;\r\n waypointNumber: number;\r\n photoNumber: number;\r\n createUserId?: string;\r\n createTime?: string;\r\n modifyUserId?: string;\r\n modifyTime?: string;\r\n stationId?: number;\r\n subarrayId?: number;\r\n stationName?: string;\r\n subarrayName?: string;\r\n /** 起始点位置坐标(Cartesian3 序列化后的字符串,JSON 格式包含 longitude/latitude/height) */\r\n takeOffRefPoint?: string;\r\n thumbnailFileId?: number;\r\n waypointInfo: SinoflyWaypointInfo[];\r\n}\r\n\r\n/**\r\n * 转换后的航点数据格式(用于 renderFlightPath)\r\n */\r\nexport interface ConvertedWaypointData {\r\n position: Cesium.Cartesian3;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n fov: number;\r\n index: number;\r\n}\r\n\r\n/**\r\n * 转换后的航线路数据格式\r\n */\r\nexport interface ConvertedWaylineData {\r\n id?: string;\r\n name?: string;\r\n description?: string;\r\n waypointData: ConvertedWaypointData[];\r\n metadata?: {\r\n waylineId: number | string;\r\n waylineType: number;\r\n waylineVersion: string;\r\n relativeHeight: number;\r\n autoFlightSpeed: number;\r\n distance: number;\r\n duration: number;\r\n stationId?: number;\r\n subarrayId?: number;\r\n stationName?: string;\r\n subarrayName?: string;\r\n takeOffSecurityHeight?: number;\r\n hasTakeOffRefPoint?: boolean;\r\n [key: string]: any;\r\n };\r\n}\r\n\r\n/**\r\n * Sinofly 数据适配器配置选项\r\n */\r\nexport interface SinoflyAdapterOptions {\r\n /**\r\n * Cesium 命名空间(用于创建 Cartesian3)\r\n */\r\n CesiumNS: typeof Cesium;\r\n \r\n /**\r\n * 默认航向角(度),默认 0\r\n */\r\n defaultHeading?: number;\r\n \r\n /**\r\n * 默认俯仰角(度),默认 -10\r\n */\r\n defaultPitch?: number;\r\n \r\n /**\r\n * 默认横滚角(度),默认 0\r\n */\r\n defaultRoll?: number;\r\n \r\n /**\r\n * 默认视场角(度),默认 50\r\n */\r\n defaultFov?: number;\r\n \r\n /**\r\n * 是否从 action 字段解析姿态信息(默认 true)\r\n * 如果为 true,会尝试从 action JSON 字符串中解析姿态信息:\r\n * - heading: 从 rotateYaw 或 rotateYaw.aircraftHeading 获取\r\n * - pitch: 从 gimbalRotate 或 gimbalRotate.gimbalPitchRotateAngle 获取\r\n * - fov: 从 zoom 或 zoom.focalLength 获取\r\n * - roll: 保持默认值(Sinofly 数据中通常不包含 roll 信息)\r\n */\r\n parseActionForPose?: boolean;\r\n \r\n /**\r\n * 是否按 index 排序航点(默认 true)\r\n */\r\n sortByIndex?: boolean;\r\n \r\n /**\r\n * 自定义航点过滤函数,返回 false 的航点将被过滤\r\n */\r\n filterWaypoint?: (waypoint: SinoflyWaypointInfo, index: number) => boolean;\r\n}\r\n\r\n/**\r\n * 从 action 字符串中解析姿态信息\r\n * action 字段是 JSON 字符串,包含 Sinofly 格式的姿态信息:\r\n * - rotateYaw / rotateYaw.aircraftHeading -> heading\r\n * - gimbalRotate / gimbalRotate.gimbalPitchRotateAngle -> pitch\r\n * - zoom / zoom.focalLength -> fov\r\n * - roll 通常不在 Sinofly 数据中,保持默认值\r\n * \r\n * @param action JSON 字符串格式的 action 字段\r\n * @returns 解析出的姿态信息对象\r\n * \r\n * @example\r\n * ```typescript\r\n * // 示例 1: 嵌套结构\r\n * const action1 = JSON.stringify({\r\n * rotateYaw: { aircraftHeading: 45 },\r\n * gimbalRotate: { gimbalPitchRotateAngle: -10 },\r\n * zoom: { focalLength: 50 }\r\n * });\r\n * \r\n * // 示例 2: 扁平结构\r\n * const action2 = JSON.stringify({\r\n * rotateYaw: 45,\r\n * gimbalRotate: -10,\r\n * zoom: 50\r\n * });\r\n * \r\n * // 示例 3: 混合结构\r\n * const action3 = JSON.stringify({\r\n * rotateYaw: { aircraftHeading: 45 },\r\n * gimbalRotate: -10,\r\n * zoom: { focalLength: 50 }\r\n * });\r\n * ```\r\n */\r\nfunction parsePoseFromAction(action: string): {\r\n heading?: number;\r\n pitch?: number;\r\n roll?: number;\r\n fov?: number;\r\n} {\r\n if (!action || typeof action !== 'string' || action.trim() === '') {\r\n return {};\r\n }\r\n\r\n try {\r\n // 尝试解析 JSON\r\n let parsed = JSON.parse(action);\r\n \r\n // 如果解析结果是数组,取第一个元素\r\n if (Array.isArray(parsed)) {\r\n if (parsed.length === 0) {\r\n return {};\r\n }\r\n parsed = parsed[0];\r\n }\r\n \r\n if (typeof parsed !== 'object' || parsed === null) {\r\n return {};\r\n }\r\n\r\n const result: {\r\n heading?: number;\r\n pitch?: number;\r\n roll?: number;\r\n fov?: number;\r\n } = {};\r\n\r\n // 解析 heading: 优先从 rotateYaw.aircraftHeading 获取,其次从 rotateYaw 直接获取\r\n if (parsed.rotateYaw !== undefined && parsed.rotateYaw !== null) {\r\n if (\r\n typeof parsed.rotateYaw === 'object' &&\r\n typeof parsed.rotateYaw.aircraftHeading === 'number'\r\n ) {\r\n result.heading = parsed.rotateYaw.aircraftHeading;\r\n } else if (typeof parsed.rotateYaw === 'number') {\r\n result.heading = parsed.rotateYaw;\r\n }\r\n }\r\n\r\n // 解析 pitch: 优先从 gimbalRotate.gimbalPitchRotateAngle 获取,其次从 gimbalRotate 直接获取\r\n if (parsed.gimbalRotate !== undefined && parsed.gimbalRotate !== null) {\r\n if (\r\n typeof parsed.gimbalRotate === 'object' &&\r\n typeof parsed.gimbalRotate.gimbalPitchRotateAngle === 'number'\r\n ) {\r\n result.pitch = parsed.gimbalRotate.gimbalPitchRotateAngle;\r\n } else if (typeof parsed.gimbalRotate === 'number') {\r\n result.pitch = parsed.gimbalRotate;\r\n }\r\n }\r\n\r\n // 解析 fov: 优先从 zoom.focalLength 获取,其次从 zoom 直接获取\r\n if (parsed.zoom !== undefined && parsed.zoom !== null) {\r\n if (\r\n typeof parsed.zoom === 'object' &&\r\n typeof parsed.zoom.focalLength === 'number'\r\n ) {\r\n result.fov = parsed.zoom.focalLength;\r\n } else if (typeof parsed.zoom === 'number') {\r\n result.fov = parsed.zoom;\r\n }\r\n }\r\n\r\n // roll 通常在 Sinofly 数据中不存在,保持 undefined\r\n // 如果将来需要支持,可以在这里添加解析逻辑\r\n\r\n // 兼容性:如果存在标准的 heading/pitch/roll/fov 字段,也支持\r\n if (result.heading === undefined && typeof parsed.heading === 'number') {\r\n result.heading = parsed.heading;\r\n }\r\n if (result.pitch === undefined && typeof parsed.pitch === 'number') {\r\n result.pitch = parsed.pitch;\r\n }\r\n if (typeof parsed.roll === 'number') {\r\n result.roll = parsed.roll;\r\n }\r\n if (result.fov === undefined && typeof parsed.fov === 'number') {\r\n result.fov = parsed.fov;\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n // JSON 解析失败,尝试从字符串中提取数字(向后兼容)\r\n const numbers = action.match(/-?\\d+\\.?\\d*/g);\r\n if (numbers && numbers.length >= 4) {\r\n return {\r\n heading: parseFloat(numbers[0]),\r\n pitch: parseFloat(numbers[1]),\r\n roll: parseFloat(numbers[2]),\r\n fov: parseFloat(numbers[3]),\r\n };\r\n }\r\n\r\n // 无法解析,返回空对象\r\n // console.warn('[sinoflyAdapter] 无法解析 action 字段:', action, error);\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * 将字符串坐标转换为数字\r\n */\r\nfunction parseCoordinate(value: string | number): number {\r\n if (typeof value === 'number') {\r\n return value;\r\n }\r\n if (typeof value === 'string') {\r\n const parsed = parseFloat(value);\r\n return isNaN(parsed) ? 0 : parsed;\r\n }\r\n return 0;\r\n}\r\n\r\n/**\r\n * 解析 takeOffRefPoint 字符串,返回起始点和隐藏转折点位置\r\n * 支持两种格式:\r\n * 1. 逗号分隔字符串:`\"纬度,经度,高度\"` (例如: \"22.580235,113.932885,21.083721\")\r\n * 2. JSON 字符串:`{\"longitude\": 度数, \"latitude\": 度数, \"height\": 高度(米)}`\r\n * \r\n * @param takeOffRefPoint 起始点位置坐标字符串\r\n * @param takeOffSecurityHeight 起飞安全高度(米),用于计算隐藏转折点\r\n * @param CesiumNS Cesium 命名空间\r\n * @returns 起始点和隐藏转折点位置,如果 takeOffRefPoint 不存在则返回 null\r\n */\r\nfunction parseTakeOffRefPoint(\r\n takeOffRefPoint: string | undefined,\r\n takeOffSecurityHeight: number,\r\n CesiumNS: typeof Cesium\r\n): {\r\n startPosition: Cesium.Cartesian3;\r\n climbPosition: Cesium.Cartesian3;\r\n} | null {\r\n if (!takeOffRefPoint || typeof takeOffRefPoint !== 'string' || takeOffRefPoint.trim() === '') {\r\n return null;\r\n }\r\n\r\n const C: any = CesiumNS as any;\r\n let longitude: number;\r\n let latitude: number;\r\n let height: number;\r\n\r\n const trimmed = takeOffRefPoint.trim();\r\n\r\n // 首先尝试解析为逗号分隔的字符串格式(纬度,经度,高度)\r\n if (trimmed.includes(',')) {\r\n try {\r\n const parts = trimmed.split(',').map((p) => p.trim());\r\n if (parts.length >= 2) {\r\n latitude = parseFloat(parts[0]);\r\n longitude = parseFloat(parts[1]);\r\n height = parts.length >= 3 ? parseFloat(parts[2]) : takeOffSecurityHeight;\r\n\r\n // 验证解析结果\r\n if (isNaN(latitude) || isNaN(longitude) || isNaN(height)) {\r\n throw new Error('无法解析逗号分隔的坐标值');\r\n }\r\n\r\n // 创建起始点位置\r\n const startPosition = C.Cartesian3.fromDegrees(longitude, latitude, height);\r\n\r\n // 创建隐藏转折点位置(垂直向上延申 takeOffSecurityHeight)\r\n const climbPosition = C.Cartesian3.fromDegrees(\r\n longitude,\r\n latitude,\r\n height + takeOffSecurityHeight\r\n );\r\n\r\n return {\r\n startPosition,\r\n climbPosition,\r\n };\r\n }\r\n } catch (error) {\r\n // 如果逗号分隔格式解析失败,继续尝试 JSON 格式\r\n // console.warn('[sinoflyAdapter] 逗号分隔格式解析失败,尝试 JSON 格式:', error);\r\n }\r\n }\r\n\r\n // 尝试解析为 JSON 格式(向后兼容)\r\n try {\r\n const parsed = JSON.parse(takeOffRefPoint);\r\n if (typeof parsed !== 'object' || parsed === null) {\r\n return null;\r\n }\r\n\r\n // 支持多种 JSON 格式\r\n if (typeof parsed.longitude === 'number') {\r\n longitude = parsed.longitude;\r\n } else if (typeof parsed.lon === 'number') {\r\n longitude = parsed.lon;\r\n } else {\r\n return null;\r\n }\r\n\r\n if (typeof parsed.latitude === 'number') {\r\n latitude = parsed.latitude;\r\n } else if (typeof parsed.lat === 'number') {\r\n latitude = parsed.lat;\r\n } else {\r\n return null;\r\n }\r\n\r\n // 高度:优先使用 parsed.height,如果没有则使用 takeOffSecurityHeight\r\n if (typeof parsed.height === 'number') {\r\n height = parsed.height;\r\n } else {\r\n // 如果没有指定高度,使用 takeOffSecurityHeight 作为起始点高度\r\n height = takeOffSecurityHeight;\r\n }\r\n\r\n // 创建起始点位置\r\n const startPosition = C.Cartesian3.fromDegrees(longitude, latitude, height);\r\n\r\n // 创建隐藏转折点位置(垂直向上延申 takeOffSecurityHeight)\r\n const climbPosition = C.Cartesian3.fromDegrees(\r\n longitude,\r\n latitude,\r\n height + takeOffSecurityHeight\r\n );\r\n\r\n return {\r\n startPosition,\r\n climbPosition,\r\n };\r\n } catch (error) {\r\n // console.warn('[sinoflyAdapter] 无法解析 takeOffRefPoint:', takeOffRefPoint, error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * 将 Sinofly 航线路数据转换为本库所需的数据格式\r\n * \r\n * @param data Sinofly 航线路数据\r\n * @param options 适配器配置选项\r\n * @returns 转换后的航线路数据\r\n * \r\n * @example\r\n * ```typescript\r\n * import * as Cesium from 'cesium';\r\n * import { convertSinoflyWayline } from '@jorgmoritz/gis-manager';\r\n * \r\n * const sinoflyData = {\r\n * waylineId: 1,\r\n * waylineName: \"测试航线\",\r\n * waypointInfo: [\r\n * {\r\n * index: 0,\r\n * latitude: \"39.9042\",\r\n * longitude: \"116.4074\",\r\n * altitude: \"100.0\",\r\n * action: JSON.stringify({\r\n * rotateYaw: { aircraftHeading: 45 },\r\n * gimbalRotate: { gimbalPitchRotateAngle: -10 },\r\n * zoom: { focalLength: 50 }\r\n * })\r\n * }\r\n * ]\r\n * };\r\n * \r\n * const converted = convertSinoflyWayline(sinoflyData, {\r\n * CesiumNS: Cesium,\r\n * // parseActionForPose 默认为 true,会自动从 action 中解析姿态信息\r\n * defaultHeading: 0, // 如果 action 中没有 rotateYaw,使用此默认值\r\n * defaultPitch: -10, // 如果 action 中没有 gimbalRotate,使用此默认值\r\n * defaultRoll: 0,\r\n * defaultFov: 50 // 如果 action 中没有 zoom,使用此默认值\r\n * });\r\n * \r\n * // 使用转换后的数据\r\n * czmlPathManager.renderFlightPath({\r\n * id: converted.id,\r\n * name: converted.name,\r\n * waypointData: converted.waypointData,\r\n * description: converted.description\r\n * });\r\n * ```\r\n */\r\nexport function convertSinoflyWayline(\r\n data: SinoflyWaylineData,\r\n options: SinoflyAdapterOptions\r\n): ConvertedWaylineData {\r\n const {\r\n CesiumNS,\r\n defaultHeading = 0,\r\n defaultPitch = -10,\r\n defaultRoll = 0,\r\n defaultFov = 50,\r\n parseActionForPose = true,\r\n sortByIndex = true,\r\n filterWaypoint,\r\n } = options;\r\n\r\n const C: any = CesiumNS as any;\r\n\r\n // 验证输入数据\r\n if (!data) {\r\n throw new Error('[sinoflyAdapter] data 参数不能为空');\r\n }\r\n \r\n if (!data.waypointInfo || !Array.isArray(data.waypointInfo)) {\r\n throw new Error('[sinoflyAdapter] waypointInfo 必须是数组');\r\n }\r\n \r\n if (data.waypointInfo.length === 0) {\r\n // console.warn('[sinoflyAdapter] waypointInfo 数组为空,将返回空的航点数据');\r\n }\r\n\r\n // 验证 waylineId\r\n if (data.waylineId === undefined || data.waylineId === null) {\r\n throw new Error('[sinoflyAdapter] waylineId 不能为空');\r\n }\r\n\r\n // console.log(`[sinoflyAdapter] 开始转换航线 ${data.waylineId},包含 ${data.waypointInfo.length} 个航点`);\r\n \r\n // if (data.takeOffRefPoint) {\r\n // console.log(`[sinoflyAdapter] 检测到 takeOffRefPoint: ${data.takeOffRefPoint}`);\r\n // }\r\n\r\n // 解析 takeOffRefPoint(如果存在)\r\n const takeOffInfo = parseTakeOffRefPoint(\r\n data.takeOffRefPoint,\r\n data.takeOffSecurityHeight,\r\n CesiumNS\r\n );\r\n\r\n // 过滤航点(如果提供了过滤函数)\r\n let waypoints = data.waypointInfo;\r\n if (filterWaypoint) {\r\n waypoints = waypoints.filter(filterWaypoint);\r\n }\r\n\r\n // 按 index 排序(如果启用)\r\n if (sortByIndex) {\r\n waypoints = [...waypoints].sort((a, b) => a.index - b.index);\r\n }\r\n\r\n // 最终航点数据数组\r\n const finalWaypointData: ConvertedWaypointData[] = [];\r\n\r\n // 如果有 takeOffRefPoint,添加起始点和隐藏转折点\r\n if (takeOffInfo) {\r\n // 添加起始点(index 0)\r\n finalWaypointData.push({\r\n position: takeOffInfo.startPosition,\r\n heading: defaultHeading,\r\n pitch: defaultPitch,\r\n roll: defaultRoll,\r\n fov: defaultFov,\r\n index: 0,\r\n });\r\n\r\n // 添加隐藏转折点(index 1)- 垂直向上延申 takeOffSecurityHeight\r\n finalWaypointData.push({\r\n position: takeOffInfo.climbPosition,\r\n heading: defaultHeading,\r\n pitch: defaultPitch,\r\n roll: defaultRoll,\r\n fov: defaultFov,\r\n index: 1,\r\n });\r\n }\r\n\r\n // 转换 waypointInfo 中的航点数据\r\n // 如果存在 takeOffRefPoint,waypointInfo 从 index 2 开始\r\n // 如果不存在 takeOffRefPoint,waypointInfo 从 index 0 开始(第一个标记为 S)\r\n let waypointStartIndex: number;\r\n if (takeOffInfo) {\r\n // 有 takeOffRefPoint:waypointInfo 从 index 2 开始\r\n waypointStartIndex = 2;\r\n } else {\r\n // 没有 takeOffRefPoint:waypointInfo 从 index 0 开始\r\n waypointStartIndex = 0;\r\n }\r\n const convertedWaypoints: ConvertedWaypointData[] = waypoints.map((wp, idx) => {\r\n try {\r\n // 验证航点数据\r\n if (!wp) {\r\n throw new Error(`航点 ${idx} 数据为空`);\r\n }\r\n \r\n if (wp.latitude === undefined || wp.longitude === undefined || wp.altitude === undefined) {\r\n throw new Error(`航点 ${idx} 缺少必要的坐标信息`);\r\n }\r\n\r\n // 解析坐标\r\n const lat = parseCoordinate(wp.latitude);\r\n const lon = parseCoordinate(wp.longitude);\r\n const alt = parseCoordinate(wp.altitude);\r\n\r\n // 验证坐标有效性\r\n if (isNaN(lat) || isNaN(lon) || isNaN(alt)) {\r\n throw new Error(`航点 ${idx} 坐标解析失败: lat=${wp.latitude}, lon=${wp.longitude}, alt=${wp.altitude}`);\r\n }\r\n\r\n // 创建 Cartesian3 位置\r\n const position = C.Cartesian3.fromDegrees(lon, lat, alt);\r\n\r\n // 解析姿态信息\r\n let heading = defaultHeading;\r\n let pitch = defaultPitch;\r\n let roll = defaultRoll;\r\n let fov = defaultFov;\r\n\r\n if (parseActionForPose && wp.action) {\r\n try {\r\n const poseFromAction = parsePoseFromAction(wp.action);\r\n if (poseFromAction.heading !== undefined) heading = poseFromAction.heading;\r\n if (poseFromAction.pitch !== undefined) pitch = poseFromAction.pitch;\r\n if (poseFromAction.roll !== undefined) roll = poseFromAction.roll;\r\n if (poseFromAction.fov !== undefined) fov = poseFromAction.fov;\r\n } catch (actionError) {\r\n // console.warn(`[sinoflyAdapter] 航点 ${idx} action 解析失败:`, actionError);\r\n }\r\n }\r\n\r\n return {\r\n position,\r\n heading,\r\n pitch,\r\n roll,\r\n fov,\r\n index: waypointStartIndex + idx, // 重新分配 index,从 waypointStartIndex 开始\r\n };\r\n } catch (error) {\r\n // console.error(`[sinoflyAdapter] 航点 ${idx} 转换失败:`, error);\r\n throw new Error(`航点 ${idx} 转换失败: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n });\r\n\r\n // 合并所有航点数据\r\n const waypointData = [...finalWaypointData, ...convertedWaypoints];\r\n \r\n // 验证最终结果\r\n if (!Array.isArray(waypointData)) {\r\n throw new Error('[sinoflyAdapter] waypointData 不是数组');\r\n }\r\n \r\n // console.log(`[sinoflyAdapter] 转换完成,共生成 ${waypointData.length} 个航点`);\r\n\r\n // 构建元数据\r\n const metadata: ConvertedWaylineData['metadata'] = {\r\n waylineId: data.waylineId,\r\n waylineType: data.waylineType,\r\n waylineVersion: data.waylineVersion,\r\n relativeHeight: data.relativeHeight,\r\n autoFlightSpeed: data.autoFlightSpeed,\r\n distance: data.distance,\r\n duration: data.duration,\r\n takeOffSecurityHeight: data.takeOffSecurityHeight,\r\n hasTakeOffRefPoint: !!takeOffInfo,\r\n };\r\n\r\n // 添加可选字段\r\n if (data.stationId !== undefined) metadata!.stationId = data.stationId;\r\n if (data.subarrayId !== undefined) metadata!.subarrayId = data.subarrayId;\r\n if (data.stationName) metadata!.stationName = data.stationName;\r\n if (data.subarrayName) metadata!.subarrayName = data.subarrayName;\r\n\r\n // 返回转换后的数据\r\n return {\r\n id: `wayline-${data.waylineId}`,\r\n name: data.waylineName || `航线-${data.waylineId}`,\r\n description: `航线ID: ${data.waylineId}, 类型: ${data.waylineType}, 航点数: ${data.waypointNumber}`,\r\n waypointData,\r\n metadata,\r\n };\r\n}\r\n\r\n/**\r\n * 批量转换多个 Sinofly 航线路\r\n * \r\n * @param dataList Sinofly 航线路数据数组\r\n * @param options 适配器配置选项\r\n * @returns 转换后的航线路数据数组\r\n * \r\n * @example\r\n * ```typescript\r\n * const results = convertSinoflyWaylines(\r\n * [wayline1, wayline2, wayline3],\r\n * { CesiumNS: Cesium }\r\n * );\r\n * \r\n * results.forEach(result => {\r\n * if (result.success) {\r\n * czmlPathManager.renderFlightPath({\r\n * waypointData: result.data.waypointData,\r\n * name: result.data.name\r\n * });\r\n * } else {\r\n * console.error('转换失败:', result.error);\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function convertSinoflyWaylines(\r\n dataList: SinoflyWaylineData[],\r\n options: SinoflyAdapterOptions\r\n): Array<{\r\n success: boolean;\r\n data?: ConvertedWaylineData;\r\n error?: string;\r\n waylineId?: number | string;\r\n}> {\r\n return dataList.map((data) => {\r\n try {\r\n const converted = convertSinoflyWayline(data, options);\r\n return {\r\n success: true,\r\n data: converted,\r\n waylineId: data.waylineId,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n waylineId: data.waylineId,\r\n };\r\n }\r\n });\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { ArrowShape } from './ArrowShape';\r\nimport { VertexLabelManager } from './editing/VertexLabelManager';\r\nimport { convertSinoflyWayline, type SinoflyWaylineData, type SinoflyAdapterOptions } from '../../utils/sinoflyAdapter';\r\n\r\ntype Entity = Cesium.Entity;\r\ntype ScreenSpaceEventHandler = Cesium.ScreenSpaceEventHandler;\r\n\r\n/**\r\n * 回显飞航路线的选项类型\r\n */\r\nexport interface RenderFlightPathOptions {\r\n /** Sinofly 航线路数据 */\r\n data: SinoflyWaylineData;\r\n /** Sinofly 适配器配置选项 */\r\n adapterOptions?: Omit<SinoflyAdapterOptions, 'CesiumNS'>;\r\n id?: string;\r\n name?: string;\r\n description?: string;\r\n layer?: Cesium.CustomDataSource;\r\n style?: {\r\n width?: number;\r\n color?: Cesium.Color;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n };\r\n hasHiddenClimb?: boolean;\r\n altitudeMode?: string;\r\n climbHeight?: number;\r\n}\r\n\r\n/**\r\n * 回显飞航路线:显示完整飞航路线、航点编号和起始点箭头\r\n * \r\n * 接收 Sinofly 航线路数据,自动转换为本库格式并渲染显示。\r\n * \r\n * 航点逻辑说明:\r\n * - index 0: 起始点(起飞点),显示起始箭头(仅当有 takeOffRefPoint 时)\r\n * - index 1: 隐藏转折点(隐藏爬升点),不显示标签(仅当有 takeOffRefPoint 时)\r\n * - index 2: 第一个航线点,标记为 \"S\"\r\n * - index 3+: 后续航线点,标记为 2, 3, 4...\r\n * \r\n * 如果没有 takeOffRefPoint,则:\r\n * - index 0: 第一个航线点,标记为 \"S\"\r\n * - index 1+: 后续航线点,标记为 2, 3, 4...\r\n * \r\n * @param CesiumNS Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param options 回显选项,包含 Sinofly 数据和配置\r\n * @returns 创建的 polyline 实体\r\n * \r\n * @example\r\n * ```typescript\r\n * // 基本用法\r\n * const sinoflyData = {\r\n * waylineId: \"12345\",\r\n * waylineName: \"测试航线\",\r\n * takeOffSecurityHeight: 50,\r\n * takeOffRefPoint: '{\"longitude\": 116.4074, \"latitude\": 39.9042, \"height\": 100}',\r\n * waypointInfo: [\r\n * { \r\n * index: 0, \r\n * latitude: \"39.9045\", \r\n * longitude: \"116.4078\", \r\n * altitude: \"150.0\", \r\n * action: '[{\"rotateYaw\": {\"aircraftHeading\": 45}, \"gimbalRotate\": {\"gimbalPitchRotateAngle\": -10}}]'\r\n * },\r\n * // ... 更多航点\r\n * ]\r\n * };\r\n * \r\n * const entity = renderFlightPath(Cesium, viewer, {\r\n * data: sinoflyData,\r\n * adapterOptions: {\r\n * parseActionForPose: true,\r\n * defaultHeading: 0,\r\n * defaultPitch: -10\r\n * },\r\n * layer: myLayer,\r\n * style: { width: 8, color: Cesium.Color.GREEN }\r\n * });\r\n * \r\n * // 自定义样式\r\n * const entity = renderFlightPath(Cesium, viewer, {\r\n * data: sinoflyData,\r\n * id: 'my-flight-path',\r\n * name: '自定义航线名称',\r\n * style: {\r\n * width: 10,\r\n * material: new Cesium.PolylineOutlineMaterialProperty({\r\n * color: Cesium.Color.BLUE,\r\n * outlineColor: Cesium.Color.WHITE,\r\n * outlineWidth: 2\r\n * })\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function renderFlightPath(\r\n CesiumNS: typeof Cesium,\r\n viewer: Cesium.Viewer,\r\n options: RenderFlightPathOptions\r\n): Entity {\r\n const C: any = CesiumNS as any;\r\n \r\n // 转换 Sinofly 数据\r\n const sinoflyData = options.data;\r\n \r\n let waypointData: Array<{\r\n position: Cesium.Cartesian3;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n fov: number;\r\n index: number;\r\n }>;\r\n let entityId: string;\r\n let entityName: string | undefined;\r\n let entityDescription: string | undefined;\r\n let hasHiddenClimb: boolean;\r\n let altitudeMode: string | undefined;\r\n let climbHeight: number | undefined;\r\n\r\n try {\r\n // 使用适配器转换数据\r\n const adapterOptions: SinoflyAdapterOptions = {\r\n CesiumNS,\r\n ...options.adapterOptions,\r\n };\r\n \r\n const converted = convertSinoflyWayline(sinoflyData, adapterOptions);\r\n \r\n // 验证转换结果\r\n if (!converted || !converted.waypointData || !Array.isArray(converted.waypointData)) {\r\n throw new Error('转换后的 waypointData 不是有效数组');\r\n }\r\n \r\n waypointData = converted.waypointData;\r\n entityId = options.id ?? converted.id ?? `wayline-${sinoflyData.waylineId}`;\r\n entityName = options.name ?? converted.name;\r\n entityDescription = options.description ?? converted.description;\r\n\r\n // 根据 Sinofly 数据结构判断是否包含起始点和隐藏转折点\r\n // 1. 如果有 takeOffRefPoint,则一定有起始点(index 0)和隐藏转折点(index 1)\r\n // 2. 如果没有 takeOffRefPoint,则没有起始点和隐藏转折点,waypointInfo 从 index 0 开始\r\n const sortedWaypoints = [...waypointData].sort((a, b) => a.index - b.index);\r\n const hasIndex1 = sortedWaypoints.some((wp) => wp.index === 1);\r\n const hasTakeOffRefPoint = converted.metadata?.hasTakeOffRefPoint ?? !!sinoflyData.takeOffRefPoint;\r\n \r\n // 只有当有 takeOffRefPoint 时才有隐藏爬升点(index 1)\r\n // 如果没有 takeOffRefPoint,则没有隐藏爬升点\r\n hasHiddenClimb = options.hasHiddenClimb ?? (hasTakeOffRefPoint && hasIndex1);\r\n \r\n // 从 metadata 中提取信息(如果存在)\r\n altitudeMode = options.altitudeMode ?? converted.metadata?.altitudeMode;\r\n climbHeight = options.climbHeight ?? converted.metadata?.climbHeight ?? converted.metadata?.takeOffSecurityHeight;\r\n } catch (error) {\r\n console.error('[renderFlightPath] Sinofly 数据转换失败:', error);\r\n throw new Error(`Sinofly 数据转换失败: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n\r\n // 验证 waypointData 是否为可迭代对象\r\n if (!waypointData || typeof waypointData[Symbol.iterator] !== 'function') {\r\n console.error('[renderFlightPath] waypointData 不是可迭代对象:', waypointData);\r\n throw new Error('waypointData 必须是可迭代的数组');\r\n }\r\n\r\n // 从 waypointData 中提取 positions 数组,按 index 排序\r\n const sortedWaypoints = [...waypointData].sort((a, b) => a.index - b.index);\r\n const positions: Cesium.Cartesian3[] = sortedWaypoints.map((wp) => wp.position);\r\n\r\n if (positions.length === 0) {\r\n throw new Error('[renderFlightPath] waypointData 不能为空');\r\n }\r\n \r\n console.log(`[renderFlightPath] 开始渲染航线,包含 ${positions.length} 个航点`);\r\n\r\n // 确定 layer\r\n let layer: Cesium.CustomDataSource;\r\n if (options.layer) {\r\n layer = options.layer;\r\n } else {\r\n layer = new C.CustomDataSource(`flight-path-datasource-${Date.now()}`);\r\n viewer.dataSources.add(layer);\r\n }\r\n\r\n // 确定隐藏爬升点索引\r\n // 根据航点逻辑:index 0 是起始点,index 1 是隐藏转折点(如果存在)\r\n // 如果 hasHiddenClimb 为 true 且至少有 2 个航点,则 index 1 是隐藏爬升点\r\n const hiddenClimbIndex: number | undefined = hasHiddenClimb && positions.length >= 2 ? 1 : undefined;\r\n\r\n // 检查是否存在起始点(index 0)\r\n const hasStartPoint = positions.length > 0 && sortedWaypoints.some((wp) => wp.index === 0);\r\n\r\n // 创建 Polyline 实体(静态路径线)\r\n const entity = (layer.entities as any).add({\r\n id: entityId,\r\n name: entityName,\r\n description: entityDescription,\r\n polyline: {\r\n positions: positions.slice(),\r\n width: options.style?.width ?? 8,\r\n material: options.style?.material ?? options.style?.color ?? new C.PolylineOutlineMaterialProperty({\r\n color: C.Color.GREEN,\r\n outlineColor: C.Color.WHITE,\r\n outlineWidth: 3,\r\n }),\r\n clampToGround: false,\r\n },\r\n properties: {\r\n _altitudeMode: altitudeMode,\r\n _climbHeight: climbHeight,\r\n _hasHiddenClimb: hasHiddenClimb,\r\n },\r\n } as any);\r\n\r\n // 创建起始点箭头(只有当有 takeOffRefPoint 时才显示起飞箭头)\r\n const shouldShowArrow = hasStartPoint && hasHiddenClimb;\r\n \r\n if (shouldShowArrow) {\r\n try {\r\n const startPosition = positions[0];\r\n const carto = C.Cartographic.fromCartesian(startPosition);\r\n const baseHeight = carto ? carto.height : 0;\r\n\r\n const arrowShape = new ArrowShape(CesiumNS, {\r\n shaftHeight: 12,\r\n headHeight: 12,\r\n shaftRadius: 4,\r\n headRadius: 8,\r\n baseRadius: 12,\r\n color: '#FFD700',\r\n shaftAlpha: 0.98,\r\n headAlpha: 0.98,\r\n baseAlpha: 0.65,\r\n // 启用动态缩放\r\n dynamicScale: true,\r\n viewer: viewer,\r\n referenceDistance: 300,\r\n minScale: 0.3,\r\n maxScale: 2.0,\r\n });\r\n\r\n // 创建箭头实体(箭身、箭头、底座)\r\n arrowShape.createEntities(\r\n layer,\r\n startPosition,\r\n baseHeight,\r\n {\r\n _type: 'path-vertex',\r\n _ownerId: entityId,\r\n _vertexIndex: 0,\r\n _isStart: true,\r\n }\r\n );\r\n } catch (error) {\r\n console.error('Failed to create start arrow:', error);\r\n }\r\n }\r\n\r\n // 创建航点标签(使用 VertexLabelManager)\r\n try {\r\n const vertexLabelManager = new VertexLabelManager(\r\n CesiumNS,\r\n layer,\r\n entityId,\r\n hiddenClimbIndex,\r\n );\r\n vertexLabelManager.initializeLabels(positions);\r\n \r\n // 将标签管理器保存到实体属性中,以便后续管理\r\n (entity as any)._vertexLabelManager = vertexLabelManager;\r\n } catch (error) {\r\n console.error('Failed to create vertex labels:', error);\r\n }\r\n\r\n return entity;\r\n}\r\n\r\n/**\r\n * 预览模式渲染选项(扩展基础选项)\r\n */\r\nexport interface RenderFlightPathPreviewOptions extends RenderFlightPathOptions {\r\n /** 航点点击回调 */\r\n onWaypointClick?: (index: number, waypointData: any) => void;\r\n /** 初始选中的航点索引 */\r\n initialSelectedIndex?: number;\r\n}\r\n\r\n/**\r\n * 预览模式控制器接口\r\n */\r\nexport interface FlightPathPreviewController {\r\n /** 设置选中的航点(高亮显示)*/\r\n setSelectedWaypoint: (index: number | null) => void;\r\n /** 获取当前选中的航点索引 */\r\n getSelectedWaypoint: () => number | null;\r\n /** 销毁控制器(移除事件监听等)*/\r\n destroy: () => void;\r\n}\r\n\r\n/**\r\n * 预览模式渲染飞航路线:支持航点点击高亮\r\n * \r\n * 与 renderFlightPath 不同,此函数返回一个控制器对象,支持:\r\n * - 航点点击事件回调\r\n * - 程序化设置选中航点(高亮显示)\r\n * - 列表与地图双向联动\r\n * \r\n * @param CesiumNS Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param options 预览选项\r\n * @returns 包含实体和控制器的对象\r\n * \r\n * @example\r\n * ```typescript\r\n * const { entity, controller } = renderFlightPathPreview(Cesium, viewer, {\r\n * data: sinoflyData,\r\n * onWaypointClick: (index, waypoint) => {\r\n * console.log('点击了航点', index, waypoint);\r\n * },\r\n * initialSelectedIndex: 0\r\n * });\r\n * \r\n * // 程序化设置选中航点\r\n * controller.setSelectedWaypoint(2);\r\n * \r\n * // 销毁\r\n * controller.destroy();\r\n * ```\r\n */\r\nexport function renderFlightPathPreview(\r\n CesiumNS: typeof Cesium,\r\n viewer: Cesium.Viewer,\r\n options: RenderFlightPathPreviewOptions\r\n): { entity: Entity; controller: FlightPathPreviewController } {\r\n const C: any = CesiumNS as any;\r\n \r\n // 先使用基础函数渲染航线\r\n const entity = renderFlightPath(CesiumNS, viewer, options);\r\n \r\n // 获取 VertexLabelManager 实例\r\n const vertexLabelManager: VertexLabelManager | undefined = (entity as any)._vertexLabelManager;\r\n \r\n // 当前选中的航点索引\r\n let selectedWaypointIndex: number | null = options.initialSelectedIndex ?? null;\r\n \r\n // 获取航点数据(从实体的 polyline positions 推断)\r\n const polyline = entity.polyline;\r\n let positions: Cesium.Cartesian3[] = [];\r\n if (polyline && polyline.positions) {\r\n const posValue = (polyline.positions as any).getValue?.(C.JulianDate.now());\r\n if (Array.isArray(posValue)) {\r\n positions = posValue;\r\n }\r\n }\r\n \r\n // 转换航线数据以获取航点详细信息\r\n let waypointDataArray: any[] = [];\r\n try {\r\n const adapterOptions: SinoflyAdapterOptions = {\r\n CesiumNS,\r\n ...options.adapterOptions,\r\n };\r\n const converted = convertSinoflyWayline(options.data, adapterOptions);\r\n if (converted && converted.waypointData) {\r\n waypointDataArray = [...converted.waypointData].sort((a, b) => a.index - b.index);\r\n }\r\n } catch (e) {\r\n console.warn('[renderFlightPathPreview] 无法获取航点数据:', e);\r\n }\r\n \r\n // 判断是否有隐藏爬升点\r\n const hasHiddenClimb = (entity as any).properties?._hasHiddenClimb?.getValue?.() ?? false;\r\n const hiddenClimbIndex = hasHiddenClimb ? 1 : undefined;\r\n \r\n /**\r\n * 更新航点高亮状态\r\n */\r\n const updateWaypointHighlight = (newIndex: number | null) => {\r\n if (!vertexLabelManager || positions.length === 0) return;\r\n \r\n // 重建所有标签,设置选中状态\r\n const editedIndices = new Set<number>();\r\n vertexLabelManager.recreateAllLabels(positions, editedIndices, newIndex ?? undefined);\r\n };\r\n \r\n // 初始化选中状态\r\n if (selectedWaypointIndex !== null) {\r\n updateWaypointHighlight(selectedWaypointIndex);\r\n }\r\n \r\n // 创建点击事件处理器\r\n const handler: ScreenSpaceEventHandler = new C.ScreenSpaceEventHandler(viewer.scene.canvas);\r\n \r\n handler.setInputAction((movement: { position: Cesium.Cartesian2 }) => {\r\n const pickedObject = viewer.scene.pick(movement.position);\r\n \r\n if (C.defined(pickedObject) && pickedObject.id) {\r\n const pickedEntity = pickedObject.id as Cesium.Entity;\r\n const properties = pickedEntity.properties;\r\n \r\n if (properties) {\r\n const type = properties._type?.getValue?.(C.JulianDate.now());\r\n const ownerId = properties._ownerId?.getValue?.(C.JulianDate.now());\r\n const vertexIndex = properties._vertexIndex?.getValue?.(C.JulianDate.now());\r\n \r\n // 检查是否是当前航线的航点标签\r\n if (type === 'vertex-label' && ownerId === entity.id && vertexIndex !== undefined) {\r\n // 计算显示索引(用于回调)\r\n let displayIndex = vertexIndex;\r\n if (hiddenClimbIndex === 1) {\r\n // 有隐藏爬升点:index 2 对应显示索引 0,index 3 对应显示索引 1...\r\n if (vertexIndex >= 2) {\r\n displayIndex = vertexIndex - 2;\r\n }\r\n } else {\r\n // 无隐藏爬升点:index 0 对应显示索引 0,index 1 对应显示索引 1...\r\n displayIndex = vertexIndex;\r\n }\r\n \r\n // 更新选中状态\r\n selectedWaypointIndex = vertexIndex;\r\n updateWaypointHighlight(selectedWaypointIndex);\r\n \r\n // 触发回调\r\n if (options.onWaypointClick) {\r\n const waypointData = waypointDataArray.find(wp => wp.index === vertexIndex);\r\n options.onWaypointClick(displayIndex, waypointData);\r\n }\r\n }\r\n }\r\n }\r\n }, C.ScreenSpaceEventType.LEFT_CLICK);\r\n \r\n // 创建控制器\r\n const controller: FlightPathPreviewController = {\r\n setSelectedWaypoint: (index: number | null) => {\r\n if (index === null) {\r\n selectedWaypointIndex = null;\r\n updateWaypointHighlight(null);\r\n return;\r\n }\r\n \r\n // 将显示索引转换为实际索引\r\n let actualIndex = index;\r\n if (hiddenClimbIndex === 1) {\r\n // 有隐藏爬升点:显示索引 0 对应 index 2,显示索引 1 对应 index 3...\r\n actualIndex = index + 2;\r\n }\r\n \r\n selectedWaypointIndex = actualIndex;\r\n updateWaypointHighlight(selectedWaypointIndex);\r\n },\r\n \r\n getSelectedWaypoint: () => {\r\n if (selectedWaypointIndex === null) return null;\r\n \r\n // 将实际索引转换为显示索引\r\n if (hiddenClimbIndex === 1) {\r\n return selectedWaypointIndex >= 2 ? selectedWaypointIndex - 2 : null;\r\n }\r\n return selectedWaypointIndex;\r\n },\r\n \r\n destroy: () => {\r\n handler.destroy();\r\n },\r\n };\r\n \r\n return { entity, controller };\r\n}\r\n\r\n","import type * as Cesium from 'cesium';\r\nimport { startPathEditing as startPathEditingImpl } from './path-manager/pathEditing';\r\nimport { startPathDrawing as startPathDrawingImpl } from './path-manager/startPathDrawing';\r\nimport { renderFlightPath as renderFlightPathImpl, renderFlightPathPreview as renderFlightPathPreviewImpl } from './path-manager/renderFlightPath';\r\nimport type { RenderFlightPathOptions, RenderFlightPathPreviewOptions, FlightPathPreviewController } from './path-manager/renderFlightPath';\r\n\r\nexport type PathSample =\r\n | { time: Cesium.JulianDate | Date | string | number; lon: number; lat: number; height?: number }\r\n | [Cesium.JulianDate | Date | string | number, number, number, number?];\r\n\r\nexport interface PathCreateOptions {\r\n id?: string;\r\n name?: string;\r\n description?: string;\r\n /** Optional initial samples */\r\n samples?: PathSample[];\r\n /** Style and behavior of the path graphic */\r\n style?: {\r\n width?: number; // pixels\r\n color?: Cesium.Color; // Solid color for the path material\r\n material?: Cesium.MaterialProperty | Cesium.Color; // overrides color if provided\r\n leadTime?: number; // seconds into the future to show\r\n trailTime?: number; // seconds into the past to show\r\n resolution?: number; // seconds between sampled positions for rendering\r\n };\r\n /** Optional availability window; if omitted, inferred from samples */\r\n availability?: {\r\n start: Cesium.JulianDate | Date | string | number;\r\n stop: Cesium.JulianDate | Date | string | number;\r\n };\r\n}\r\n\r\nexport interface PathStyleOptions {\r\n width?: number;\r\n color?: Cesium.Color;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n leadTime?: number;\r\n trailTime?: number;\r\n resolution?: number;\r\n}\r\n\r\ntype Entity = Cesium.Entity;\r\n\r\n/**\r\n * Manages time-dynamic path entities using SampledPositionProperty + PathGraphics.\r\n * Provides helpers to create paths, mutate their samples, and export CZML-compatible payloads.\r\n */\r\nexport class CZMLPathManager {\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Cesium.Viewer,\r\n ) {}\r\n\r\n private static readonly SAMPLES_KEY = '__czmlPathSamples__';\r\n\r\n /** Utility: normalize various time inputs into Cesium.JulianDate */\r\n private toJulian(time: Cesium.JulianDate | Date | string | number): Cesium.JulianDate {\r\n const C: any = this.CesiumNS as any;\r\n if ((time as any)?.isJulianDate) return time as Cesium.JulianDate;\r\n if (typeof time === 'string') return C.JulianDate.fromIso8601(time);\r\n if (typeof time === 'number') return C.JulianDate.fromDate(new Date(time));\r\n if (time instanceof Date) return C.JulianDate.fromDate(time);\r\n return time as Cesium.JulianDate;\r\n }\r\n\r\n private toCartesian(lon: number, lat: number, height?: number): Cesium.Cartesian3 {\r\n const C: any = this.CesiumNS as any;\r\n return C.Cartesian3.fromDegrees(lon, lat, height ?? 0);\r\n }\r\n\r\n private ensureAvailability(entity: Entity, start: Cesium.JulianDate, stop: Cesium.JulianDate) {\r\n const C: any = this.CesiumNS as any;\r\n const TimeInterval = C.TimeInterval;\r\n const TimeIntervalCollection = C.TimeIntervalCollection;\r\n const s = C.JulianDate.lessThan(stop, start) ? start : start;\r\n const e = C.JulianDate.lessThan(stop, start) ? stop : stop;\r\n entity.availability = new TimeIntervalCollection([new TimeInterval({ start: s, stop: e })]);\r\n }\r\n\r\n private parseSample(sample: PathSample) {\r\n if (Array.isArray(sample)) {\r\n const [t, lon, lat, height] = sample;\r\n return { t: this.toJulian(t), lon, lat, height: height ?? 0 };\r\n }\r\n return {\r\n t: this.toJulian(sample.time),\r\n lon: sample.lon,\r\n lat: sample.lat,\r\n height: sample.height ?? 0,\r\n };\r\n }\r\n\r\n /**\r\n * 回显飞航路线:显示完整飞航路线、航点编号和起始点箭头\r\n * \r\n * 接收 Sinofly 航线路数据,自动转换为本库格式并渲染显示。\r\n * \r\n * 航点逻辑说明:\r\n * - 有 takeOffRefPoint 时:index 0 是起始点(显示箭头),index 1 是隐藏转折点,index 2 是第一个航线点(标记 \"S\")\r\n * - 无 takeOffRefPoint 时:index 0 是第一个航线点(标记 \"S\"),无起始箭头\r\n * \r\n * @param options Sinofly 数据和配置选项\r\n * @returns 创建的 polyline 实体\r\n * \r\n * @example\r\n * ```typescript\r\n * const sinoflyData = {\r\n * waylineId: \"12345\",\r\n * waylineName: \"测试航线\",\r\n * takeOffSecurityHeight: 50,\r\n * takeOffRefPoint: '{\"longitude\": 116.4074, \"latitude\": 39.9042, \"height\": 100}',\r\n * waypointInfo: [\r\n * { \r\n * index: 0, \r\n * latitude: \"39.9045\", \r\n * longitude: \"116.4078\", \r\n * altitude: \"150.0\", \r\n * action: '[{\"rotateYaw\": {\"aircraftHeading\": 45}}]'\r\n * },\r\n * // ... 更多航点\r\n * ]\r\n * };\r\n * \r\n * const entity = pathManager.renderFlightPath({\r\n * data: sinoflyData,\r\n * adapterOptions: {\r\n * parseActionForPose: true\r\n * },\r\n * style: { width: 8, color: Cesium.Color.GREEN }\r\n * });\r\n * ```\r\n */\r\n renderFlightPath(\r\n options: RenderFlightPathOptions\r\n ): Entity {\r\n return renderFlightPathImpl(this.CesiumNS, this.viewer, options);\r\n }\r\n\r\n /**\r\n * 预览模式渲染飞航路线:支持航点点击高亮\r\n * \r\n * 与 renderFlightPath 不同,此方法返回一个控制器对象,支持:\r\n * - 航点点击事件回调\r\n * - 程序化设置选中航点(高亮显示)\r\n * - 列表与地图双向联动\r\n * \r\n * @param options 预览选项\r\n * @returns 包含实体和控制器的对象\r\n * \r\n * @example\r\n * ```typescript\r\n * const { entity, controller } = pathManager.renderFlightPathPreview({\r\n * data: sinoflyData,\r\n * onWaypointClick: (index, waypoint) => {\r\n * console.log('点击了航点', index, waypoint);\r\n * },\r\n * initialSelectedIndex: 0\r\n * });\r\n * \r\n * // 程序化设置选中航点\r\n * controller.setSelectedWaypoint(2);\r\n * \r\n * // 销毁\r\n * controller.destroy();\r\n * ```\r\n */\r\n renderFlightPathPreview(\r\n options: RenderFlightPathPreviewOptions\r\n ): { entity: Entity; controller: FlightPathPreviewController } {\r\n return renderFlightPathPreviewImpl(this.CesiumNS, this.viewer, options);\r\n }\r\n\r\n private resolveEntity(entityOrId: Entity | string): Entity | undefined {\r\n return typeof entityOrId === 'string'\r\n ? (this.viewer.entities.getById(entityOrId) as Entity | undefined)\r\n : entityOrId;\r\n }\r\n\r\n addPathSample(entityOrId: Entity | string, sample: PathSample) {\r\n const entity = this.resolveEntity(entityOrId);\r\n if (!entity) return;\r\n const { t, lon, lat, height } = this.parseSample(sample);\r\n const spp: Cesium.SampledPositionProperty = entity.position as any;\r\n spp.addSample(t, this.toCartesian(lon, lat, height));\r\n // Track samples on entity for robust export\r\n const key = CZMLPathManager.SAMPLES_KEY as any;\r\n const arr = ((entity as any)[key] ||= []);\r\n arr.push({ t, lon, lat, height });\r\n // keep sorted by time\r\n const C: any = this.CesiumNS as any;\r\n arr.sort((a: any, b: any) => C.JulianDate.compare(a.t, b.t));\r\n // maintain availability bounds\r\n const priv: any = spp as any;\r\n const times: Cesium.JulianDate[] | undefined = priv?._times;\r\n if (times && times.length > 0) {\r\n this.ensureAvailability(entity, times[0], times[times.length - 1]);\r\n }\r\n }\r\n\r\n addPathSamples(entityOrId: Entity | string, samples: PathSample[]) {\r\n for (const s of samples) this.addPathSample(entityOrId, s);\r\n }\r\n\r\n setPathSamples(entityOrId: Entity | string, samples: PathSample[]) {\r\n const entity = this.resolveEntity(entityOrId);\r\n if (!entity) return;\r\n const C: any = this.CesiumNS as any;\r\n const spp = new C.SampledPositionProperty();\r\n // sort by time for consistency\r\n const parsed = samples\r\n .map((s) => this.parseSample(s))\r\n .sort((a, b) => C.JulianDate.compare(a.t, b.t));\r\n for (const { t, lon, lat, height } of parsed) {\r\n spp.addSample(t, this.toCartesian(lon, lat, height));\r\n }\r\n (entity as any).position = spp;\r\n (entity as any)[CZMLPathManager.SAMPLES_KEY as any] = parsed.slice();\r\n if (parsed.length > 0) {\r\n this.ensureAvailability(entity, parsed[0].t, parsed[parsed.length - 1].t);\r\n }\r\n }\r\n\r\n clearPathSamples(entityOrId: Entity | string) {\r\n const entity = this.resolveEntity(entityOrId);\r\n if (!entity) return;\r\n const C: any = this.CesiumNS as any;\r\n (entity as any).position = new C.SampledPositionProperty();\r\n entity.availability = undefined as any;\r\n (entity as any)[CZMLPathManager.SAMPLES_KEY as any] = [];\r\n }\r\n\r\n setPathStyle(entityOrId: Entity | string, style: PathStyleOptions) {\r\n const entity = this.resolveEntity(entityOrId);\r\n if (!entity || !(entity as any).path) return;\r\n const path: any = (entity as any).path;\r\n if (style.width !== undefined) path.width = style.width as any;\r\n if (style.resolution !== undefined) path.resolution = style.resolution as any;\r\n if (style.leadTime !== undefined) path.leadTime = style.leadTime as any;\r\n if (style.trailTime !== undefined) path.trailTime = style.trailTime as any;\r\n if (style.material) path.material = style.material as any;\r\n else if (style.color) path.material = style.color as any;\r\n }\r\n\r\n /**\r\n * Build a CZML entity for a path + sampled position. Appends to target array and returns it.\r\n */\r\n exportEntityToCzml(entity: Entity, target: any[]): any | undefined {\r\n const C: any = this.CesiumNS as any;\r\n const spp: any = (entity as any).position;\r\n const path: any = (entity as any).path; // may be undefined in tests/headless envs\r\n if (!spp) return undefined;\r\n\r\n // Prefer our tracked samples\r\n const tracked: Array<{ t: Cesium.JulianDate; lon: number; lat: number; height: number }> = (\r\n entity as any\r\n )[CZMLPathManager.SAMPLES_KEY as any];\r\n\r\n let times: Cesium.JulianDate[] | undefined;\r\n let values: Cesium.Cartesian3[] | undefined;\r\n if (tracked && tracked.length > 0) {\r\n times = tracked.map((s) => s.t);\r\n } else {\r\n times = (spp as any)?._times as Cesium.JulianDate[] | undefined;\r\n values = (spp as any)?._values as Cesium.Cartesian3[] | undefined;\r\n if (!times || !values || times.length === 0 || values.length !== times.length)\r\n return undefined;\r\n }\r\n\r\n const epoch = times[0];\r\n const epochIso = C.JulianDate.toIso8601(epoch);\r\n const coords: number[] = [];\r\n if (tracked && tracked.length > 0) {\r\n for (let i = 0; i < tracked.length; i++) {\r\n const s = tracked[i];\r\n const seconds = C.JulianDate.secondsDifference(s.t, epoch);\r\n coords.push(seconds, s.lon, s.lat, s.height ?? 0);\r\n }\r\n } else if (values) {\r\n for (let i = 0; i < times.length; i++) {\r\n const t = times[i];\r\n const seconds = C.JulianDate.secondsDifference(t, epoch);\r\n const carto = C.Cartographic.fromCartesian(values[i]);\r\n coords.push(\r\n seconds,\r\n C.Math.toDegrees(carto.longitude),\r\n C.Math.toDegrees(carto.latitude),\r\n carto.height ?? 0,\r\n );\r\n }\r\n }\r\n\r\n const now = C.JulianDate.now();\r\n const colorToRgba = (color: any, fallback: [number, number, number, number]) => {\r\n if (!color) return fallback;\r\n try {\r\n const c = color.getValue ? color.getValue(now) : color;\r\n const r = Math.round((c.red ?? 1) * 255);\r\n const g = Math.round((c.green ?? 1) * 255);\r\n const b = Math.round((c.blue ?? 1) * 255);\r\n const a = Math.round((c.alpha ?? 1) * 255);\r\n return [r, g, b, a] as [number, number, number, number];\r\n } catch {\r\n return fallback;\r\n }\r\n };\r\n\r\n const width = path?.width?.getValue ? path.width.getValue(now) : (path?.width ?? 2);\r\n const res = path?.resolution?.getValue ? path.resolution.getValue(now) : path?.resolution;\r\n const lead = path?.leadTime?.getValue ? path.leadTime.getValue(now) : path?.leadTime;\r\n const trail = path?.trailTime?.getValue\r\n ? path.trailTime.getValue(now)\r\n : (path?.trailTime ?? 60);\r\n const rgba = colorToRgba(path?.material?.color ?? path?.material, [0, 255, 255, 255]);\r\n\r\n const id = (entity.id as string) || `path-${Math.random().toString(36).slice(2)}`;\r\n const name = (entity.name as string) || undefined;\r\n const description = (entity.description as any) || undefined;\r\n\r\n // Availability covers first to last sample\r\n const startIso = epochIso;\r\n const stopIso = C.JulianDate.toIso8601(times[times.length - 1]);\r\n\r\n const czmlEntity: any = {\r\n id,\r\n name,\r\n description,\r\n availability: `${startIso}/${stopIso}`,\r\n position: {\r\n epoch: epochIso,\r\n cartographicDegrees: coords,\r\n interpolationAlgorithm: 'LINEAR',\r\n },\r\n path: {\r\n width,\r\n material: { solidColor: { color: { rgba } } },\r\n resolution: res,\r\n leadTime: lead,\r\n trailTime: trail,\r\n },\r\n };\r\n target.push(czmlEntity);\r\n return czmlEntity;\r\n }\r\n\r\n // ======== Interactive Path (Polyline) Drawing & Editing ========\r\n // The following interactive helpers mirror PolygonEditor patterns but operate on polylines.\r\n\r\n /** Options for drawing a 3D path (polyline) with height. */\r\n startPathDrawing(\r\n options?: {\r\n layer?: Cesium.CustomDataSource;\r\n idPrefix?: string;\r\n /** Default altitude in meters when pick has no/low height. Defaults to 120. */\r\n defaultHeight?: number;\r\n /** Polyline style (width in px, material color). */\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n },\r\n onComplete?: (entity: Entity) => void,\r\n ): { stop: () => void } {\r\n return startPathDrawingImpl(\r\n this.CesiumNS as any,\r\n this.viewer as any,\r\n options as any,\r\n onComplete as any,\r\n );\r\n }\r\n\r\n /** Edit an existing 3D path (polyline). Supports vertex selection, keyboard movement and insertion. */\r\n startPathEditing(\r\n entityOrId: Entity | string,\r\n options?: {\r\n layer?: Cesium.CustomDataSource;\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n },\r\n ): { stop: () => void } | undefined {\r\n // Delegate to modular implementation via static import\r\n return startPathEditingImpl(\r\n this.CesiumNS as any,\r\n this.viewer as any,\r\n entityOrId as any,\r\n options,\r\n );\r\n }\r\n\r\n // ensureLayerForEntity moved into path-editing module\r\n}\r\n","import type * as Cesium from 'cesium';\r\n// import { get } from 'http';\r\n\r\ntype Viewer = Cesium.Viewer;\r\n\r\nexport interface PolygonDrawingOptions {\r\n layer?: Cesium.CustomDataSource;\r\n idPrefix?: string;\r\n}\r\n\r\nexport interface PolygonEditingSession {\r\n stop: () => void;\r\n}\r\n\r\nexport class PolygonEditor {\r\n private handler?: Cesium.ScreenSpaceEventHandler;\r\n private drawingPositions: any[] = [];\r\n private tempPolyline?: Cesium.Entity;\r\n private tempPolygon?: Cesium.Entity;\r\n // Temporary point handles shown while drawing for better feedback\r\n private drawHandles: Cesium.Entity[] = [];\r\n // 橡皮筋效果:鼠标跟随的临时预览点(未确认的点)\r\n private rubberBandPoint?: Cesium.Entity;\r\n private editHandles: Cesium.Entity[] = [];\r\n private draggingIndex: number | undefined;\r\n // Remember the original position of the selected vertex to allow canceling on right-click\r\n private originalPositionOnDrag?: any;\r\n // Segment hover and highlight for inserting new vertex between two points\r\n private segmentHighlight?: Cesium.Entity;\r\n // Dynamic outline polyline kept in sync while editing\r\n private editOutline?: Cesium.Entity;\r\n // Store a preview point handle while hovering a segment\r\n private insertPreviewHandle?: Cesium.Entity;\r\n // Keyboard event handler for ESC and X keys during drawing\r\n private keydownHandler?: (event: KeyboardEvent) => void;\r\n // 保存编码前的原始名称,用于还原\r\n private originalPolygonNames: Map<string, { entityId: string; oldName: string; layerName: string }> = new Map();\r\n // 保存双击缩放是否被禁用的状态\r\n private doubleClickZoomDisabled = false;\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Viewer,\r\n ) {}\r\n\r\n /**\r\n * 根据图层名称获取颜色配置\r\n * @param layerName 图层名称 ('subarray' | 'inverter' | 其他)\r\n * @returns 颜色配置对象\r\n */\r\n getColorConfig(layerName: string): {\r\n lineColor: any; // 绘制时轮廓线颜色\r\n lineFinalColor: any; // 完成后轮廓线颜色\r\n faceColor: any; // 绘制/编辑时填充颜色\r\n faceFinalColor: any; // 完成后填充颜色\r\n pointColor: any; // 控制点颜色\r\n } {\r\n const C: any = this.CesiumNS as any;\r\n\r\n if (layerName === 'subarray') {\r\n return {\r\n lineColor: C.Color.fromCssColorString('rgba(218, 1, 26, 0.88)'),\r\n lineFinalColor: C.Color.fromCssColorString('rgba(218, 1, 27, 0.70)'),\r\n faceColor: C.Color.fromCssColorString('rgba(218, 1, 26, 0.49)'),\r\n faceFinalColor: C.Color.fromCssColorString('rgba(218, 1, 26, 0.14)'),\r\n pointColor: C.Color.WHITE,\r\n };\r\n } else if (layerName === 'inverter') {\r\n return {\r\n lineColor: C.Color.fromCssColorString('rgba(113, 183, 5, 0.90)'),\r\n lineFinalColor: C.Color.fromCssColorString('rgba(113, 183, 5, 0.70)'),\r\n faceColor: C.Color.fromCssColorString('rgba(113, 183, 5, 0.40)'),\r\n faceFinalColor: C.Color.fromCssColorString('rgba(113, 183, 5, 0.10)'),\r\n pointColor: C.Color.WHITE,\r\n };\r\n } else if (layerName === 'astrict') {\r\n return {\r\n lineColor: C.Color.fromCssColorString('rgba(217, 0, 27, 0.92)'),\r\n lineFinalColor: C.Color.fromCssColorString('rgba(217, 0, 27, 0.68)'),\r\n faceColor: C.Color.fromCssColorString('rgba(217, 0, 27, 0.4)'),\r\n faceFinalColor: C.Color.fromCssColorString('rgba(217, 0, 27, 0.1)'),\r\n pointColor: C.Color.WHITE,\r\n };\r\n } else if (layerName === 'rail') {\r\n return {\r\n lineColor: C.Color.fromCssColorString('rgba(2, 167, 240, 0.58)'),\r\n lineFinalColor: C.Color.fromCssColorString('rgba(2, 167, 240, 0.92)'),\r\n faceColor: C.Color.fromCssColorString('rgba(2, 167, 240, 0.4)'),\r\n faceFinalColor: C.Color.fromCssColorString('rgba(2, 167, 240, 0.1)'),\r\n pointColor: C.Color.WHITE,\r\n };\r\n } else if (layerName === 'feature') {\r\n return {\r\n lineColor: C.Color.fromCssColorString('rgba(245, 154, 35, 0.92)'),\r\n lineFinalColor: C.Color.fromCssColorString('rgba(245, 154, 35, 0.52)'),\r\n faceColor: C.Color.fromCssColorString('rgba(245, 154, 35, 0.4)'),\r\n faceFinalColor: C.Color.fromCssColorString('rgba(245, 154, 35, 0.1)'),\r\n pointColor: C.Color.WHITE,\r\n };\r\n } else {\r\n return {\r\n lineColor: C.Color.fromCssColorString('rgba(0,150,255,0.85)'),\r\n lineFinalColor: C.Color.fromCssColorString('rgba(0,150,255,0.85)'),\r\n faceColor: C.Color.fromCssColorString('rgba(255, 149, 0, 0.40)'),\r\n faceFinalColor: C.Color.fromCssColorString('rgba(255, 149, 0, 0.1)'),\r\n pointColor: C.Color.WHITE,\r\n };\r\n }\r\n }\r\n\r\n private getPositionFromMouse(movement: any): any | undefined {\r\n const scene: any = (this.viewer as any).scene;\r\n const winPos = movement?.position ?? movement?.endPosition ?? movement;\r\n if (!winPos) return undefined;\r\n let cart: any | undefined;\r\n try {\r\n cart = scene.pickPosition?.(winPos);\r\n } catch {}\r\n if (!cart) {\r\n const ray = (this.viewer.camera as any).getPickRay?.(winPos);\r\n cart = ray ? scene.globe?.pick?.(ray, scene) : undefined;\r\n }\r\n return cart;\r\n }\r\n\r\n /**\r\n *\r\n * @param fn 计算属性函数\r\n * @returns 计算函数返回值的CallbackProperty对象\r\n */\r\n private makeCallback<T>(fn: () => T): any {\r\n const C: any = this.CesiumNS as any;\r\n return new C.CallbackProperty(fn, false);\r\n }\r\n\r\n /**\r\n * 生成复杂唯一的 Entity ID\r\n * 格式: {timestamp}-{random}\r\n */\r\n private generateUniqueId(): string {\r\n const timestamp = Date.now().toString();\r\n const random = Math.floor(Math.random() * 1000000).toString().padStart(6, '0');\r\n return timestamp + random;\r\n }\r\n\r\n /**\r\n * 将轮廓线设置为虚线样式(公用方法)\r\n */\r\n applyDashedOutlineStyle(\r\n outlineEntity: any,\r\n color: any,\r\n width: number = 3,\r\n dashLength: number = 10\r\n ): void {\r\n try {\r\n if (!outlineEntity || !outlineEntity.polyline) {\r\n return;\r\n }\r\n \r\n const C: any = this.CesiumNS as any;\r\n \r\n outlineEntity.polyline.material = new C.PolylineDashMaterialProperty({\r\n color: color,\r\n dashLength: dashLength,\r\n gapColor: C.Color.TRANSPARENT,\r\n });\r\n \r\n outlineEntity.polyline.width = width;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] Failed to apply dashed outline style:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有图层中多边形的高亮状态\r\n */\r\n private clearAllPolygonHighlights(): void {\r\n try {\r\n const dataSources = this.viewer.dataSources;\r\n \r\n for (let i = 0; i < dataSources.length; i++) {\r\n const ds: any = dataSources.get(i);\r\n if (!ds || !ds.entities) continue;\r\n \r\n const layerName = ds.name || '';\r\n \r\n if (layerName !== 'subarray' && layerName !== 'inverter') {\r\n continue;\r\n }\r\n \r\n const entities = ds.entities.values;\r\n for (let j = 0; j < entities.length; j++) {\r\n const entity: any = entities[j];\r\n if (!entity) continue;\r\n \r\n const entityId = entity.id || '';\r\n const type = entity.type || layerName;\r\n const checked = entity.checked;\r\n \r\n if (entity.polygon && checked === true) {\r\n entity.checked = false;\r\n \r\n const colors = this.getColorConfig(type);\r\n \r\n try {\r\n entity.polygon.material = colors.faceFinalColor;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 清除多边形填充色失败:', e);\r\n }\r\n \r\n const outlineId = `${entityId}-outline`;\r\n const outlineEntity = ds.entities.getById(outlineId);\r\n if (outlineEntity && (outlineEntity as any).polyline) {\r\n try {\r\n this.applyDashedOutlineStyle(outlineEntity, colors.lineFinalColor, 3, 10);\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 清除多边形轮廓线失败:', e);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n console.warn('[PolygonEditor] clearAllPolygonHighlights error:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 创建轮廓线实体\r\n */\r\n private createOutlineEntity(\r\n layer: Cesium.CustomDataSource,\r\n polygonId: string,\r\n positions: any[] | (() => any[]),\r\n color: any,\r\n isDynamic: boolean = false\r\n ): any {\r\n try {\r\n const getPositions = () => {\r\n const arr = typeof positions === 'function' ? positions() : positions.slice();\r\n return arr.length > 1 ? arr.concat(arr[0]) : arr;\r\n };\r\n \r\n const outlineEntity = layer.entities.add({\r\n id: `${polygonId}-outline`,\r\n name: 'Polygon Outline',\r\n polyline: {\r\n positions: isDynamic ? this.makeCallback(getPositions) : getPositions(),\r\n width: isDynamic ? 4 : 3,\r\n material: color,\r\n clampToGround: true,\r\n },\r\n properties: { _ownerId: polygonId, _type: 'polygon-outline' },\r\n } as any);\r\n \r\n return outlineEntity;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] Failed to create outline entity:', e);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 创建标签实体\r\n */\r\n private createLabelEntity(\r\n layer: Cesium.CustomDataSource,\r\n polygonId: string,\r\n position: any,\r\n text: string,\r\n color: any\r\n ): any {\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n \r\n const labelEntity = layer.entities.add({\r\n id: `${polygonId}-label`,\r\n name: 'Polygon Label',\r\n position: position,\r\n label: {\r\n text: text,\r\n font: 'bold 16px Microsoft YaHei, SimHei, sans-serif',\r\n fillColor: color,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n style: C.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n pixelOffset: new C.Cartesian2(0, -10),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n clampToGround: true,\r\n },\r\n properties: { _ownerId: polygonId, _type: 'polygon-label' },\r\n } as any);\r\n \r\n return labelEntity;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] Failed to create label entity:', e);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 清理临时绘制元素\r\n */\r\n private cleanupDrawingTemporaries(layer: Cesium.CustomDataSource): void {\r\n try {\r\n if (this.tempPolyline) {\r\n layer.entities.remove(this.tempPolyline);\r\n this.tempPolyline = undefined as any;\r\n }\r\n \r\n if (this.tempPolygon) {\r\n layer.entities.remove(this.tempPolygon);\r\n this.tempPolygon = undefined as any;\r\n }\r\n \r\n if (this.rubberBandPoint) {\r\n try {\r\n layer.entities.remove(this.rubberBandPoint);\r\n } catch {}\r\n this.rubberBandPoint = undefined;\r\n }\r\n \r\n if (this.drawHandles && this.drawHandles.length > 0) {\r\n try {\r\n for (const h of this.drawHandles) {\r\n layer.entities.remove(h);\r\n }\r\n } catch {}\r\n this.drawHandles = [];\r\n }\r\n \r\n this.drawingPositions = [];\r\n } catch (e) {\r\n console.warn('[PolygonEditor] Failed to cleanup drawing temporaries:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 设置键盘事件监听器(ESC/X 键)\r\n */\r\n private setupKeyboardListener(callback: () => void): void {\r\n this.keydownHandler = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape' || event.key === 'x' || event.key === 'X') {\r\n callback();\r\n }\r\n };\r\n document.addEventListener('keydown', this.keydownHandler);\r\n }\r\n\r\n /**\r\n * 移除键盘事件监听器\r\n */\r\n private removeKeyboardListener(): void {\r\n if (this.keydownHandler) {\r\n document.removeEventListener('keydown', this.keydownHandler);\r\n this.keydownHandler = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 销毁事件处理器\r\n */\r\n private destroyHandler(): void {\r\n try {\r\n this.handler?.destroy();\r\n } catch {}\r\n this.handler = undefined;\r\n }\r\n\r\n /**\r\n * 禁用 Cesium 默认的双击缩放行为\r\n * 在绘制/编辑过程中调用,防止双击导致相机乱飞\r\n */\r\n private disableDoubleClickZoom(): void {\r\n if (this.doubleClickZoomDisabled) return;\r\n \r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const cesiumWidget = (this.viewer as any).cesiumWidget;\r\n if (cesiumWidget?.screenSpaceEventHandler) {\r\n cesiumWidget.screenSpaceEventHandler.removeInputAction(\r\n C.ScreenSpaceEventType.LEFT_DOUBLE_CLICK\r\n );\r\n this.doubleClickZoomDisabled = true;\r\n }\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 禁用双击缩放失败:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 恢复 Cesium 默认的双击缩放行为\r\n * 在绘制/编辑结束后调用\r\n */\r\n private restoreDoubleClickZoom(): void {\r\n if (!this.doubleClickZoomDisabled) return;\r\n \r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const viewer = this.viewer as any;\r\n const cesiumWidget = viewer.cesiumWidget;\r\n \r\n if (cesiumWidget?.screenSpaceEventHandler) {\r\n // 重新绑定双击缩放事件\r\n cesiumWidget.screenSpaceEventHandler.setInputAction(\r\n (movement: any) => {\r\n try {\r\n // Cesium 默认的双击行为:飞向点击位置\r\n const pickedObject = viewer.scene.pick(movement.position);\r\n if (pickedObject?.id && viewer.trackedEntity !== pickedObject.id) {\r\n viewer.flyTo(pickedObject.id, { duration: 1.5 });\r\n }\r\n } catch {}\r\n },\r\n C.ScreenSpaceEventType.LEFT_DOUBLE_CLICK\r\n );\r\n this.doubleClickZoomDisabled = false;\r\n }\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 恢复双击缩放失败:', e);\r\n this.doubleClickZoomDisabled = false;\r\n }\r\n }\r\n\r\n /**\r\n * 完成编辑/绘制的通用清理逻辑\r\n */\r\n private finalizePolygonSession(\r\n layer: Cesium.CustomDataSource,\r\n onComplete?: (entity: Cesium.Entity) => void,\r\n entity?: Cesium.Entity\r\n ): void {\r\n this.destroyHandler();\r\n this.removeKeyboardListener();\r\n this.restoreDoubleClickZoom();\r\n \r\n if (entity && onComplete) {\r\n onComplete(entity);\r\n }\r\n }\r\n\r\n /**\r\n * 创建polygon绘制会话,允许用户通过鼠标交互绘制多边形。\r\n * @param type 多边形类型\r\n * @param layer 自定义图层对象\r\n * @param onComplete 结果回调函数,参数为新创建的多边形实体\r\n * @returns 返回一个polygon绘制会话对象\r\n */\r\n startDrawing(\r\n type: string,\r\n layer?: Cesium.CustomDataSource,\r\n onComplete?: (entity: Cesium.Entity) => void,\r\n ): { stop: () => void } {\r\n const C: any = this.CesiumNS as any;\r\n \r\n if(layer == null) {\r\n console.warn(\"PolygonEditor.startDrawing: layer is null, return without starting drawing.\");\r\n return { stop: () => {} };\r\n }\r\n \r\n const colors = this.getColorConfig(type);\r\n const line_color = colors.lineColor;\r\n const line_fina_color = colors.lineFinalColor;\r\n const face_color = colors.faceColor;\r\n const face_fina_color = colors.faceFinalColor;\r\n const point_color = colors.pointColor;\r\n \r\n let nameStr = '';\r\n\r\n if('subarray'==type){\r\n const polygonCount = layer.entities.values.filter((e: any) => e.polygon).length;\r\n nameStr = 'subarray_#'+(polygonCount+1).toString().padStart(2, '0');\r\n }else if('inverter'==type){\r\n const polygonCount = layer.entities.values.filter((e: any) => e.polygon).length;\r\n const count = polygonCount + 1;\r\n const z = count % 100 === 0 ? 99 : (count % 100);\r\n const y = Math.floor((count - 1) / 100);\r\n nameStr = `inverter_GX.${y}.${z}`;\r\n }else{\r\n const polygonCount = layer.entities.values.filter((e: any) => \r\n e.polygon || e.point || e.ellipse \r\n ).length;\r\n nameStr = `${type}_`+(polygonCount+1).toString().padStart(2, '0');;\r\n }\r\n\r\n this.clearAllPolygonHighlights();\r\n\r\n this.stopInternal(layer);\r\n this.disableDoubleClickZoom();\r\n this.drawingPositions = [];\r\n this.drawHandles = [];\r\n this.rubberBandPoint = undefined;\r\n \r\n let currentPreviewPosition: any = null;\r\n\r\n const getDrawingPositionsWithPreview = () => {\r\n const positions = this.drawingPositions.slice();\r\n if (currentPreviewPosition) {\r\n positions.push(currentPreviewPosition);\r\n }\r\n return positions.filter((p: any) => p && typeof p === 'object' && p.x !== undefined && p.y !== undefined && p.z !== undefined);\r\n };\r\n\r\n this.tempPolyline = layer.entities.add({\r\n polyline: {\r\n positions: this.makeCallback(() => {\r\n const arr = getDrawingPositionsWithPreview();\r\n if (arr.length < 2) {\r\n return [];\r\n }\r\n const result = arr.length > 1 ? arr.concat(arr[0]) : arr;\r\n return result.filter((p: any) => p && typeof p === 'object' && p.x !== undefined && p.y !== undefined && p.z !== undefined);\r\n }),\r\n width: 1,\r\n material: line_color,\r\n clampToGround: true,\r\n },\r\n });\r\n\r\n this.tempPolygon = layer.entities.add({\r\n polygon: {\r\n hierarchy: this.makeCallback(() => ({\r\n positions: getDrawingPositionsWithPreview().length >= 3 ? getDrawingPositionsWithPreview() : [],\r\n })),\r\n material: face_color,\r\n outline: false,\r\n },\r\n } as any);\r\n\r\n this.handler = new (this.CesiumNS as any).ScreenSpaceEventHandler(\r\n (this.viewer.scene as any).canvas,\r\n );\r\n\r\n this.handler &&\r\n this.handler.setInputAction(\r\n (movement: any) => {\r\n // 🔧 修复: 立即清除可能被其他组件(如Selector)设置的选择状态\r\n // 防止点击时其他图层的实体被高亮\r\n try {\r\n const dataSources = this.viewer.dataSources;\r\n for (let i = 0; i < dataSources.length; i++) {\r\n const ds: any = dataSources.get(i);\r\n if (ds && ds.entities && ds.name !== layer.name) { // 跳过当前绘制的图层\r\n const entities = ds.entities.values;\r\n for (let j = 0; j < entities.length; j++) {\r\n const entity: any = entities[j];\r\n if (entity.polygon && entity.polygon.material) {\r\n const material = entity.polygon.material;\r\n if (material && typeof material.getValue === 'function') {\r\n const currentColor = material.getValue((this.viewer as any).clock.currentTime);\r\n // 检查是否是高亮的黄色 (255, 255, 0)\r\n if (currentColor && currentColor.red === 1 && \r\n currentColor.green === 1 && currentColor.blue === 0) {\r\n const colors = this.getColorConfig(type);\r\n entity.polygon.material = colors.faceFinalColor;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n // 忽略错误\r\n }\r\n \r\n // 将屏幕坐标转换为世界坐标(Cartesian3)\r\n const p = this.getPositionFromMouse(movement);\r\n if (p) {\r\n // 将新顶点加入顶点数组\r\n this.drawingPositions.push(p);\r\n const handle = (layer.entities as any).add({\r\n position: p,\r\n point: {\r\n pixelSize: 7,\r\n color: point_color,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n },\r\n } as any);\r\n this.drawHandles.push(handle);\r\n\r\n if (this.drawingPositions.length === 1 && !this.rubberBandPoint) {\r\n currentPreviewPosition = p;\r\n this.rubberBandPoint = (layer.entities as any).add({\r\n position: this.makeCallback(() => currentPreviewPosition),\r\n point: {\r\n pixelSize: 7,\r\n color: C.Color.YELLOW.withAlpha(0.6),\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n },\r\n } as any);\r\n }\r\n }\r\n },\r\n (this.CesiumNS as any).ScreenSpaceEventType.LEFT_CLICK,\r\n );\r\n\r\n this.handler &&\r\n this.handler.setInputAction(\r\n (movement: any) => {\r\n if (this.drawingPositions.length > 0 && this.rubberBandPoint) {\r\n const p = this.getPositionFromMouse(movement);\r\n if (p) {\r\n currentPreviewPosition = p;\r\n }\r\n }\r\n },\r\n (this.CesiumNS as any).ScreenSpaceEventType.MOUSE_MOVE,\r\n );\r\n\r\n const finishDrawing = () => {\r\n if (this.drawingPositions.length >= 3) {\r\n const id = this.generateUniqueId();\r\n const entity = layer.entities.add({\r\n id,\r\n name_str: nameStr,\r\n name: '',\r\n shape: 'polygon',\r\n type: type,\r\n checked: false,\r\n polygon: {\r\n hierarchy: this.drawingPositions.slice(),\r\n material: face_fina_color,\r\n outline: false,\r\n },\r\n } as any);\r\n \r\n const ring = this.drawingPositions.slice();\r\n const outlineEntity = this.createOutlineEntity(layer, id, ring, line_fina_color, false);\r\n if (outlineEntity) {\r\n this.applyDashedOutlineStyle(outlineEntity, line_fina_color, 3, 10);\r\n }\r\n \r\n if (nameStr && this.drawingPositions.length > 0) {\r\n this.createLabelEntity(layer, id, this.drawingPositions[0], '', line_fina_color);\r\n }\r\n \r\n this.cleanupDrawingTemporaries(layer);\r\n \r\n this.finalizePolygonSession(layer, onComplete, entity);\r\n } else {\r\n this.cleanupDrawingTemporaries(layer);\r\n this.destroyHandler();\r\n }\r\n };\r\n\r\n this.handler &&\r\n this.handler.setInputAction(finishDrawing, (this.CesiumNS as any).ScreenSpaceEventType.RIGHT_CLICK);\r\n\r\n this.setupKeyboardListener(finishDrawing);\r\n\r\n // 返回会话对象:提供 stop() 方法用于手动终止绘制\r\n return { stop: () => this.stopInternal(layer) };\r\n }\r\n\r\n private stopInternal(layer?: Cesium.CustomDataSource) {\r\n if (layer) {\r\n this.cleanupDrawingTemporaries(layer);\r\n }\r\n this.destroyHandler();\r\n this.removeKeyboardListener();\r\n this.restoreDoubleClickZoom();\r\n }\r\n\r\n /**\r\n * 开始编辑多边形\r\n * @param polygonEntity 要编辑的多边形实体\r\n * @param layer 多边形所属的图层\r\n * @param onComplete 编辑完成回调函数\r\n * @returns 返回编辑会话对象\r\n */\r\n startEditing(\r\n polygonEntity: Cesium.Entity,\r\n layer: Cesium.CustomDataSource,\r\n onComplete?: (entity: Cesium.Entity) => void,\r\n ): PolygonEditingSession {\r\n const C: any = this.CesiumNS as any;\r\n this.cleanupHandles(layer);\r\n this.disableDoubleClickZoom();\r\n\r\n const colors = this.getColorConfig(layer.name);\r\n const line_color = colors.lineColor;\r\n const line_fina_color = colors.lineFinalColor;\r\n const point_color = colors.pointColor;\r\n const face_color = colors.faceColor;\r\n const face_fina_color = colors.faceFinalColor;\r\n\r\n const getPositions = (): any[] => {\r\n const h = (polygonEntity.polygon as any)?.hierarchy;\r\n // 如果 hierarchy 是 CallbackProperty,需要调用 getValue\r\n const value = typeof h?.getValue === 'function' ? h.getValue(C.JulianDate.now()) : h;\r\n const arr = value?.positions ?? value ?? [];\r\n return arr.slice(); // 返回副本避免外部修改\r\n };\r\n // 获取当前多边形的所有顶点(编辑过程中会动态修改此数组)\r\n let positions = getPositions();\r\n\r\n try {\r\n if ((polygonEntity as any).polygon) {\r\n (polygonEntity as any).polygon.outline = false;\r\n (polygonEntity as any).polygon.material = face_color;\r\n }\r\n } catch {}\r\n\r\n this.editHandles = positions.map((p, i) =>\r\n layer.entities.add({\r\n position: p,\r\n point: { pixelSize: 7, color: point_color },\r\n properties: { _vertexIndex: i },\r\n } as any),\r\n );\r\n\r\n (polygonEntity.polygon as any).hierarchy = this.makeCallback(() => ({ positions }));\r\n\r\n try {\r\n const values: any[] = ((layer.entities as any).values ?? []) as any[];\r\n const found = values.find(\r\n (e: any) =>\r\n e?.polyline &&\r\n (e.properties?._ownerId?.getValue?.() ?? e.properties?._ownerId) ===\r\n (polygonEntity as any).id,\r\n );\r\n\r\n if (found) {\r\n // 找到已存在的轮廓线,将其改为动态更新(绑定 positions 数组)\r\n this.editOutline = found as any;\r\n (this.editOutline as any).polyline.positions = this.makeCallback(() => {\r\n const arr = positions.slice();\r\n return arr.length > 1 ? arr.concat(arr[0]) : arr; // 首尾相连形成闭合环\r\n });\r\n (this.editOutline as any).polyline.material = line_color;\r\n (this.editOutline as any).polyline.width = 1;\r\n } else {\r\n // 未找到轮廓线,新建一个并绑定动态 positions\r\n this.editOutline = layer.entities.add({\r\n id: `${(polygonEntity as any).id}-outline`,\r\n name: 'Polygon Outline',\r\n polyline: {\r\n positions: this.makeCallback(() => {\r\n const arr = positions.slice();\r\n return arr.length > 1 ? arr.concat(arr[0]) : arr;\r\n }),\r\n width: 1,\r\n material: line_color,\r\n clampToGround: true,\r\n },\r\n properties: { _ownerId: (polygonEntity as any).id, _type: 'polygon-outline' },\r\n } as any);\r\n }\r\n } catch {}\r\n\r\n this.handler = new (this.CesiumNS as any).ScreenSpaceEventHandler(\r\n (this.viewer.scene as any).canvas,\r\n );\r\n\r\n const computeNearestSegmentFromPoint = (\r\n cart: any,\r\n ): { i: number; t: number; dist: number } | undefined => {\r\n try {\r\n let bestIdx: number | undefined;\r\n let bestDist = Number.POSITIVE_INFINITY;\r\n let bestT = 0.5;\r\n const n = positions.length;\r\n if (n >= 2) {\r\n const Cany: any = this.CesiumNS as any;\r\n for (let i = 0; i < n; i++) {\r\n const j = (i + 1) % n;\r\n const p1 = positions[i];\r\n const p2 = positions[j];\r\n const v1 = Cany.Cartesian3.subtract(p2, p1, new Cany.Cartesian3());\r\n const v2 = Cany.Cartesian3.subtract(cart, p1, new Cany.Cartesian3());\r\n const len2 = Cany.Cartesian3.dot(v1, v1);\r\n let t = 0;\r\n let proj;\r\n if (len2 > 0) {\r\n t = Cany.Cartesian3.dot(v2, v1) / len2;\r\n t = Math.max(0, Math.min(1, t));\r\n proj = Cany.Cartesian3.add(\r\n p1,\r\n Cany.Cartesian3.multiplyByScalar(v1, t, new Cany.Cartesian3()),\r\n new Cany.Cartesian3(),\r\n );\r\n } else {\r\n proj = p1;\r\n t = 0;\r\n }\r\n const d = Cany.Cartesian3.distance(cart, proj);\r\n if (d < bestDist) {\r\n bestDist = d;\r\n bestIdx = i;\r\n bestT = t;\r\n }\r\n }\r\n }\r\n if (bestIdx === undefined) return undefined;\r\n return { i: bestIdx, t: bestT, dist: bestDist };\r\n } catch {\r\n return undefined;\r\n }\r\n };\r\n\r\n this.handler &&\r\n this.handler.setInputAction(\r\n (movement: any) => {\r\n // 拾取鼠标点击位置的实体\r\n const picked = (this.viewer.scene as any).pick?.(movement.position);\r\n const entity = picked?.id as Cesium.Entity | undefined;\r\n // 尝试从实体的 properties 中获取顶点索引(用于识别控制点)\r\n const idx =\r\n (entity as any)?.properties?._vertexIndex?.getValue?.() ??\r\n (entity as any)?.properties?._vertexIndex;\r\n\r\n if (this.draggingIndex === undefined) {\r\n // 当前没有选中的顶点\r\n if (typeof idx === 'number') {\r\n this.draggingIndex = idx;\r\n this.originalPositionOnDrag = positions[idx];\r\n if (this.segmentHighlight) {\r\n try {\r\n (layer.entities as any).remove(this.segmentHighlight);\r\n } catch {}\r\n this.segmentHighlight = undefined;\r\n }\r\n if (this.insertPreviewHandle) {\r\n try {\r\n (layer.entities as any).remove(this.insertPreviewHandle);\r\n } catch {}\r\n this.insertPreviewHandle = undefined;\r\n }\r\n } else {\r\n const clicked = this.getPositionFromMouse(movement);\r\n if (!clicked) return;\r\n let insertIndex = positions.length;\r\n if (positions.length >= 2) {\r\n const nearestWS = computeNearestSegmentFromPoint(clicked);\r\n if (nearestWS && typeof nearestWS.i === 'number') {\r\n insertIndex = nearestWS.i + 1; // 在线段 i→j 之间插入,索引为 i+1\r\n }\r\n }\r\n const insertPoint = clicked;\r\n positions.splice(insertIndex, 0, insertPoint);\r\n const newHandle = layer.entities.add({\r\n position: insertPoint,\r\n point: { pixelSize: 7, color: point_color },\r\n properties: { _vertexIndex: insertIndex },\r\n } as any);\r\n this.editHandles.splice(insertIndex, 0, newHandle);\r\n this.editHandles.forEach((h, k) => {\r\n try {\r\n (h as any).properties = { _vertexIndex: k } as any;\r\n } catch {}\r\n });\r\n this.draggingIndex = insertIndex;\r\n this.originalPositionOnDrag = insertPoint;\r\n if (this.segmentHighlight) {\r\n try {\r\n (layer.entities as any).remove(this.segmentHighlight);\r\n } catch {}\r\n this.segmentHighlight = undefined;\r\n }\r\n if (this.insertPreviewHandle) {\r\n try {\r\n (layer.entities as any).remove(this.insertPreviewHandle);\r\n } catch {}\r\n this.insertPreviewHandle = undefined;\r\n }\r\n }\r\n } else {\r\n this.draggingIndex = undefined;\r\n this.originalPositionOnDrag = undefined;\r\n }\r\n },\r\n (this.CesiumNS as any).ScreenSpaceEventType.LEFT_CLICK,\r\n );\r\n\r\n this.handler &&\r\n this.handler.setInputAction(\r\n (movement: any) => {\r\n const scene: any = (this.viewer as any).scene;\r\n if (this.draggingIndex !== undefined) {\r\n // 拖拽模式:更新正在拖拽的顶点位置\r\n const p = this.getPositionFromMouse(movement);\r\n if (!p) return;\r\n positions[this.draggingIndex] = p; // 更新顶点位置数组\r\n const handle = this.editHandles[this.draggingIndex];\r\n if (handle) (handle as any).position = p;\r\n if (this.segmentHighlight) {\r\n try {\r\n (layer.entities as any).remove(this.segmentHighlight);\r\n } catch {}\r\n this.segmentHighlight = undefined;\r\n }\r\n if (this.insertPreviewHandle) {\r\n try {\r\n (layer.entities as any).remove(this.insertPreviewHandle);\r\n } catch {}\r\n this.insertPreviewHandle = undefined;\r\n }\r\n return;\r\n }\r\n try {\r\n const winPos = movement?.endPosition ?? movement?.position ?? movement;\r\n if (!winPos) return;\r\n const ST: any = (this.CesiumNS as any).SceneTransforms;\r\n const threshold = 8;\r\n let bestIdx: number | undefined;\r\n let bestDist = Number.POSITIVE_INFINITY;\r\n let bestT: number | undefined; // 投影在线段上的位置比例 [0,1]\r\n const n = positions.length;\r\n if (n >= 2) {\r\n // 遍历所有线段,找出距离鼠标最近的线段\r\n for (let i = 0; i < n; i++) {\r\n const j = (i + 1) % n; // 闭合环\r\n const p1 = positions[i];\r\n const p2 = positions[j];\r\n // 将世界坐标转换为屏幕坐标\r\n const c1 = ST.wgs84ToWindowCoordinates?.(scene, p1);\r\n const c2 = ST.wgs84ToWindowCoordinates?.(scene, p2);\r\n if (!c1 || !c2) continue;\r\n const x = winPos.x,\r\n y = winPos.y;\r\n const x1 = c1.x,\r\n y1 = c1.y;\r\n const x2 = c2.x,\r\n y2 = c2.y;\r\n const dx = x2 - x1,\r\n dy = y2 - y1;\r\n const len2 = dx * dx + dy * dy;\r\n let t = 0;\r\n let dist;\r\n if (len2 === 0) {\r\n // 线段退化为点\r\n dist = Math.hypot(x - x1, y - y1);\r\n t = 0;\r\n } else {\r\n // 计算鼠标在线段上的投影位置比例 t\r\n t = ((x - x1) * dx + (y - y1) * dy) / len2;\r\n t = Math.max(0, Math.min(1, t)); // 限制在 [0,1] 范围\r\n const px = x1 + t * dx,\r\n py = y1 + t * dy;\r\n dist = Math.hypot(x - px, y - py); // 屏幕像素距离\r\n }\r\n if (dist < bestDist) {\r\n bestDist = dist;\r\n bestIdx = i;\r\n bestT = t;\r\n }\r\n }\r\n }\r\n if (bestIdx !== undefined && bestDist <= threshold) {\r\n const i = bestIdx;\r\n const j = (i + 1) % positions.length;\r\n if (!this.segmentHighlight) {\r\n // 创建绿色高亮线段\r\n this.segmentHighlight = layer.entities.add({\r\n polyline: {\r\n positions: [positions[i], positions[j]],\r\n width: 1,\r\n material: C.Color.LIME,\r\n clampToGround: true,\r\n },\r\n } as any);\r\n } else {\r\n // 更新高亮线段的位置\r\n (this.segmentHighlight as any).polyline.positions = [positions[i], positions[j]];\r\n }\r\n try {\r\n const Cany: any = this.CesiumNS as any;\r\n const p1 = positions[i];\r\n const p2 = positions[j];\r\n const tt = Math.max(0, Math.min(1, bestT ?? 0.5));\r\n // 使用线性插值计算插入预览点的世界坐标\r\n const preview = Cany.Cartesian3.lerp\r\n ? Cany.Cartesian3.lerp(p1, p2, tt, new Cany.Cartesian3())\r\n : new Cany.Cartesian3(\r\n p1.x + (p2.x - p1.x) * tt,\r\n p1.y + (p2.y - p1.y) * tt,\r\n p1.z + (p2.z - p1.z) * tt,\r\n );\r\n if (!this.insertPreviewHandle) {\r\n // 创建插入预览控制点(白色小圆点)\r\n this.insertPreviewHandle = layer.entities.add({\r\n position: preview,\r\n point: {\r\n pixelSize: 7,\r\n color: point_color,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n },\r\n properties: { _type: 'insert-preview' },\r\n } as any);\r\n } else {\r\n // 更新插入预览控制点的位置\r\n (this.insertPreviewHandle as any).position = preview;\r\n }\r\n } catch {}\r\n } else {\r\n if (this.segmentHighlight) {\r\n try {\r\n (layer.entities as any).remove(this.segmentHighlight);\r\n } catch {}\r\n this.segmentHighlight = undefined;\r\n }\r\n if (this.insertPreviewHandle) {\r\n try {\r\n (layer.entities as any).remove(this.insertPreviewHandle);\r\n } catch {}\r\n this.insertPreviewHandle = undefined;\r\n }\r\n }\r\n } catch {}\r\n },\r\n (this.CesiumNS as any).ScreenSpaceEventType.MOUSE_MOVE,\r\n );\r\n\r\n const finishEditing = () => {\r\n if (this.draggingIndex !== undefined && this.originalPositionOnDrag) {\r\n positions[this.draggingIndex] = this.originalPositionOnDrag;\r\n const handle = this.editHandles[this.draggingIndex];\r\n if (handle) (handle as any).position = this.originalPositionOnDrag;\r\n this.draggingIndex = undefined;\r\n this.originalPositionOnDrag = undefined;\r\n }\r\n if (this.segmentHighlight) {\r\n try {\r\n (layer.entities as any).remove(this.segmentHighlight);\r\n } catch {}\r\n this.segmentHighlight = undefined;\r\n }\r\n if (this.insertPreviewHandle) {\r\n try {\r\n (layer.entities as any).remove(this.insertPreviewHandle);\r\n } catch {}\r\n this.insertPreviewHandle = undefined;\r\n }\r\n this.cleanupHandles(layer);\r\n try {\r\n if (this.editOutline) {\r\n const finalRing = positions.slice();\r\n if (finalRing.length > 1) finalRing.push(finalRing[0]);\r\n (this.editOutline as any).polyline.positions = finalRing;\r\n \r\n this.applyDashedOutlineStyle(this.editOutline, line_fina_color, 3, 10);\r\n }\r\n } catch {}\r\n try {\r\n if ((polygonEntity as any).polygon) {\r\n (polygonEntity as any).polygon.hierarchy = positions.slice();\r\n }\r\n } catch {}\r\n try {\r\n if ((polygonEntity as any).polygon) {\r\n (polygonEntity as any).polygon.material = face_fina_color;\r\n }\r\n } catch {}\r\n try {\r\n this.handler?.destroy();\r\n } catch {}\r\n this.handler = undefined;\r\n \r\n if (this.keydownHandler) {\r\n document.removeEventListener('keydown', this.keydownHandler);\r\n this.keydownHandler = undefined;\r\n }\r\n \r\n onComplete?.(polygonEntity);\r\n };\r\n \r\n this.handler &&\r\n this.handler.setInputAction(\r\n finishEditing,\r\n (this.CesiumNS as any).ScreenSpaceEventType.RIGHT_CLICK,\r\n );\r\n\r\n this.setupKeyboardListener(finishEditing);\r\n\r\n return {\r\n stop: () => {\r\n // 清理所有控制点\r\n this.cleanupHandles(layer);\r\n try {\r\n if (this.editOutline) {\r\n const finalRing = positions.slice();\r\n if (finalRing.length > 1) finalRing.push(finalRing[0]); // 闭合环\r\n (this.editOutline as any).polyline.positions = finalRing;\r\n \r\n this.applyDashedOutlineStyle(this.editOutline, line_fina_color, 3, 10);\r\n }\r\n } catch {}\r\n // 将多边形的 hierarchy 改为静态值(不再动态更新)\r\n try {\r\n if ((polygonEntity as any).polygon) {\r\n (polygonEntity as any).polygon.hierarchy = positions.slice();\r\n }\r\n if ((polygonEntity as any).polygon) {\r\n (polygonEntity as any).polygon.hierarchy = positions.slice();\r\n }\r\n } catch {}\r\n try {\r\n if ((polygonEntity as any).polygon) {\r\n (polygonEntity as any).polygon.material = face_fina_color;\r\n }\r\n } catch {}\r\n \r\n this.finalizePolygonSession(layer, onComplete, polygonEntity);\r\n },\r\n };\r\n }\r\n\r\n private cleanupHandles(layer: Cesium.CustomDataSource) {\r\n try {\r\n for (const h of this.editHandles) (layer.entities as any).remove(h);\r\n } catch {}\r\n this.editHandles = [];\r\n this.draggingIndex = undefined;\r\n }\r\n\r\n /**\r\n * 计算多边形的周长和面积\r\n */\r\n calculatePolygonPerimeterAndArea(\r\n points: Array<{ lon: number; lat: number; height?: number }>\r\n ): { perimeter: number; area: number } {\r\n if (!points || points.length < 3) {\r\n return { perimeter: 0, area: 0 };\r\n }\r\n\r\n const C = this.CesiumNS as any;\r\n const ellipsoid = C.Ellipsoid.WGS84;\r\n\r\n const positions = points.map((pt) =>\r\n C.Cartesian3.fromDegrees(pt.lon, pt.lat, 0)\r\n );\r\n\r\n let perimeter = 0;\r\n for (let i = 0; i < positions.length; i++) {\r\n const p1 = positions[i];\r\n const p2 = positions[(i + 1) % positions.length];\r\n const distance = C.Cartesian3.distance(p1, p2);\r\n perimeter += distance;\r\n }\r\n\r\n try {\r\n const polygonGeometry = new C.PolygonGeometry({\r\n polygonHierarchy: new C.PolygonHierarchy(positions),\r\n ellipsoid: ellipsoid,\r\n });\r\n\r\n const geometry = C.PolygonGeometry.createGeometry(polygonGeometry);\r\n \r\n if (geometry && geometry.attributes && geometry.attributes.position) {\r\n const positionAttribute = geometry.attributes.position.values;\r\n const indices = geometry.indices;\r\n \r\n let area = 0;\r\n \r\n if (indices) {\r\n for (let i = 0; i < indices.length; i += 3) {\r\n const i0 = indices[i] * 3;\r\n const i1 = indices[i + 1] * 3;\r\n const i2 = indices[i + 2] * 3;\r\n\r\n const v0 = new C.Cartesian3(\r\n positionAttribute[i0],\r\n positionAttribute[i0 + 1],\r\n positionAttribute[i0 + 2]\r\n );\r\n const v1 = new C.Cartesian3(\r\n positionAttribute[i1],\r\n positionAttribute[i1 + 1],\r\n positionAttribute[i1 + 2]\r\n );\r\n const v2 = new C.Cartesian3(\r\n positionAttribute[i2],\r\n positionAttribute[i2 + 1],\r\n positionAttribute[i2 + 2]\r\n );\r\n\r\n const ab = C.Cartesian3.subtract(v1, v0, new C.Cartesian3());\r\n const ac = C.Cartesian3.subtract(v2, v0, new C.Cartesian3());\r\n const cross = C.Cartesian3.cross(ab, ac, new C.Cartesian3());\r\n const triangleArea = C.Cartesian3.magnitude(cross) / 2.0;\r\n \r\n area += triangleArea;\r\n }\r\n }\r\n\r\n return {\r\n perimeter: perimeter,\r\n area: area,\r\n };\r\n }\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 面积计算失败,使用近似算法:', e);\r\n }\r\n\r\n let area = 0;\r\n const radiusSquared = ellipsoid.maximumRadius * ellipsoid.maximumRadius;\r\n \r\n for (let i = 0; i < positions.length; i++) {\r\n const p1 = positions[i];\r\n const p2 = positions[(i + 1) % positions.length];\r\n \r\n const cartographic1 = ellipsoid.cartesianToCartographic(p1);\r\n const cartographic2 = ellipsoid.cartesianToCartographic(p2);\r\n \r\n const lat1 = cartographic1.latitude;\r\n const lat2 = cartographic2.latitude;\r\n const lon1 = cartographic1.longitude;\r\n const lon2 = cartographic2.longitude;\r\n \r\n area += (lon2 - lon1) * (2 + Math.sin(lat1) + Math.sin(lat2));\r\n }\r\n \r\n area = Math.abs(area * radiusSquared / 2.0);\r\n\r\n return {\r\n perimeter: perimeter,\r\n area: area,\r\n };\r\n }\r\n\r\n /**\r\n * 从点位数组创建一个多边形及其轮廓线和标签\r\n * @param options 创建选项\r\n * - layer: 目标图层 (CustomDataSource)\r\n * - id: 实体ID\r\n * - name: 实体名称\r\n * - points: 点位数组 [{ lon, lat, height }]\r\n * @returns 创建的主多边形实体,如果失败则返回 null\r\n */\r\n createPolygonFromPoints(options: {\r\n layer: Cesium.CustomDataSource;\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height?: number }>;\r\n }): Cesium.Entity | null {\r\n const C = this.CesiumNS as any;\r\n const { layer, id, name, points } = options;\r\n\r\n // 1. 验证点位数量\r\n if (!points || points.length < 3) {\r\n console.warn(`[PolygonEditor] 顶点不足 3 个,无法创建多边形`);\r\n return null;\r\n }\r\n\r\n // 2. 获取图层对应的颜色配置\r\n const colors = this.getColorConfig(layer.name);\r\n const lineColor = colors.lineFinalColor;\r\n const faceColor = colors.faceFinalColor;\r\n\r\n // 3. 转换点位为 Cartesian3\r\n const positions = points.map((pt) =>\r\n C.Cartesian3.fromDegrees(pt.lon, pt.lat, pt.height || 0)\r\n );\r\n\r\n try {\r\n // 4. 创建多边形实体\r\n const entity = layer.entities.add({\r\n id,\r\n name,\r\n polygon: {\r\n hierarchy: positions,\r\n material: faceColor,\r\n outline: false,\r\n },\r\n } as any);\r\n\r\n // 5. 创建轮廓线\r\n const ring = positions.slice();\r\n ring.push(ring[0]);\r\n const outlineEntity = layer.entities.add({\r\n id: `${id}-outline`,\r\n name: 'Polygon Outline',\r\n polyline: {\r\n positions: ring,\r\n width: 1,\r\n material: lineColor,\r\n clampToGround: true,\r\n },\r\n properties: { _ownerId: id, _type: 'polygon-outline' },\r\n } as any);\r\n\r\n this.applyDashedOutlineStyle(outlineEntity, lineColor, 3, 10);\r\n\r\n // 6. 创建标签 (显示下划线后的部分)\r\n const displayText = name.includes('_') ? name.split('_')[1] : name;\r\n layer.entities.add({\r\n id: `${id}-label`,\r\n name: 'Polygon Label',\r\n position: positions[0],\r\n label: {\r\n text: displayText,\r\n font: 'bold 16px Microsoft YaHei, SimHei, sans-serif',\r\n fillColor: lineColor,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n style: C.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n pixelOffset: new C.Cartesian2(0, -10),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: { _ownerId: id, _type: 'polygon-label' },\r\n } as any);\r\n\r\n return entity;\r\n } catch (err) {\r\n console.error(`[PolygonEditor] 创建多边形失败:`, err);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 辅助方法:从实体中提取经纬度高度数组\r\n * @param entity 多边形实体\r\n * @returns 点位数组 [{ lon, lat, height }]\r\n */\r\n private getEntityLonLatTerrainHeightArray(entity: Cesium.Entity): Array<{ lon: number; lat: number; height: number }> {\r\n const C = this.CesiumNS as any;\r\n const polygon = (entity as any).polygon;\r\n if (!polygon) return [];\r\n\r\n const hierarchy = typeof polygon.hierarchy?.getValue === 'function'\r\n ? polygon.hierarchy.getValue(C.JulianDate.now())\r\n : polygon.hierarchy;\r\n\r\n const positions = hierarchy?.positions ?? hierarchy ?? [];\r\n \r\n const points = positions.map((cartesian: any) => {\r\n const cartographic = C.Cartographic.fromCartesian(cartesian);\r\n return {\r\n lon: C.Math.toDegrees(cartographic.longitude),\r\n lat: C.Math.toDegrees(cartographic.latitude),\r\n height: cartographic.height\r\n };\r\n });\r\n\r\n // 多边形首尾闭合:如果首尾点不同,则添加第一个点到末尾\r\n if (points.length > 0) {\r\n const first = points[0];\r\n const last = points[points.length - 1];\r\n if (first.lon !== last.lon || first.lat !== last.lat || first.height !== last.height) {\r\n points.push({ ...first });\r\n }\r\n }\r\n\r\n return points;\r\n }\r\n\r\n /**\r\n * 辅助方法:获取实体所属的 DataSource\r\n * @param entity 实体对象\r\n * @returns DataSource 或 undefined\r\n */\r\n private getEntityDataSource(entity: Cesium.Entity | undefined): Cesium.CustomDataSource | undefined {\r\n if (!entity) return undefined;\r\n return (entity as any)?.entityCollection?._owner;\r\n }\r\n /**\r\n * 分析子阵和组串的层级关系,并自动重新编码\r\n * \r\n * 功能说明:\r\n * 1. 收集所有 subarray 和 inverter 多边形 (或仅处理指定的子阵)\r\n * 2. 使用射线法判断 inverter 是否在 subarray 内部\r\n * 3. 构建层级关系数据结构\r\n * 4. 按空间位置排序(从北到南、从东到西)\r\n * 5. 重新编码:\r\n * - 子阵: #01, #02, #03, ...\r\n * - 子阵内组串: G1.1.1, G1.1.2, ..., G1.1.99, G1.2.1, ...\r\n * - 独立组串: GX.1.1, GX.1.2, ..., GX.1.99, GX.2.1, ...\r\n * 6. 保存原始名称用于还原\r\n * \r\n * @param targetSubarrayEntity - 可选,指定要处理的子阵实体。如果提供,则只处理该子阵及其内部组串\r\n * @returns 编码结果对象,包含成功状态、统计信息、层级关系等\r\n */\r\n analyzeAndEncodePolygonHierarchy(targetSubarrayEntity?: any): {\r\n success: boolean;\r\n subarrayCount: number;\r\n inverterCount: number;\r\n independentCount: number;\r\n savedNamesCount: number;\r\n hierarchy?: {\r\n subarrays: Array<{\r\n id: string;\r\n name: string;\r\n oldName?: string;\r\n inverters: Array<{\r\n id: string;\r\n name: string;\r\n oldName?: string;\r\n }>;\r\n }>;\r\n independentInverters?: Array<{\r\n id: string;\r\n name: string;\r\n oldName?: string;\r\n }>;\r\n };\r\n recodingResult?: Array<{\r\n oldId: string;\r\n oldName: string;\r\n newCode: string;\r\n subarraySeq: number | string;\r\n subarrayName: string;\r\n globalIndex: number;\r\n isIndependent?: boolean;\r\n }>;\r\n error?: string;\r\n } {\r\n try {\r\n // 判断是全局计算还是单个子阵计算\r\n const isSingleSubarrayMode = !!targetSubarrayEntity;\r\n \r\n // 清空原始名称映射,准备保存新的映射\r\n this.originalPolygonNames.clear();\r\n \r\n // 1. 收集 subarray 多边形\r\n let subarrayEntities: any[] = [];\r\n \r\n if (isSingleSubarrayMode) {\r\n // 单个子阵模式: 只处理指定的子阵\r\n subarrayEntities = [targetSubarrayEntity];\r\n } else {\r\n // 全局模式: 收集所有 subarray 多边形\r\n const subarrayLayers = this.viewer.dataSources.getByName('subarray');\r\n subarrayLayers.forEach((layer: any) => {\r\n const entities = layer.entities.values.filter((e: any) => e.polygon);\r\n subarrayEntities.push(...entities);\r\n });\r\n }\r\n \r\n // 2. 收集 inverter 多边形 (在单个子阵模式下,后续会过滤出只在该子阵内的组串)\r\n const inverterLayers = this.viewer.dataSources.getByName('inverter');\r\n const inverterEntities: any[] = [];\r\n inverterLayers.forEach((layer: any) => {\r\n const entities = layer.entities.values.filter((e: any) => e.polygon);\r\n inverterEntities.push(...entities);\r\n });\r\n \r\n // 3. 判断一个点是否在多边形内部 (射线法)\r\n const isPointInPolygon = (point: [number, number], polygonPoints: any[]): boolean => {\r\n const [x, y] = point;\r\n let inside = false;\r\n \r\n for (let i = 0, j = polygonPoints.length - 1; i < polygonPoints.length; j = i++) {\r\n const xi = polygonPoints[i].lon;\r\n const yi = polygonPoints[i].lat;\r\n const xj = polygonPoints[j].lon;\r\n const yj = polygonPoints[j].lat;\r\n \r\n const intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\r\n if (intersect) inside = !inside;\r\n }\r\n \r\n return inside;\r\n };\r\n \r\n // 4. 判断 inverter 是否完全在 subarray 内部\r\n const isInverterInSubarray = (inverter: any, subarray: any): boolean => {\r\n const inverterPoints = this.getEntityLonLatTerrainHeightArray(inverter);\r\n const subarrayPoints = this.getEntityLonLatTerrainHeightArray(subarray);\r\n \r\n // 检查 inverter 的所有顶点是否都在 subarray 内\r\n for (const point of inverterPoints) {\r\n if (!isPointInPolygon([point.lon, point.lat], subarrayPoints)) {\r\n return false;\r\n }\r\n }\r\n \r\n return true;\r\n };\r\n \r\n // 5. 构建层级关系\r\n const hierarchy: any = {\r\n subarrays: []\r\n };\r\n \r\n // 遍历所有 subarray\r\n subarrayEntities.forEach((subarray: any) => {\r\n const subarrayData: any = {\r\n id: subarray.id,\r\n name: subarray.name || '',\r\n inverters: []\r\n };\r\n \r\n // 遍历所有 inverter,检查是否在当前 subarray 内\r\n inverterEntities.forEach((inverter: any) => {\r\n if (isInverterInSubarray(inverter, subarray)) {\r\n subarrayData.inverters.push({\r\n id: inverter.id,\r\n name: inverter.name || ''\r\n });\r\n }\r\n });\r\n \r\n hierarchy.subarrays.push(subarrayData);\r\n });\r\n \r\n // 6. 找出不属于任何 subarray 的 inverter (独立的)\r\n const allInvertersInSubarrays = new Set<string>();\r\n hierarchy.subarrays.forEach((sub: any) => {\r\n sub.inverters.forEach((inv: any) => {\r\n allInvertersInSubarrays.add(inv.id);\r\n });\r\n });\r\n \r\n const independentInverters: any[] = [];\r\n inverterEntities.forEach((inverter: any) => {\r\n if (!allInvertersInSubarrays.has(inverter.id)) {\r\n independentInverters.push({\r\n id: inverter.id,\r\n name: inverter.name || ''\r\n });\r\n }\r\n });\r\n \r\n if (independentInverters.length > 0) {\r\n hierarchy.independentInverters = independentInverters;\r\n }\r\n \r\n // 7. 子阵和组串重新编码\r\n // 计算多边形的空间中心点 (用于排序)\r\n const getPolygonCenter = (entity: any): [number, number] => {\r\n const points = this.getEntityLonLatTerrainHeightArray(entity);\r\n let sumLon = 0, sumLat = 0;\r\n points.forEach((p: any) => {\r\n sumLon += p.lon;\r\n sumLat += p.lat;\r\n });\r\n return [sumLon / points.length, sumLat / points.length];\r\n };\r\n \r\n // 第一步: 按空间顺序排序 subarray (从北到南、从东到西)\r\n const sortedSubarrays = [...hierarchy.subarrays].sort((a: any, b: any) => {\r\n const aEntity = subarrayEntities.find((e: any) => e.id === a.id);\r\n const bEntity = subarrayEntities.find((e: any) => e.id === b.id);\r\n const [aLon, aLat] = getPolygonCenter(aEntity);\r\n const [bLon, bLat] = getPolygonCenter(bEntity);\r\n \r\n // 先按纬度降序 (从北到南)\r\n if (Math.abs(aLat - bLat) > 0.0001) {\r\n return bLat - aLat;\r\n }\r\n // 纬度相近则按经度降序 (从东到西)\r\n return bLon - aLon;\r\n });\r\n \r\n // 第二步: 为每个 subarray 分配编码并更新 name (格式: #01, #02, ...)\r\n // ⚠️ 单个子阵模式下,不重新编码子阵本身,只编码组串\r\n if (!isSingleSubarrayMode) {\r\n sortedSubarrays.forEach((subarrayData: any, subarrayIndex: number) => {\r\n const subarraySeq = subarrayIndex + 1;\r\n const subarrayEntity = subarrayEntities.find((e: any) => e.id === subarrayData.id);\r\n \r\n const subarrayNewCode = `#${String(subarraySeq).padStart(2, '0')}`;\r\n const oldSubarrayName = subarrayEntity.name || '';\r\n \r\n // 保存原始名称到映射表 (用于还原)\r\n const subarrayDataSource = this.getEntityDataSource(subarrayEntity);\r\n this.originalPolygonNames.set(subarrayEntity.id, {\r\n entityId: subarrayEntity.id,\r\n oldName: oldSubarrayName,\r\n layerName: subarrayDataSource?.name || 'subarray'\r\n });\r\n \r\n subarrayEntity.name = subarrayNewCode;\r\n \r\n // 更新子阵的 label\r\n if (subarrayDataSource) {\r\n const subarrayLabelId = `${subarrayEntity.id}-label`;\r\n const subarrayLabelEntity = subarrayDataSource.entities.getById(subarrayLabelId);\r\n if (subarrayLabelEntity && (subarrayLabelEntity as any).label) {\r\n (subarrayLabelEntity as any).label.text = subarrayNewCode;\r\n }\r\n }\r\n });\r\n } else {\r\n // 单个子阵模式: 保持子阵原名称,但仍需保存到映射表\r\n const subarrayEntity = targetSubarrayEntity;\r\n const subarrayDataSource = this.getEntityDataSource(subarrayEntity);\r\n this.originalPolygonNames.set(subarrayEntity.id, {\r\n entityId: subarrayEntity.id,\r\n oldName: subarrayEntity.name || '',\r\n layerName: subarrayDataSource?.name || 'subarray'\r\n });\r\n }\r\n \r\n // 第三步: 为每个子阵内的 inverter 分配编码\r\n const recodingResult: any[] = [];\r\n let globalInverterIndex = 1;\r\n \r\n sortedSubarrays.forEach((subarrayData: any, subarrayIndex: number) => {\r\n // 确定子阵序号\r\n let subarraySeq: number;\r\n let subarrayName: string;\r\n \r\n if (isSingleSubarrayMode) {\r\n // 单个子阵模式: 从子阵名称中提取序号\r\n // 例如: \"#01\" -> 1, \"#02\" -> 2, \"subarray_#03\" -> 3\r\n const subarrayEntity = targetSubarrayEntity;\r\n const name = subarrayEntity.name || '';\r\n const match = name.match(/#(\\d+)/);\r\n subarraySeq = match ? parseInt(match[1], 10) : 1;\r\n subarrayName = name;\r\n } else {\r\n // 全局模式: 使用排序后的索引\r\n subarraySeq = subarrayIndex + 1;\r\n subarrayName = `#${String(subarraySeq).padStart(2, '0')}`;\r\n }\r\n \r\n // 获取当前子阵的所有 inverter 实体\r\n const inverterEntitiesInSubarray = subarrayData.inverters.map((inv: any) => \r\n inverterEntities.find((e: any) => e.id === inv.id)\r\n );\r\n \r\n // 按空间顺序排序 inverter (从北到南、从东到西)\r\n const sortedInverters = inverterEntitiesInSubarray.sort((a: any, b: any) => {\r\n const [aLon, aLat] = getPolygonCenter(a);\r\n const [bLon, bLat] = getPolygonCenter(b);\r\n if (Math.abs(aLat - bLat) > 0.0001) {\r\n return bLat - aLat;\r\n }\r\n return bLon - aLon;\r\n });\r\n \r\n // 为每个 inverter 分配三级编码 (逢99进1)\r\n sortedInverters.forEach((inverterEntity: any, localIndex: number) => {\r\n const level2 = Math.floor(localIndex / 99) + 1;\r\n const level3 = (localIndex % 99) + 1;\r\n \r\n const newCode = `G${subarraySeq}.${level2}.${level3}`;\r\n const oldName = inverterEntity.name || '';\r\n \r\n // 保存原始名称到映射表 (用于还原)\r\n const inverterDataSource = this.getEntityDataSource(inverterEntity);\r\n this.originalPolygonNames.set(inverterEntity.id, {\r\n entityId: inverterEntity.id,\r\n oldName: oldName,\r\n layerName: inverterDataSource?.name || 'inverter'\r\n });\r\n \r\n recodingResult.push({\r\n oldId: inverterEntity.id,\r\n oldName: oldName,\r\n newCode: newCode,\r\n subarraySeq: subarraySeq,\r\n subarrayName: subarrayName,\r\n globalIndex: globalInverterIndex++\r\n });\r\n \r\n // 实际更新 entity 的 name\r\n inverterEntity.name = newCode;\r\n \r\n // 更新关联的 label\r\n const dataSource = this.getEntityDataSource(inverterEntity);\r\n if (dataSource) {\r\n const labelId = `${inverterEntity.id}-label`;\r\n const labelEntity = dataSource.entities.getById(labelId);\r\n if (labelEntity && (labelEntity as any).label) {\r\n (labelEntity as any).label.text = newCode;\r\n }\r\n }\r\n });\r\n });\r\n \r\n // 处理独立组串 (不在任何子阵内的 inverter)\r\n // ⚠️ 单个子阵模式下,不处理独立组串\r\n if (!isSingleSubarrayMode && independentInverters.length > 0) {\r\n const independentInverterEntities = independentInverters.map((inv: any) => \r\n inverterEntities.find((e: any) => e.id === inv.id)\r\n ).filter((e: any) => e !== undefined);\r\n \r\n // 按空间顺序排序 (从北到南、从东到西)\r\n const sortedIndependentInverters = independentInverterEntities.sort((a: any, b: any) => {\r\n const [aLon, aLat] = getPolygonCenter(a);\r\n const [bLon, bLat] = getPolygonCenter(b);\r\n \r\n if (Math.abs(aLat - bLat) > 0.0001) {\r\n return bLat - aLat;\r\n }\r\n return bLon - aLon;\r\n });\r\n \r\n // 为每个独立组串分配编码 (使用 X 作为第一位)\r\n sortedIndependentInverters.forEach((inverterEntity: any, localIndex: number) => {\r\n const level2 = Math.floor(localIndex / 99) + 1;\r\n const level3 = (localIndex % 99) + 1;\r\n \r\n const newCode = `GX.${level2}.${level3}`;\r\n const oldName = inverterEntity.name || '';\r\n \r\n // 保存原始名称到映射表 (用于还原)\r\n const inverterDataSource = this.getEntityDataSource(inverterEntity);\r\n this.originalPolygonNames.set(inverterEntity.id, {\r\n entityId: inverterEntity.id,\r\n oldName: oldName,\r\n layerName: inverterDataSource?.name || 'inverter'\r\n });\r\n \r\n recodingResult.push({\r\n oldId: inverterEntity.id,\r\n oldName: oldName,\r\n newCode: newCode,\r\n subarraySeq: 'X',\r\n subarrayName: '(独立组串)',\r\n globalIndex: globalInverterIndex++,\r\n isIndependent: true\r\n });\r\n \r\n // 实际更新 entity 的 name\r\n inverterEntity.name = newCode;\r\n \r\n // 更新关联的 label\r\n const dataSource = this.getEntityDataSource(inverterEntity);\r\n if (dataSource) {\r\n const labelId = `${inverterEntity.id}-label`;\r\n const labelEntity = dataSource.entities.getById(labelId);\r\n if (labelEntity && (labelEntity as any).label) {\r\n (labelEntity as any).label.text = newCode;\r\n }\r\n }\r\n });\r\n }\r\n \r\n // 构建返回的层级关系数据 (包含编码后的新名称和原始名称)\r\n const finalHierarchy = {\r\n subarrays: sortedSubarrays.map((subarrayData: any) => {\r\n const subarrayEntity = subarrayEntities.find((e: any) => e.id === subarrayData.id);\r\n const originalData = this.originalPolygonNames.get(subarrayData.id);\r\n return {\r\n id: subarrayData.id,\r\n name: subarrayEntity?.name || subarrayData.name,\r\n oldName: originalData?.oldName,\r\n inverters: subarrayData.inverters.map((inv: any) => {\r\n const inverterEntity = inverterEntities.find((e: any) => e.id === inv.id);\r\n const invOriginalData = this.originalPolygonNames.get(inv.id);\r\n return {\r\n id: inv.id,\r\n name: inverterEntity?.name || inv.name,\r\n oldName: invOriginalData?.oldName\r\n };\r\n })\r\n };\r\n }),\r\n independentInverters: independentInverters.length > 0 ? independentInverters.map((inv: any) => {\r\n const inverterEntity = inverterEntities.find((e: any) => e.id === inv.id);\r\n const invOriginalData = this.originalPolygonNames.get(inv.id);\r\n return {\r\n id: inv.id,\r\n name: inverterEntity?.name || inv.name,\r\n oldName: invOriginalData?.oldName\r\n };\r\n }) : undefined\r\n };\r\n \r\n return {\r\n success: true,\r\n subarrayCount: sortedSubarrays.length,\r\n inverterCount: recodingResult.length,\r\n independentCount: independentInverters.length,\r\n savedNamesCount: this.originalPolygonNames.size,\r\n hierarchy: finalHierarchy,\r\n recodingResult: recodingResult\r\n };\r\n \r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to analyze polygon hierarchy:', e);\r\n return {\r\n success: false,\r\n subarrayCount: 0,\r\n inverterCount: 0,\r\n independentCount: 0,\r\n savedNamesCount: 0,\r\n error: String(e)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 还原多边形的原始名称\r\n * \r\n * 功能说明:\r\n * 1. 检查是否有保存的原始名称\r\n * 2. 遍历所有保存的实体并还原名称\r\n * 3. 同步更新关联的 label 文本\r\n * 4. 还原后清空映射表\r\n * \r\n * @returns 还原结果对象,包含成功状态、统计信息等\r\n */\r\n restoreOriginalNames(): {\r\n success: boolean;\r\n restoredCount: number;\r\n notFoundCount: number;\r\n message?: string;\r\n } {\r\n try {\r\n \r\n // 检查是否有保存的原始名称\r\n if (this.originalPolygonNames.size === 0) {\r\n console.warn('[PolygonEditor] ⚠️ 未找到保存的原始名称,请先执行 analyzeAndEncodePolygonHierarchy 进行编码');\r\n return {\r\n success: false,\r\n restoredCount: 0,\r\n notFoundCount: 0,\r\n message: '未找到保存的原始名称,请先执行编码操作'\r\n };\r\n }\r\n \r\n let restoredCount = 0;\r\n let notFoundCount = 0;\r\n \r\n // 遍历所有保存的原始名称\r\n this.originalPolygonNames.forEach((data, entityId) => {\r\n // 在对应的图层中查找实体\r\n const layers = this.viewer.dataSources.getByName(data.layerName);\r\n let entityFound = false;\r\n \r\n for (const layer of layers) {\r\n const entity = layer.entities.getById(entityId);\r\n if (entity) {\r\n entityFound = true;\r\n \r\n // 还原实体名称\r\n entity.name = data.oldName;\r\n \r\n // 还原关联的 label\r\n const labelId = `${entityId}-label`;\r\n const labelEntity = layer.entities.getById(labelId);\r\n if (labelEntity && (labelEntity as any).label) {\r\n const displayText = data.oldName.includes('_') ? data.oldName.split('_')[1] : data.oldName;\r\n (labelEntity as any).label.text = displayText;\r\n }\r\n \r\n restoredCount++;\r\n break;\r\n }\r\n }\r\n \r\n if (!entityFound) {\r\n console.warn(`[PolygonEditor] ✗ 未找到实体: ${entityId} (${data.layerName})`);\r\n notFoundCount++;\r\n }\r\n });\r\n \r\n // 清空保存的映射表\r\n this.originalPolygonNames.clear();\r\n \r\n return {\r\n success: true,\r\n restoredCount,\r\n notFoundCount\r\n };\r\n \r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to restore polygon names:', e);\r\n return {\r\n success: false,\r\n restoredCount: 0,\r\n notFoundCount: 0,\r\n message: String(e)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 仅分析多边形层级关系,不修改名称\r\n * \r\n * 功能说明:\r\n * 1. 收集所有 subarray 和 inverter 多边形\r\n * 2. 使用射线法判断 inverter 是否在 subarray 内部\r\n * 3. 构建层级关系数据结构\r\n * 4. 不进行任何重新编码操作,保持原始名称\r\n * 5. 按当前名称组织层级结构\r\n * \r\n * @returns 层级关系对象,包含成功状态和层级数据\r\n */\r\n getPolygonHierarchyWithoutEncoding(): {\r\n success: boolean;\r\n subarrayCount: number;\r\n inverterCount: number;\r\n independentCount: number;\r\n hierarchy?: {\r\n subarrays: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n inverters: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n }>;\r\n independentInverters: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n };\r\n error?: string;\r\n } {\r\n try {\r\n // 1. 收集所有 subarray 和 inverter 实体\r\n const subarrayEntities: any[] = [];\r\n const inverterEntities: any[] = [];\r\n\r\n const subarrayLayers = this.viewer.dataSources.getByName('subarray');\r\n subarrayLayers.forEach((layer: any) => {\r\n const entities = layer.entities.values.filter((e: any) => !!(e.polygon));\r\n subarrayEntities.push(...entities);\r\n });\r\n\r\n const inverterLayers = this.viewer.dataSources.getByName('inverter');\r\n inverterLayers.forEach((layer: any) => {\r\n const entities = layer.entities.values.filter((e: any) => !!(e.polygon));\r\n inverterEntities.push(...entities);\r\n });\r\n\r\n if (subarrayEntities.length === 0 && inverterEntities.length === 0) {\r\n return {\r\n success: false,\r\n subarrayCount: 0,\r\n inverterCount: 0,\r\n independentCount: 0,\r\n error: '未找到任何多边形'\r\n };\r\n }\r\n\r\n // 2. 射线法判断点是否在多边形内\r\n const isPointInPolygon = (point: [number, number], polygonPoints: any[]): boolean => {\r\n let inside = false;\r\n for (let i = 0, j = polygonPoints.length - 1; i < polygonPoints.length; j = i++) {\r\n const xi = polygonPoints[i].lon, yi = polygonPoints[i].lat;\r\n const xj = polygonPoints[j].lon, yj = polygonPoints[j].lat;\r\n const intersect = ((yi > point[1]) !== (yj > point[1]))\r\n && (point[0] < (xj - xi) * (point[1] - yi) / (yj - yi) + xi);\r\n if (intersect) inside = !inside;\r\n }\r\n return inside;\r\n };\r\n\r\n // 3. 建立层级关系:判断每个 inverter 是否在某个 subarray 内\r\n const hierarchyMap: Map<string, any[]> = new Map();\r\n const independentInverters: any[] = [];\r\n\r\n // 初始化每个子阵的组串数组\r\n subarrayEntities.forEach((subarray: any) => {\r\n hierarchyMap.set(subarray.id, []);\r\n });\r\n\r\n // 遍历每个 inverter,判断它属于哪个 subarray\r\n inverterEntities.forEach((inverter: any) => {\r\n let belongsToSubarray = false;\r\n\r\n for (const subarray of subarrayEntities) {\r\n const inverterPoints = this.getEntityLonLatTerrainHeightArray(inverter);\r\n const subarrayPoints = this.getEntityLonLatTerrainHeightArray(subarray);\r\n\r\n // 检查 inverter 的所有顶点是否都在 subarray 内\r\n const allPointsInside = inverterPoints.every(point => \r\n isPointInPolygon([point.lon, point.lat], subarrayPoints)\r\n );\r\n\r\n if (allPointsInside) {\r\n hierarchyMap.get(subarray.id)!.push(inverter);\r\n belongsToSubarray = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!belongsToSubarray) {\r\n independentInverters.push(inverter);\r\n }\r\n });\r\n\r\n // 4. 构建返回的层级关系数据 (使用当前名称,不修改)\r\n const finalHierarchy = {\r\n subarrays: subarrayEntities.map((subarrayEntity: any) => {\r\n const subarrayPoints = this.getEntityLonLatTerrainHeightArray(subarrayEntity);\r\n const invertersInSubarray = hierarchyMap.get(subarrayEntity.id) || [];\r\n\r\n return {\r\n id: subarrayEntity.id,\r\n name: subarrayEntity.name || '',\r\n points: subarrayPoints,\r\n inverters: invertersInSubarray.map((inverterEntity: any) => {\r\n const inverterPoints = this.getEntityLonLatTerrainHeightArray(inverterEntity);\r\n return {\r\n id: inverterEntity.id,\r\n name: inverterEntity.name || '',\r\n points: inverterPoints\r\n };\r\n })\r\n };\r\n }),\r\n independentInverters: independentInverters.map((inverterEntity: any) => {\r\n const points = this.getEntityLonLatTerrainHeightArray(inverterEntity);\r\n return {\r\n id: inverterEntity.id,\r\n name: inverterEntity.name || '',\r\n points: points\r\n };\r\n })\r\n };\r\n\r\n const totalInvertersInSubarrays = finalHierarchy.subarrays.reduce(\r\n (sum, subarray) => sum + subarray.inverters.length,\r\n 0\r\n );\r\n\r\n return {\r\n success: true,\r\n subarrayCount: subarrayEntities.length,\r\n inverterCount: totalInvertersInSubarrays,\r\n independentCount: independentInverters.length,\r\n hierarchy: finalHierarchy\r\n };\r\n\r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to analyze hierarchy:', e);\r\n return {\r\n success: false,\r\n subarrayCount: 0,\r\n inverterCount: 0,\r\n independentCount: 0,\r\n error: String(e)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 导出指定子阵及其内部组串的层级结构\r\n * \r\n * @param subarrayEntity - 要导出的子阵实体\r\n * @returns 导出结果,包含该子阵及其内部组串的层级结构\r\n */\r\n exportSingleSubarrayHierarchy(subarrayEntity: any): {\r\n success: boolean;\r\n subarrayCount: number;\r\n inverterCount: number;\r\n hierarchy?: {\r\n subarrays: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n inverters: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n }>;\r\n independentInverters: Array<any>;\r\n };\r\n error?: string;\r\n } {\r\n try {\r\n console.log(`[PolygonEditor] 导出单个子阵: ${subarrayEntity.name}`);\r\n\r\n // 获取子阵的点位数据\r\n const subarrayPoints = this.getEntityLonLatTerrainHeightArray(subarrayEntity);\r\n\r\n // 射线法判断点是否在多边形内\r\n const isPointInPolygon = (point: [number, number], polygonPoints: any[]): boolean => {\r\n let inside = false;\r\n for (let i = 0, j = polygonPoints.length - 1; i < polygonPoints.length; j = i++) {\r\n const xi = polygonPoints[i].lon, yi = polygonPoints[i].lat;\r\n const xj = polygonPoints[j].lon, yj = polygonPoints[j].lat;\r\n const intersect = ((yi > point[1]) !== (yj > point[1]))\r\n && (point[0] < (xj - xi) * (point[1] - yi) / (yj - yi) + xi);\r\n if (intersect) inside = !inside;\r\n }\r\n return inside;\r\n };\r\n\r\n // 查找该子阵内的所有组串\r\n const invertersInSubarray: any[] = [];\r\n const inverterLayers = this.viewer.dataSources.getByName('inverter');\r\n\r\n inverterLayers.forEach((inverterLayer: any) => {\r\n const inverterEntities = inverterLayer.entities.values.filter((e: any) => !!(e.polygon));\r\n\r\n inverterEntities.forEach((inverterEntity: any) => {\r\n const inverterPoints = this.getEntityLonLatTerrainHeightArray(inverterEntity);\r\n\r\n // 检查组串的所有顶点是否都在子阵内\r\n const allPointsInside = inverterPoints.every(point =>\r\n isPointInPolygon([point.lon, point.lat], subarrayPoints)\r\n );\r\n\r\n if (allPointsInside) {\r\n invertersInSubarray.push({\r\n id: inverterEntity.id,\r\n name: inverterEntity.name || '',\r\n points: inverterPoints\r\n });\r\n }\r\n });\r\n });\r\n\r\n // 构建层级结构输出\r\n const hierarchy = {\r\n subarrays: [\r\n {\r\n id: subarrayEntity.id,\r\n name: subarrayEntity.name || '',\r\n points: subarrayPoints,\r\n inverters: invertersInSubarray\r\n }\r\n ],\r\n independentInverters: []\r\n };\r\n\r\n return {\r\n success: true,\r\n subarrayCount: 1,\r\n inverterCount: invertersInSubarray.length,\r\n hierarchy: hierarchy\r\n };\r\n\r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to export single subarray:', e);\r\n return {\r\n success: false,\r\n subarrayCount: 0,\r\n inverterCount: 0,\r\n error: String(e)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 导出指定组串的扁平结构\r\n * \r\n * @param inverterEntity - 要导出的组串实体\r\n * @returns 导出结果,包含该组串的扁平结构数据\r\n */\r\n exportSingleInverter(inverterEntity: any): {\r\n success: boolean;\r\n data: {\r\n subarray: Array<any>;\r\n inverter: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n };\r\n error?: string;\r\n } {\r\n try {\r\n const points = this.getEntityLonLatTerrainHeightArray(inverterEntity);\r\n const data = {\r\n subarray: [],\r\n inverter: [\r\n {\r\n id: inverterEntity.id,\r\n name: inverterEntity.name || '',\r\n points: points\r\n }\r\n ]\r\n };\r\n\r\n return {\r\n success: true,\r\n data: data\r\n };\r\n\r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to export single inverter:', e);\r\n return {\r\n success: false,\r\n data: { subarray: [], inverter: [] },\r\n error: String(e)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 从 JSON 数据批量创建多边形(层级结构)\r\n * \r\n * @param data - 层级结构的 JSON 数据\r\n * @param createPolygonFromPointsFn - 创建多边形的函数(由 CZMLManager 提供)\r\n * @returns 创建结果统计\r\n */\r\n importPolygonsFromHierarchy(\r\n data: {\r\n subarrays: Array<{\r\n id: string;\r\n name: string;\r\n oldName?: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n inverters: Array<{\r\n id: string;\r\n name: string;\r\n oldName?: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n }>;\r\n independentInverters: Array<{\r\n id: string;\r\n name: string;\r\n oldName?: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n },\r\n createPolygonFromPointsFn: (params: {\r\n layerName: string;\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }) => any\r\n ): {\r\n success: boolean;\r\n subarrayCount: number;\r\n inverterCount: number;\r\n independentCount: number;\r\n errors: Array<{ type: string; name: string; error: string }>;\r\n } {\r\n const C: any = this.CesiumNS as any;\r\n console.log('[PolygonEditor] 开始从层级数据导入多边形...');\r\n\r\n // 🔧 检查并切换场景模式: 如果是 3D 模式,强制切换为 2D\r\n try {\r\n const scene = (this.viewer as any).scene;\r\n const currentMode = scene.mode;\r\n \r\n if (currentMode === C.SceneMode.SCENE3D) {\r\n scene.mode = C.SceneMode.SCENE2D;\r\n }\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 场景模式切换失败:', e);\r\n }\r\n\r\n let subarrayCount = 0;\r\n let inverterCount = 0;\r\n let independentCount = 0;\r\n const errors: Array<{ type: string; name: string; error: string }> = [];\r\n\r\n \r\n\r\n try {\r\n // 创建子阵及其内部组串\r\n if (data.subarrays && Array.isArray(data.subarrays)) {\r\n for (const subarrayItem of data.subarrays) {\r\n // 创建子阵\r\n try {\r\n const subarrayEntity = createPolygonFromPointsFn({\r\n layerName: 'subarray',\r\n id: subarrayItem.id,\r\n name: subarrayItem.name,\r\n points: subarrayItem.points\r\n });\r\n\r\n if (subarrayEntity) {\r\n subarrayCount++;\r\n }\r\n } catch (err) {\r\n const errorMsg = String(err);\r\n errors.push({ type: 'subarray', name: subarrayItem.name, error: errorMsg });\r\n console.error(`[PolygonEditor] ✗ 创建子阵 ${subarrayItem.name} 失败:`, err);\r\n }\r\n\r\n // 创建子阵内的组串\r\n if (subarrayItem.inverters && Array.isArray(subarrayItem.inverters)) {\r\n for (const inverterItem of subarrayItem.inverters) {\r\n try {\r\n const inverterEntity = createPolygonFromPointsFn({\r\n layerName: 'inverter',\r\n id: inverterItem.id,\r\n name: inverterItem.name,\r\n points: inverterItem.points\r\n });\r\n\r\n if (inverterEntity) {\r\n inverterCount++;\r\n }\r\n } catch (err) {\r\n const errorMsg = String(err);\r\n errors.push({ type: 'inverter', name: inverterItem.name, error: errorMsg });\r\n console.error(`[PolygonEditor] ✗ 创建组串 ${inverterItem.name} 失败:`, err);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 创建独立组串\r\n if (data.independentInverters && Array.isArray(data.independentInverters)) {\r\n for (const inverterItem of data.independentInverters) {\r\n try {\r\n const inverterEntity = createPolygonFromPointsFn({\r\n layerName: 'inverter',\r\n id: inverterItem.id,\r\n name: inverterItem.name,\r\n points: inverterItem.points\r\n });\r\n\r\n if (inverterEntity) {\r\n independentCount++;\r\n }\r\n } catch (err) {\r\n const errorMsg = String(err);\r\n errors.push({ type: 'independent-inverter', name: inverterItem.name, error: errorMsg });\r\n console.error(`[PolygonEditor] ✗ 创建独立组串 ${inverterItem.name} 失败:`, err);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n subarrayCount,\r\n inverterCount,\r\n independentCount,\r\n errors\r\n };\r\n\r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to import hierarchy:', e);\r\n return {\r\n success: false,\r\n subarrayCount,\r\n inverterCount,\r\n independentCount,\r\n errors\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 从 JSON 数据批量创建多边形(扁平结构)\r\n * \r\n * @param data - 扁平结构的 JSON 数据\r\n * @param createPolygonFromPointsFn - 创建多边形的函数(由 CZMLManager 提供)\r\n * @returns 创建结果统计\r\n */\r\n importPolygonsFromFlatStructure(\r\n data: {\r\n subarray: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n inverter: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n },\r\n createPolygonFromPointsFn: (params: {\r\n layerName: string;\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }) => any\r\n ): {\r\n success: boolean;\r\n subarrayCount: number;\r\n inverterCount: number;\r\n errors: Array<{ type: string; name: string; error: string }>;\r\n } {\r\n let subarrayCount = 0;\r\n let inverterCount = 0;\r\n const errors: Array<{ type: string; name: string; error: string }> = [];\r\n\r\n try {\r\n // 创建 subarray 多边形\r\n if (data.subarray && Array.isArray(data.subarray)) {\r\n for (const item of data.subarray) {\r\n try {\r\n const entity = createPolygonFromPointsFn({\r\n layerName: 'subarray',\r\n id: item.id,\r\n name: item.name,\r\n points: item.points\r\n });\r\n\r\n if (entity) {\r\n subarrayCount++;\r\n }\r\n } catch (err) {\r\n const errorMsg = String(err);\r\n errors.push({ type: 'subarray', name: item.name, error: errorMsg });\r\n console.error(`[PolygonEditor] ✗ 创建 subarray ${item.name} 失败:`, err);\r\n }\r\n }\r\n }\r\n\r\n // 创建 inverter 多边形\r\n if (data.inverter && Array.isArray(data.inverter)) {\r\n for (const item of data.inverter) {\r\n try {\r\n const entity = createPolygonFromPointsFn({\r\n layerName: 'inverter',\r\n id: item.id,\r\n name: item.name,\r\n points: item.points\r\n });\r\n\r\n if (entity) {\r\n inverterCount++;\r\n }\r\n } catch (err) {\r\n const errorMsg = String(err);\r\n errors.push({ type: 'inverter', name: item.name, error: errorMsg });\r\n console.error(`[PolygonEditor] ✗ 创建 inverter ${item.name} 失败:`, err);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n subarrayCount,\r\n inverterCount,\r\n errors\r\n };\r\n\r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to import flat structure:', e);\r\n return {\r\n success: false,\r\n subarrayCount,\r\n inverterCount,\r\n errors\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 更新多边形实体的类型、颜色和标签\r\n * @param entity 要更新的多边形实体\r\n * @param newType 新的类型 ('subarray' | 'inverter' | 'astrict' | 'rail' | 'feature')\r\n * @param customName 可选的自定义名称\r\n * @returns 更新结果\r\n */\r\n updatePolygonTypeAndStyle(\r\n entity: Cesium.Entity,\r\n newType: string,\r\n customName?: string\r\n ): {\r\n success: boolean;\r\n message: string;\r\n oldType?: string;\r\n newType?: string;\r\n oldName?: string;\r\n newName?: string;\r\n } {\r\n try {\r\n // 验证实体是否有 polygon 属性\r\n \r\n // 保存旧的类型和名称\r\n const oldType = (entity as any).type || 'unknown';\r\n const oldName = entity.name || entity.id;\r\n\r\n // 获取实体所在的 DataSource\r\n let dataSource: Cesium.CustomDataSource | null = null;\r\n const dataSources = this.viewer.dataSources;\r\n for (let i = 0; i < dataSources.length; i++) {\r\n const ds: any = dataSources.get(i);\r\n if (ds && ds.entities && ds.entities.contains(entity)) {\r\n dataSource = ds;\r\n break;\r\n }\r\n }\r\n\r\n if (!dataSource) {\r\n return {\r\n success: false,\r\n message: '无法找到实体所在的图层'\r\n };\r\n }\r\n\r\n // 获取新类型的颜色配置\r\n const colors = this.getColorConfig(newType);\r\n\r\n const hasPolygon = !!(entity as any).polygon;\r\n const hasEllipse = !!(entity as any).ellipse;\r\n\r\n if (hasEllipse) {\r\n // 更新圆形边框颜色\r\n if(entity.ellipse){\r\n entity.ellipse.outlineColor = colors.lineFinalColor;\r\n // 更新圆形填充颜色\r\n entity.ellipse.material = colors.faceFinalColor;\r\n }\r\n \r\n \r\n }else if (hasPolygon) {\r\n // 更新多边形边框颜色\r\n if(entity.polygon){\r\n entity.polygon.outlineColor = colors.lineFinalColor;\r\n // 更新多边形填充颜色\r\n entity.polygon.material = colors.faceFinalColor;\r\n }\r\n \r\n }\r\n // 更新多边形的填充颜色和轮廓线颜色\r\n\r\n // 更新轮廓线颜色 (查找同 ID 的 outline 实体,使用虚线材质)\r\n const outlineId = `${entity.id}-outline`;\r\n const outlineEntity = dataSource.entities.getById(outlineId);\r\n if (outlineEntity && outlineEntity.polyline) {\r\n // 应用虚线样式(使用公用方法)\r\n this.applyDashedOutlineStyle(outlineEntity, colors.lineFinalColor, 3, 10);\r\n }\r\n\r\n // 更新 type 属性\r\n (entity as any).type = newType;\r\n\r\n // 更新名称\r\n let newName = customName;\r\n if (newName) {\r\n entity.name = newType+\"-\" + newName;\r\n\r\n // 更新标签文本 (查找同 ID 的 label 实体)\r\n const labelId = `${entity.id}-label`;\r\n const labelEntity = dataSource.entities.getById(labelId);\r\n if (labelEntity && labelEntity.label) {\r\n labelEntity.label.text = new this.CesiumNS.ConstantProperty(customName);\r\n labelEntity.label.fillColor = colors.lineFinalColor;\r\n }\r\n }\r\n\r\n \r\n\r\n return {\r\n success: true,\r\n message: '多边形类型和样式更新成功',\r\n oldType,\r\n newType,\r\n oldName,\r\n newName\r\n };\r\n\r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to update polygon type and style:', e);\r\n return {\r\n success: false,\r\n message: `更新失败: ${e}`\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 开始圆形绘制\r\n * 用户流程:\r\n * 1. 左键点击确定圆心\r\n * 2. 移动鼠标动态调整半径\r\n * 3. 再次左键点击确定半径,完成绘制\r\n * 4. 或右键/ESC取消绘制\r\n * \r\n * @param layer 图层对象 (使用 'other' 类型的 DataSource)\r\n * @param onComplete 绘制完成回调函数\r\n * @returns 返回绘制会话对象,包含 stop() 方法\r\n */\r\n startCircleDrawing(\r\n layer?: Cesium.CustomDataSource,\r\n onComplete?: (entity: Cesium.Entity) => void,\r\n ): { stop: () => void } {\r\n const C: any = this.CesiumNS as any;\r\n \r\n // 验证图层\r\n if (layer == null) {\r\n console.warn('[PolygonEditor.startCircleDrawing] layer is null, return without starting drawing.');\r\n return { stop: () => {} };\r\n }\r\n \r\n // 获取 'other' 类型的颜色配置\r\n const colors = this.getColorConfig('other');\r\n const line_color = colors.lineColor;\r\n const line_fina_color = colors.lineFinalColor;\r\n const face_color = colors.faceColor;\r\n const face_fina_color = colors.faceFinalColor;\r\n const point_color = colors.pointColor;\r\n \r\n // 生成名称: circle_01, circle_02, ...\r\n const circleCount = layer.entities.values.filter((e: any) => e.ellipse).length;\r\n const nameStr = `circle_${(circleCount + 1).toString().padStart(2, '0')}`;\r\n \r\n // 清除所有多边形的高亮状态\r\n this.clearAllPolygonHighlights();\r\n \r\n // 重置绘制状态\r\n this.stopInternal();\r\n this.disableDoubleClickZoom();\r\n \r\n // 圆形绘制状态\r\n let centerPosition: any = null; // 圆心位置 (Cartesian3)\r\n let currentRadius = 0; // 当前半径 (米)\r\n let tempCenterPoint: Cesium.Entity | undefined; // 临时圆心标记\r\n let tempCircle: Cesium.Entity | undefined; // 临时圆形实体\r\n let tempRadiusLabel: Cesium.Entity | undefined; // 半径标签\r\n \r\n // 创建鼠标事件处理器\r\n this.handler = new C.ScreenSpaceEventHandler(this.viewer.scene.canvas);\r\n \r\n // 阶段标记: 'selectCenter' | 'selectRadius'\r\n let phase: 'selectCenter' | 'selectRadius' = 'selectCenter';\r\n \r\n // 左键点击事件\r\n this.handler && this.handler.setInputAction(\r\n (movement: any) => {\r\n try {\r\n // 拾取位置\r\n let position: any;\r\n try {\r\n position = (this.viewer.scene as any).pickPosition(movement.position);\r\n } catch {}\r\n if (!position) {\r\n position = (this.viewer.camera as any).pickEllipsoid(\r\n movement.position,\r\n (this.viewer.scene as any).globe.ellipsoid,\r\n );\r\n }\r\n if (!position) {\r\n console.warn('[PolygonEditor.startCircleDrawing] 无法拾取位置');\r\n return;\r\n }\r\n \r\n // 阶段1: 选择圆心\r\n if (phase === 'selectCenter') {\r\n centerPosition = position;\r\n \r\n // 创建圆心标记点\r\n tempCenterPoint = layer.entities.add({\r\n position: centerPosition,\r\n point: {\r\n pixelSize: 8,\r\n color: point_color,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n \r\n // 创建动态圆形实体\r\n tempCircle = layer.entities.add({\r\n position: centerPosition,\r\n ellipse: {\r\n semiMajorAxis: this.makeCallback(() => currentRadius),\r\n semiMinorAxis: this.makeCallback(() => currentRadius),\r\n material: face_color,\r\n outline: true,\r\n outlineColor: line_color,\r\n outlineWidth: 1,\r\n height: 0,\r\n heightReference: C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n } as any);\r\n \r\n // 创建半径标签\r\n tempRadiusLabel = layer.entities.add({\r\n position: this.makeCallback(() => {\r\n if (!centerPosition) return centerPosition;\r\n // 标签位置在圆心右上方\r\n const carto = C.Cartographic.fromCartesian(centerPosition);\r\n const offset = currentRadius * 0.3; // 偏移30%半径\r\n const labelCarto = new C.Cartographic(\r\n carto.longitude + offset / 6378137, // 简单的经度偏移\r\n carto.latitude + offset / 6378137, // 简单的纬度偏移\r\n carto.height\r\n );\r\n return C.Cartesian3.fromRadians(\r\n labelCarto.longitude,\r\n labelCarto.latitude,\r\n labelCarto.height\r\n );\r\n }),\r\n label: {\r\n text: '',\r\n font: 'bold 16px Microsoft YaHei',\r\n fillColor: colors.lineFinalColor,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n style: C.LabelStyle.FILL_AND_OUTLINE,\r\n pixelOffset: new C.Cartesian2(0, -10),\r\n heightReference: C.HeightReference.CLAMP_TO_GROUND,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n } as any);\r\n \r\n phase = 'selectRadius';\r\n } \r\n // 阶段2: 确定半径,完成绘制\r\n else if (phase === 'selectRadius') {\r\n finishCircleDrawing();\r\n }\r\n } catch (e) {\r\n console.error('[PolygonEditor.startCircleDrawing] 左键点击处理失败:', e);\r\n }\r\n },\r\n (C as any).ScreenSpaceEventType.LEFT_CLICK,\r\n );\r\n \r\n // 鼠标移动事件: 动态更新半径\r\n this.handler && this.handler.setInputAction(\r\n (movement: any) => {\r\n try {\r\n // 只在选择半径阶段响应鼠标移动\r\n if (phase !== 'selectRadius' || !centerPosition) return;\r\n \r\n // 拾取鼠标位置\r\n let position: any;\r\n try {\r\n position = (this.viewer.scene as any).pickPosition(movement.endPosition);\r\n } catch {}\r\n if (!position) {\r\n position = (this.viewer.camera as any).pickEllipsoid(\r\n movement.endPosition,\r\n (this.viewer.scene as any).globe.ellipsoid,\r\n );\r\n }\r\n if (!position) return;\r\n \r\n // 计算圆心到鼠标位置的距离作为半径\r\n const distance = C.Cartesian3.distance(centerPosition, position);\r\n currentRadius = Math.max(1, distance); // 最小半径 1 米\r\n \r\n } catch (e) {\r\n console.error('[PolygonEditor.startCircleDrawing] 鼠标移动处理失败:', e);\r\n }\r\n },\r\n (C as any).ScreenSpaceEventType.MOUSE_MOVE,\r\n );\r\n \r\n // 完成圆形绘制的函数\r\n const finishCircleDrawing = () => {\r\n try {\r\n if (!centerPosition || currentRadius <= 0) {\r\n console.warn('[PolygonEditor.startCircleDrawing] 圆心或半径无效');\r\n cleanupAndStop();\r\n return;\r\n }\r\n \r\n // 生成唯一 ID\r\n // const timestamp = Date.now();\r\n // const id = `circle-${timestamp}`;\r\n const id = this.generateUniqueId();\r\n \r\n // 创建正式的圆形实体(不显示轮廓线,因为要用虚线 polyline 代替)\r\n const entity = layer.entities.add({\r\n id,\r\n name: '',\r\n name_str: nameStr,\r\n shape: 'circle',\r\n type: 'other',\r\n position: centerPosition,\r\n ellipse: {\r\n semiMajorAxis: currentRadius,\r\n semiMinorAxis: currentRadius,\r\n material: face_fina_color,\r\n outline: false, // 不显示实体自带的轮廓线\r\n height: 0,\r\n heightReference: C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n properties: {\r\n _type: 'circle',\r\n radius: currentRadius,\r\n },\r\n } as any);\r\n \r\n // 设置类型属性\r\n (entity as any).type = 'other';\r\n \r\n // 创建圆形虚线轮廓(使用 polyline 模拟圆形轮廓)\r\n // 生成圆周上的点(64个点,形成平滑的圆)\r\n const numPoints = 64;\r\n const circlePositions: any[] = [];\r\n const carto = C.Cartographic.fromCartesian(centerPosition);\r\n \r\n for (let i = 0; i <= numPoints; i++) {\r\n const angle = (i / numPoints) * 2 * Math.PI;\r\n // 使用简单的球面几何计算圆周上的点\r\n const dx = currentRadius * Math.cos(angle);\r\n const dy = currentRadius * Math.sin(angle);\r\n \r\n // 将偏移量转换为经纬度偏移(简化算法,适用于小范围)\r\n const earthRadius = 6378137; // 地球半径(米)\r\n const dLon = dx / (earthRadius * Math.cos(carto.latitude));\r\n const dLat = dy / earthRadius;\r\n \r\n const pointCarto = new C.Cartographic(\r\n carto.longitude + dLon,\r\n carto.latitude + dLat,\r\n carto.height\r\n );\r\n \r\n circlePositions.push(C.Cartesian3.fromRadians(\r\n pointCarto.longitude,\r\n pointCarto.latitude,\r\n pointCarto.height\r\n ));\r\n }\r\n \r\n // 创建虚线轮廓线实体\r\n const outlineEntity = layer.entities.add({\r\n id: `${id}-outline`,\r\n polyline: {\r\n positions: circlePositions,\r\n width: 1,\r\n material: line_fina_color,\r\n clampToGround: true,\r\n },\r\n properties: {\r\n _ownerId: id,\r\n _type: 'circle-outline',\r\n },\r\n } as any);\r\n \r\n // 应用虚线样式\r\n if (outlineEntity) {\r\n this.applyDashedOutlineStyle(outlineEntity, line_fina_color, 3, 10);\r\n }\r\n \r\n // 创建标签 (显示名称和半径)\r\n this.createLabelEntity(\r\n layer,\r\n id,\r\n centerPosition,\r\n ``,\r\n line_fina_color\r\n );\r\n \r\n // 清理临时实体\r\n cleanupAndStop();\r\n \r\n // 调用完成回调\r\n this.finalizePolygonSession(layer, onComplete, entity);\r\n \r\n } catch (e) {\r\n console.error('[PolygonEditor.startCircleDrawing] 完成绘制失败:', e);\r\n cleanupAndStop();\r\n }\r\n };\r\n \r\n // 取消绘制的函数\r\n const cancelCircleDrawing = () => {\r\n cleanupAndStop();\r\n };\r\n \r\n // 清理临时实体并停止绘制\r\n const cleanupAndStop = () => {\r\n try {\r\n if (tempCenterPoint) layer.entities.remove(tempCenterPoint);\r\n if (tempCircle) layer.entities.remove(tempCircle);\r\n if (tempRadiusLabel) layer.entities.remove(tempRadiusLabel);\r\n } catch (e) {\r\n console.warn('[PolygonEditor.startCircleDrawing] 清理临时实体失败:', e);\r\n }\r\n \r\n tempCenterPoint = undefined;\r\n tempCircle = undefined;\r\n tempRadiusLabel = undefined;\r\n centerPosition = null;\r\n currentRadius = 0;\r\n \r\n this.destroyHandler();\r\n this.removeKeyboardListener();\r\n this.restoreDoubleClickZoom();\r\n };\r\n \r\n // 右键点击: 取消绘制\r\n this.handler && this.handler.setInputAction(\r\n cancelCircleDrawing,\r\n (C as any).ScreenSpaceEventType.RIGHT_CLICK,\r\n );\r\n \r\n // 键盘监听: ESC 或 X 键取消绘制\r\n this.setupKeyboardListener(cancelCircleDrawing);\r\n \r\n return {\r\n stop: () => {\r\n cancelCircleDrawing();\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * 开始点标记绘制\r\n * 用户流程:\r\n * 1. 左键点击地图添加点标记\r\n * 2. 可连续点击添加多个点\r\n * 3. 右键或 ESC 结束绘制\r\n * \r\n * @param layer 图层对象 (使用 'other' 类型的 DataSource)\r\n * @param iconSvg SVG 图标的 data URL 或路径\r\n * @param onComplete 每次添加点时的回调函数(可选)\r\n * @returns 返回绘制会话对象,包含 stop() 方法\r\n */\r\n startPointDrawing(\r\n layer?: Cesium.CustomDataSource,\r\n iconSvg?: string,\r\n onComplete?: (entity: Cesium.Entity) => void,\r\n ): { stop: () => void } {\r\n const C: any = this.CesiumNS as any;\r\n \r\n // 验证图层\r\n if (layer == null) {\r\n console.warn('[PolygonEditor.startPointDrawing] layer is null, return without starting drawing.');\r\n return { stop: () => {} };\r\n }\r\n \r\n // 获取 'other' 类型的颜色配置\r\n const colors = this.getColorConfig('other');\r\n const line_fina_color = colors.lineFinalColor;\r\n \r\n // 清除所有多边形的高亮状态\r\n this.clearAllPolygonHighlights();\r\n \r\n // 重置绘制状态\r\n this.stopInternal();\r\n this.disableDoubleClickZoom();\r\n \r\n // 点标记计数器(用于生成名称)\r\n let pointCount = 0;\r\n \r\n // 存储已添加的点实体\r\n // const addedPoints: Cesium.Entity[] = [];\r\n \r\n // 创建鼠标事件处理器\r\n this.handler = new C.ScreenSpaceEventHandler(this.viewer.scene.canvas);\r\n \r\n // 左键点击事件:添加点标记\r\n this.handler && this.handler.setInputAction(\r\n (movement: any) => {\r\n try {\r\n // 拾取位置\r\n let position: any;\r\n try {\r\n position = (this.viewer.scene as any).pickPosition(movement.position);\r\n } catch {}\r\n if (!position) {\r\n position = (this.viewer.camera as any).pickEllipsoid(\r\n movement.position,\r\n (this.viewer.scene as any).globe.ellipsoid,\r\n );\r\n }\r\n if (!position) {\r\n console.warn('[PolygonEditor.startPointDrawing] 无法拾取位置');\r\n return;\r\n }\r\n \r\n // 转换为经纬度\r\n const carto = C.Cartographic.fromCartesian(position);\r\n const lon = C.Math.toDegrees(carto.longitude);\r\n const lat = C.Math.toDegrees(carto.latitude);\r\n const height = carto.height;\r\n \r\n // 生成名称\r\n pointCount++;\r\n const currentPointCount = layer.entities.values.filter((e: any) => \r\n e.billboard && e.properties?._type?.getValue() === 'point-marker'\r\n ).length;\r\n const nameStr = `point_${(currentPointCount + 1).toString().padStart(2, '0')}`;\r\n \r\n // 生成唯一 ID\r\n const id = this.generateUniqueId();\r\n \r\n // 检查是否是 2D 模式\r\n const is2DMode = this.viewer.scene.mode === C.SceneMode.SCENE2D;\r\n \r\n // 创建点标记实体\r\n const entity = layer.entities.add({\r\n id,\r\n name: '',\r\n name_str: nameStr,\r\n shape: 'point',\r\n type: 'feature_point',\r\n position: C.Cartesian3.fromDegrees(lon, lat, 0),\r\n billboard: {\r\n image: iconSvg || '', // 使用传入的 SVG 图标\r\n width: 25,\r\n height: 25,\r\n verticalOrigin: is2DMode ? C.VerticalOrigin.CENTER : C.VerticalOrigin.BOTTOM,\r\n heightReference: is2DMode ? C.HeightReference.NONE : C.HeightReference.CLAMP_TO_GROUND,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: {\r\n _type: 'point-marker',\r\n lon,\r\n lat,\r\n height,\r\n },\r\n } as any);\r\n \r\n \r\n // 创建标签(显示名称)- 点标记需要更高的位置\r\n // 不使用 createLabelEntity,因为它的偏移量太小\r\n try {\r\n layer.entities.add({\r\n id: `${id}-label`,\r\n name: 'Point Label',\r\n position: position,\r\n label: {\r\n text: ``,\r\n font: 'bold 16px Microsoft YaHei, SimHei, sans-serif',\r\n fillColor: line_fina_color,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n style: C.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n // 点标记图标高度 45px,标签需要在图标上方,所以偏移更大\r\n pixelOffset: new C.Cartesian2(0, -30), // 原来 -10,现在 -55\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n heightReference: is2DMode ? C.HeightReference.NONE : C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n properties: { _ownerId: id, _type: 'point-label' },\r\n } as any);\r\n } catch (e) {\r\n console.warn('[PolygonEditor.startPointDrawing] 创建标签失败:', e);\r\n }\r\n \r\n // 存储点实体\r\n // addedPoints.push(entity);\r\n \r\n // 调用完成回调(每添加一个点就调用一次)\r\n if (onComplete) {\r\n try {\r\n onComplete(entity);\r\n } catch (e) {\r\n console.warn('[PolygonEditor.startPointDrawing] 回调执行失败:', e);\r\n }\r\n }\r\n \r\n } catch (e) {\r\n console.error('[PolygonEditor.startPointDrawing] 左键点击处理失败:', e);\r\n }\r\n },\r\n (C as any).ScreenSpaceEventType.LEFT_CLICK,\r\n );\r\n \r\n // 停止绘制的函数\r\n const stopPointDrawing = () => {\r\n this.destroyHandler();\r\n this.removeKeyboardListener();\r\n this.restoreDoubleClickZoom();\r\n };\r\n \r\n // 右键点击: 结束绘制\r\n this.handler && this.handler.setInputAction(\r\n stopPointDrawing,\r\n (C as any).ScreenSpaceEventType.RIGHT_CLICK,\r\n );\r\n \r\n // 键盘监听: ESC 或 X 键结束绘制\r\n this.setupKeyboardListener(stopPointDrawing);\r\n \r\n return {\r\n stop: () => {\r\n stopPointDrawing();\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * 从 JSON 数据加载多边形、圆形和特征点到 other 图层\r\n * @param data JSON 数据,包含 astrict, rail, feature, feature_point 数组\r\n * @returns 加载结果统计\r\n */\r\n loadOtherLayerFromJson(data: {\r\n astrict?: Array<any>;\r\n rail?: Array<any>;\r\n feature?: Array<any>;\r\n feature_point?: Array<any>;\r\n }): {\r\n success: boolean;\r\n message: string;\r\n stats: {\r\n astrict: number;\r\n rail: number;\r\n feature: number;\r\n feature_point: number;\r\n total: number;\r\n };\r\n } {\r\n const C: any = this.CesiumNS as any;\r\n \r\n try {\r\n // 获取或创建 other 图层\r\n let otherLayer = this.viewer.dataSources.getByName('other')[0] as any;\r\n if (!otherLayer) {\r\n otherLayer = new (C as any).CustomDataSource('other');\r\n this.viewer.dataSources.add(otherLayer);\r\n }\r\n \r\n const stats = {\r\n astrict: 0,\r\n rail: 0,\r\n feature: 0,\r\n feature_point: 0,\r\n total: 0\r\n };\r\n \r\n // 检测当前场景模式\r\n const is2DMode = this.viewer.scene.mode === C.SceneMode.SCENE2D;\r\n \r\n // 加载 astrict (多边形或圆形)\r\n if (data.astrict && Array.isArray(data.astrict)) {\r\n data.astrict.forEach((item: any) => {\r\n try {\r\n if (item.shape === 'circle' && item.points && item.points[0]?.radius) {\r\n // 圆形: points[0] 包含圆心坐标和半径\r\n this.loadCircleEntity(otherLayer, item, 'astrict', is2DMode);\r\n } else if (item.shape === 'polygon') {\r\n // 多边形: points 是多个坐标点\r\n this.loadPolygonEntity(otherLayer, item, 'astrict', is2DMode);\r\n }\r\n stats.astrict++;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 加载 astrict 实体失败:', item.id, e);\r\n }\r\n });\r\n }\r\n \r\n // 加载 rail (多边形或圆形)\r\n if (data.rail && Array.isArray(data.rail)) {\r\n data.rail.forEach((item: any) => {\r\n try {\r\n if (item.shape === 'circle' && item.points && item.points[0]?.radius) {\r\n // 圆形: points[0] 包含圆心坐标和半径\r\n this.loadCircleEntity(otherLayer, item, 'rail', is2DMode);\r\n } else if (item.shape === 'polygon') {\r\n // 多边形: points 是多个坐标点\r\n this.loadPolygonEntity(otherLayer, item, 'rail', is2DMode);\r\n }\r\n stats.rail++;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 加载 rail 实体失败:', item.id, e);\r\n }\r\n });\r\n }\r\n \r\n // 加载 feature (多边形或圆形)\r\n if (data.feature && Array.isArray(data.feature)) {\r\n data.feature.forEach((item: any) => {\r\n try {\r\n if (item.shape === 'circle' && item.points && item.points[0]?.radius) {\r\n // 圆形: points[0] 包含圆心坐标和半径\r\n this.loadCircleEntity(otherLayer, item, 'feature', is2DMode);\r\n } else if (item.shape === 'polygon') {\r\n // 多边形: points 是多个坐标点\r\n this.loadPolygonEntity(otherLayer, item, 'feature', is2DMode);\r\n }\r\n stats.feature++;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 加载 feature 实体失败:', item.id, e);\r\n }\r\n });\r\n }\r\n \r\n // 加载 feature_point 特征点\r\n if (data.feature_point && Array.isArray(data.feature_point)) {\r\n data.feature_point.forEach((item: any) => {\r\n try {\r\n this.loadPointEntity(otherLayer, item, 'feature_point', is2DMode);\r\n stats.feature_point++;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 加载 feature_point 实体失败:', item.id, e);\r\n }\r\n });\r\n }\r\n \r\n stats.total = stats.astrict + stats.rail + stats.feature + stats.feature_point;\r\n \r\n return {\r\n success: true,\r\n message: '加载成功',\r\n stats\r\n };\r\n \r\n } catch (e) {\r\n console.error('[PolygonEditor.loadOtherLayerFromJson] ❌ 加载失败:', e);\r\n return {\r\n success: false,\r\n message: `加载失败: ${e}`,\r\n stats: {\r\n astrict: 0,\r\n rail: 0,\r\n feature: 0,\r\n feature_point: 0,\r\n total: 0\r\n }\r\n };\r\n }\r\n }\r\n \r\n /**\r\n * 加载多边形实体 (复用代码)\r\n */\r\n private loadPolygonEntity(\r\n layer: any,\r\n item: any,\r\n type: string,\r\n is2DMode: boolean\r\n ): void {\r\n const C: any = this.CesiumNS as any;\r\n \r\n // 转换坐标点\r\n const positions: any[] = [];\r\n if (item.points && Array.isArray(item.points)) {\r\n item.points.forEach((point: any) => {\r\n const position = C.Cartesian3.fromDegrees(\r\n point.lon,\r\n point.lat,\r\n point.height || 0\r\n );\r\n positions.push(position);\r\n });\r\n }\r\n \r\n if (positions.length < 3) {\r\n throw new Error('多边形至少需要3个点');\r\n }\r\n \r\n // 获取颜色配置\r\n const colors = this.getColorConfig(type);\r\n \r\n // 生成唯一 ID\r\n const id = item.id || `${type}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n const nameStr = item.name || '';\r\n \r\n // 创建多边形实体\r\n layer.entities.add({\r\n id,\r\n name_str: nameStr,\r\n name: '',\r\n shape: item.shape || 'polygon',\r\n type: type,\r\n checked: false,\r\n polygon: {\r\n hierarchy: positions,\r\n material: colors.faceFinalColor,\r\n outline: false,\r\n heightReference: is2DMode ? C.HeightReference.NONE : C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n } as any);\r\n \r\n // 创建轮廓线\r\n // const outlineId = `${id}-outline`;\r\n const outlineEntity = this.createOutlineEntity(layer, id, positions, colors.lineFinalColor, false);\r\n this.applyDashedOutlineStyle(outlineEntity, colors.lineFinalColor, 3, 10);\r\n // 创建标签 (使用第一个点作为标签位置)\r\n const labelPosition = positions[0];\r\n this.createLabelEntity(layer, id, labelPosition, nameStr, colors.lineFinalColor);\r\n }\r\n \r\n /**\r\n * 加载圆形实体 (复用代码)\r\n * 圆形数据格式: points[0] 包含 {lon, lat, height, radius}\r\n */\r\n private loadCircleEntity(\r\n layer: any,\r\n item: any,\r\n type: string,\r\n is2DMode: boolean\r\n ): void {\r\n const C: any = this.CesiumNS as any;\r\n \r\n // 从 points[0] 获取圆心坐标和半径\r\n if (!item.points || !item.points[0] || !item.points[0].radius) {\r\n throw new Error('圆形缺少 points[0] 或 radius');\r\n }\r\n \r\n const centerData = item.points[0];\r\n const radius = centerData.radius;\r\n \r\n // 获取颜色配置\r\n const colors = this.getColorConfig(type);\r\n \r\n // 生成唯一 ID\r\n const id = item.id || `${type}-circle-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n const nameStr = item.name || '';\r\n \r\n // 中心点位置\r\n const centerPosition = C.Cartesian3.fromDegrees(\r\n centerData.lon,\r\n centerData.lat,\r\n centerData.height || 0\r\n );\r\n \r\n // 创建圆形实体\r\n // 注意: 圆形不支持贴地轮廓线,所以使用单独的 polyline 绘制轮廓\r\n layer.entities.add({\r\n id,\r\n name_str: nameStr,\r\n name: '',\r\n shape: 'circle',\r\n type: type,\r\n position: centerPosition,\r\n ellipse: {\r\n semiMajorAxis: radius,\r\n semiMinorAxis: radius, // 相等半径 = 圆形\r\n height: centerData.height || 0, // 明确设置 height 避免警告\r\n material: colors.faceFinalColor,\r\n outline: false, // 圆形贴地时不支持轮廓线\r\n heightReference: is2DMode ? C.HeightReference.NONE : C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n properties: {\r\n radius: radius\r\n }\r\n } as any);\r\n \r\n // 创建圆形轮廓线 (使用 polyline 模拟圆形)\r\n try {\r\n const outlinePositions: any[] = [];\r\n const segments = 64; // 圆形分段数,越大越圆滑\r\n for (let i = 0; i <= segments; i++) {\r\n const angle = (i / segments) * 2 * Math.PI;\r\n const dx = radius * Math.cos(angle);\r\n const dy = radius * Math.sin(angle);\r\n \r\n // 计算圆周上的点\r\n const carto = C.Cartographic.fromCartesian(centerPosition);\r\n const lon = carto.longitude;\r\n const lat = carto.latitude;\r\n \r\n // 简单的平面近似 (适用于小范围)\r\n const earthRadius = 6378137.0; // 地球半径(米)\r\n const dLon = dx / (earthRadius * Math.cos(lat));\r\n const dLat = dy / earthRadius;\r\n \r\n const pointPosition = C.Cartesian3.fromRadians(\r\n lon + dLon,\r\n lat + dLat,\r\n centerData.height || 0\r\n );\r\n outlinePositions.push(pointPosition);\r\n }\r\n\r\n const outlineEntity = layer.entities.add({\r\n id: `${id}-outline`,\r\n name: 'Circle Outline',\r\n polyline: {\r\n positions: outlinePositions,\r\n width:1,\r\n material: colors.lineFinalColor,\r\n clampToGround: !is2DMode,\r\n },\r\n properties: { _ownerId: id, _type: 'circle-outline' },\r\n } as any);\r\n\r\n this.applyDashedOutlineStyle(outlineEntity, colors.lineFinalColor, 3, 10);\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 创建圆形轮廓线失败:', e);\r\n }\r\n \r\n // 创建标签\r\n // 创建标签 (使用第一个点作为标签位置)\r\n this.createLabelEntity(layer, id, centerPosition, nameStr, colors.lineFinalColor);\r\n \r\n }\r\n \r\n /**\r\n * 加载特征点实体 (复用代码)\r\n */\r\n private loadPointEntity(\r\n layer: any,\r\n item: any,\r\n type: string,\r\n is2DMode: boolean\r\n ): void {\r\n const C: any = this.CesiumNS as any;\r\n \r\n if (!item.position) {\r\n throw new Error('特征点缺少 position');\r\n }\r\n \r\n // 获取颜色配置\r\n const colors = this.getColorConfig('feature');\r\n \r\n // 生成唯一 ID\r\n const id = item.id || `${this.generateUniqueId()}`;\r\n const nameStr = item.name || '';\r\n \r\n // 点位置\r\n const position = C.Cartesian3.fromDegrees(\r\n item.position.lon,\r\n item.position.lat,\r\n item.position.height || 0\r\n );\r\n \r\n // 使用 point_marker SVG 图标 (Data URL 格式避免路径问题)\r\n const svgContent = '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"15.9998779296875\" height=\"12.673858642578125\" viewBox=\"0 0 15.9998779296875 12.673858642578125\" fill=\"none\"><path d=\"M0 0L15.9999 0L7.99993 12.6739L0 0Z\" fill-rule=\"evenodd\" style=\"mix-blend-mode:normal\" fill=\"url(#linear_fill_127_1042)\" ></path><defs><linearGradient id=\"linear_fill_127_1042\" x1=\"8.0037841796875\" y1=\"0\" x2=\"8.0037841796875\" y2=\"12.667953491210938\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#4098FF\" /><stop offset=\"0.49000000953674316\" stop-color=\"#3FFBFB\" /><stop offset=\"0.8550000190734863\" stop-color=\"#FFFFFF\" /></linearGradient></defs></svg>';\r\n const iconSvg = 'data:image/svg+xml;base64,' + btoa(svgContent);\r\n \r\n // 使用 CallbackProperty 动态设置 heightReference,支持 2D/3D 模式切换\r\n const viewer = this.viewer;\r\n \r\n layer.entities.add({\r\n id,\r\n name: '',\r\n name_str: nameStr,\r\n shape: 'point',\r\n type: 'feature_point',\r\n position: position,\r\n billboard: {\r\n image: iconSvg, // 使用 Data URL 格式的 SVG 图标\r\n width: 25,\r\n height: 25,\r\n verticalOrigin: new C.CallbackProperty(() => {\r\n return viewer.scene.mode === C.SceneMode.SCENE2D \r\n ? C.VerticalOrigin.CENTER \r\n : C.VerticalOrigin.BOTTOM;\r\n }, false),\r\n heightReference: new C.CallbackProperty(() => {\r\n return viewer.scene.mode === C.SceneMode.SCENE2D \r\n ? C.HeightReference.NONE \r\n : C.HeightReference.CLAMP_TO_GROUND;\r\n }, false),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: {\r\n _type: 'point-marker',\r\n lon: item.position.lon,\r\n lat: item.position.lat,\r\n height: item.position.height || 0,\r\n },\r\n } as any);\r\n \r\n // 创建标签(显示名称)- 点标记需要更高的位置\r\n try {\r\n layer.entities.add({\r\n id: `${id}-label`,\r\n name: 'Point Label',\r\n position: position,\r\n label: {\r\n text: nameStr,\r\n font: 'bold 16px Microsoft YaHei, SimHei, sans-serif',\r\n fillColor: colors.lineFinalColor,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n style: C.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n // 点标记图标高度 45px,标签需要在图标上方\r\n pixelOffset: new C.Cartesian2(0, -30),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n heightReference: new C.CallbackProperty(() => {\r\n return viewer.scene.mode === C.SceneMode.SCENE2D \r\n ? C.HeightReference.NONE \r\n : C.HeightReference.CLAMP_TO_GROUND;\r\n }, false),\r\n },\r\n properties: { _ownerId: id, _type: 'point-label' },\r\n } as any);\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 创建特征点标签失败:', e);\r\n }\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { globalState } from './StateManager';\r\nimport { toggle2D3D } from './toggle2D3D';\r\nimport {\r\n CZMLPathManager,\r\n type PathSample,\r\n type PathStyleOptions,\r\n} from './CZMLPathManager';\r\nimport { PolygonEditor } from './PolygonEditor';\r\n\r\nexport interface CzmlImportOptions {\r\n // Intentionally empty for now; CzmlDataSource doesn't accept clamp options like KML\r\n}\r\n\r\nexport interface CzmlExportOptions {\r\n name?: string; // Will be used as the CZML document name\r\n}\r\n\r\nexport interface ShapePointProps {\r\n id?: string;\r\n lon: number;\r\n lat: number;\r\n height?: number;\r\n name?: string;\r\n description?: string;\r\n}\r\n\r\nexport interface ShapeLineProps {\r\n id?: string;\r\n coords: Array<[number, number, number?]>; // [lon, lat, height?]\r\n name?: string;\r\n description?: string;\r\n}\r\n\r\nexport interface ShapePolygonProps {\r\n id?: string;\r\n coords: Array<[number, number, number?]>; // outer ring only (simple)\r\n name?: string;\r\n description?: string;\r\n}\r\n\r\ntype Entity = Cesium.Entity;\r\n\r\n// 经纬度 + 地形高 类型(height 为 hTerrain,单位米;保留 3 位小数,若计算为负则置 0;无法获取时为 null)\r\nexport type LonLatHeight = { lon: number; lat: number; height: number | null };\r\n\r\nexport class CZMLManager {\r\n // 选中状态管理(只记录当前选中的实体,不再保存原始材质)\r\n private currentSelectedEntity: Entity | null = null;\r\n private activePolygonSession: { stop: () => void } | null = null;\r\n private polygonSessionCleanup?: () => void;\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Cesium.Viewer,\r\n ) {}\r\n\r\n private _polygonEditor?: any;\r\n private get polygonEditor() {\r\n if (!this._polygonEditor) {\r\n this._polygonEditor = new PolygonEditor(this.CesiumNS, this.viewer);\r\n }\r\n return this._polygonEditor;\r\n }\r\n\r\n // Path manager composition\r\n private _pathMgr?: CZMLPathManager;\r\n private get pathMgr() {\r\n if (!this._pathMgr) this._pathMgr = new CZMLPathManager(this.CesiumNS, this.viewer);\r\n return this._pathMgr;\r\n }\r\n\r\n async importCZML(czml: any | URL, _opts?: CzmlImportOptions) {\r\n const C = this.CesiumNS as any;\r\n const ds = await C.CzmlDataSource.load(czml);\r\n this.viewer.dataSources.add(ds);\r\n return ds;\r\n }\r\n\r\n exportCZML(entities: Entity[] | Cesium.EntityCollection, opts?: CzmlExportOptions): any[] {\r\n const C: any = this.CesiumNS as any;\r\n const now = C.JulianDate.now();\r\n const items: Entity[] = Array.isArray(entities) ? entities : (entities.values as Entity[]);\r\n\r\n const colorToRgba = (color: any, fallback: [number, number, number, number]) => {\r\n if (!color) return fallback;\r\n try {\r\n const c = color.getValue ? color.getValue(now) : color;\r\n const r = Math.round((c.red ?? 1) * 255);\r\n const g = Math.round((c.green ?? 1) * 255);\r\n const b = Math.round((c.blue ?? 1) * 255);\r\n const a = Math.round((c.alpha ?? 1) * 255);\r\n return [r, g, b, a] as [number, number, number, number];\r\n } catch {\r\n return fallback;\r\n }\r\n };\r\n\r\n const res: any[] = [{ id: 'document', name: opts?.name ?? 'Export', version: '1.0' }];\r\n\r\n for (const e of items) {\r\n const id = (e.id as string) || undefined;\r\n const name = (e.name as string) || undefined;\r\n const description = (e.description as any) || undefined;\r\n\r\n // Path entity (SampledPositionProperty + optional PathGraphics)\r\n const czmlFromPath = this.pathMgr.exportEntityToCzml(e, res);\r\n if (czmlFromPath) continue;\r\n\r\n if (e.position?.getValue && (e as any).point) {\r\n const cart = e.position.getValue(now);\r\n if (cart) {\r\n const carto = C.Cartographic.fromCartesian(cart);\r\n const lon = C.Math.toDegrees(carto.longitude);\r\n const lat = C.Math.toDegrees(carto.latitude);\r\n const h = carto.height ?? 0;\r\n const rgba = colorToRgba(e.point?.color, [255, 0, 0, 255]);\r\n res.push({\r\n id: id ?? `point-${Math.random().toString(36).slice(2)}`,\r\n name,\r\n description,\r\n position: { cartographicDegrees: [lon, lat, h] },\r\n point: { pixelSize: e.point?.pixelSize ?? 8, color: { rgba } },\r\n });\r\n }\r\n } else if (e.polyline?.positions?.getValue) {\r\n const arr = e.polyline.positions.getValue(now) as any[];\r\n if (arr && arr.length > 1) {\r\n const coords: number[] = [];\r\n for (const c of arr) {\r\n const carto = C.Cartographic.fromCartesian(c);\r\n coords.push(\r\n C.Math.toDegrees(carto.longitude),\r\n C.Math.toDegrees(carto.latitude),\r\n carto.height ?? 0,\r\n );\r\n }\r\n const matAny: any = (e.polyline as any)?.material;\r\n const rgba = colorToRgba(matAny?.color ?? matAny, [255, 255, 0, 255]);\r\n const widthProp: any = (e.polyline as any)?.width;\r\n const width = widthProp?.getValue ? widthProp.getValue(now) : (widthProp ?? 2);\r\n res.push({\r\n id: id ?? `line-${Math.random().toString(36).slice(2)}`,\r\n name,\r\n description,\r\n polyline: {\r\n positions: { cartographicDegrees: coords },\r\n width,\r\n material: { solidColor: { color: { rgba } } },\r\n },\r\n });\r\n }\r\n } else if (e.polygon?.hierarchy?.getValue) {\r\n const h = e.polygon.hierarchy.getValue(now) as any;\r\n const positions: any[] = h?.positions ?? h;\r\n if (positions && positions.length >= 3) {\r\n const coords: number[] = [];\r\n for (const c of positions) {\r\n const carto = C.Cartographic.fromCartesian(c);\r\n coords.push(\r\n C.Math.toDegrees(carto.longitude),\r\n C.Math.toDegrees(carto.latitude),\r\n carto.height ?? 0,\r\n );\r\n }\r\n const polyMat: any = (e.polygon as any)?.material;\r\n const rgba = colorToRgba(polyMat?.color ?? polyMat, [0, 255, 255, Math.round(0.4 * 255)]);\r\n res.push({\r\n id: id ?? `poly-${Math.random().toString(36).slice(2)}`,\r\n name,\r\n description,\r\n polygon: {\r\n positions: { cartographicDegrees: coords },\r\n material: { solidColor: { color: { rgba } } },\r\n // Outlines on terrain are tricky; omit here and let consumers style separately if desired\r\n },\r\n });\r\n }\r\n }\r\n }\r\n\r\n return res;\r\n }\r\n\r\n // ===== Path APIs (delegates) =====\r\n /**\r\n * 回显飞航路线:显示完整飞航路线、航点编号和起始点箭头\r\n * \r\n * 接收 Sinofly 航线路数据,自动转换为本库格式并渲染显示。\r\n * 请使用 pathMgr.renderFlightPath() 方法或直接导入 renderFlightPath 函数。\r\n * \r\n * @deprecated 请使用 pathMgr.renderFlightPath() 或直接导入 renderFlightPath 函数\r\n * @param options Sinofly 数据和配置选项\r\n * @returns 创建的 polyline 实体\r\n * \r\n * @example\r\n * ```typescript\r\n * // 推荐方式 1: 使用 pathMgr\r\n * const entity = czmlManager.pathMgr.renderFlightPath(Cesium, viewer, {\r\n * data: sinoflyData\r\n * });\r\n * \r\n * // 推荐方式 2: 直接导入函数\r\n * import { renderFlightPath } from '@jorgmoritz/gis-manager';\r\n * const entity = renderFlightPath(Cesium, viewer, {\r\n * data: sinoflyData\r\n * });\r\n * ```\r\n */\r\n renderFlightPath(options: import('./path-manager/renderFlightPath').RenderFlightPathOptions): Entity {\r\n return this.pathMgr.renderFlightPath(options);\r\n }\r\n\r\n /**\r\n * 预览模式渲染飞航路线:支持航点点击高亮\r\n * \r\n * 与 renderFlightPath 不同,此方法返回一个控制器对象,支持:\r\n * - 航点点击事件回调\r\n * - 程序化设置选中航点(高亮显示)\r\n * - 列表与地图双向联动\r\n * \r\n * @param options 预览选项\r\n * @returns 包含实体和控制器的对象\r\n */\r\n renderFlightPathPreview(\r\n options: import('./path-manager/renderFlightPath').RenderFlightPathPreviewOptions\r\n ): { entity: Entity; controller: import('./path-manager/renderFlightPath').FlightPathPreviewController } {\r\n return this.pathMgr.renderFlightPathPreview(options);\r\n }\r\n\r\n addPathSample(entityOrId: Entity | string, sample: PathSample) {\r\n return this.pathMgr.addPathSample(entityOrId, sample);\r\n }\r\n\r\n addPathSamples(entityOrId: Entity | string, samples: PathSample[]) {\r\n return this.pathMgr.addPathSamples(entityOrId, samples);\r\n }\r\n\r\n setPathSamples(entityOrId: Entity | string, samples: PathSample[]) {\r\n return this.pathMgr.setPathSamples(entityOrId, samples);\r\n }\r\n\r\n clearPathSamples(entityOrId: Entity | string) {\r\n return this.pathMgr.clearPathSamples(entityOrId);\r\n }\r\n\r\n setPathStyle(entityOrId: Entity | string, style: PathStyleOptions) {\r\n return this.pathMgr.setPathStyle(entityOrId, style);\r\n }\r\n\r\n // Interactive path (polyline) drawing & editing delegates\r\n startPathDrawing(\r\n options?: {\r\n layer?: Cesium.CustomDataSource;\r\n idPrefix?: string;\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n },\r\n onComplete?: (entity: Entity) => void,\r\n ) {\r\n return this.pathMgr.startPathDrawing(options, onComplete);\r\n }\r\n\r\n startPathEditing(\r\n entityOrId: Entity | string,\r\n options?: {\r\n layer?: Cesium.CustomDataSource;\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n },\r\n ) {\r\n return this.pathMgr.startPathEditing(entityOrId, options);\r\n }\r\n\r\n addPoint(props: ShapePointProps): Entity {\r\n const C = this.CesiumNS as any;\r\n return this.viewer.entities.add({\r\n id: props.id,\r\n name: props.name,\r\n description: props.description,\r\n position: C.Cartesian3.fromDegrees(props.lon, props.lat, props.height ?? 0),\r\n point: { pixelSize: 8, color: C.Color.RED },\r\n });\r\n }\r\n\r\n addLine(props: ShapeLineProps): Entity {\r\n const C = this.CesiumNS as any;\r\n const positions = props.coords.map(([lon, lat, h]) =>\r\n C.Cartesian3.fromDegrees(lon, lat, h ?? 0),\r\n );\r\n return this.viewer.entities.add({\r\n id: props.id,\r\n name: props.name,\r\n description: props.description,\r\n polyline: { positions, width: 2, material: C.Color.YELLOW },\r\n });\r\n }\r\n\r\n addPolygon(props: ShapePolygonProps): Entity {\r\n // Keep a non-interactive fallback that constructs a polygon entity directly\r\n const C = this.CesiumNS as any;\r\n const positions = props.coords.map(([lon, lat, h]) =>\r\n C.Cartesian3.fromDegrees(lon, lat, h ?? 0),\r\n );\r\n return this.viewer.entities.add({\r\n id: props.id,\r\n name: props.name,\r\n description: props.description,\r\n polygon: {\r\n hierarchy: positions,\r\n material: C.Color.fromCssColorString('rgba(0,255,255,0.4)'),\r\n outline: true,\r\n outlineColor: C.Color.CYAN,\r\n },\r\n } as any);\r\n }\r\n\r\n /**\r\n * 创建一个新的自定义图层用于存放多边形实体。\r\n * @param name 自定义图层名称:string,默认值为'Polygons'\r\n * @returns 自定义图层对象\r\n */\r\n createPolygonLayer(name = 'Polygons'): Cesium.CustomDataSource {\r\n const C: any = this.CesiumNS as any;\r\n const ds = new C.CustomDataSource(name);\r\n this.viewer.dataSources.add(ds);\r\n return ds;\r\n }\r\n\r\n /**\r\n * 多边形绘制会话管理接口,创建一个polygon绘制对话,允许用户通过鼠标交互绘制多边形。\r\n * @param type 图层类型 ('subarray' | 'inverter' | 'other')\r\n * @param onComplete 结果回调函数,参数为新创建的多边形实体\r\n * @returns 返回一个polygon绘制会话对象\r\n */\r\n startPolygonDrawing(\r\n type: string,\r\n onComplete?: (entity: Entity) => void,\r\n ) {\r\n this.ensurePolygonSessionHooks();\r\n this.cancelActivePolygonDrawing('start new polygon drawing');\r\n\r\n // Ensure we are in 2D mode before starting polygon drawing.\r\n // If in 3D, toggle to 2D (with position preservation). If in Columbus View (2.5D), morph to 2D as well.\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const scene: any = (this.viewer as any).scene;\r\n // const cam: any = (this.viewer as any).camera;\r\n const mode = scene?.mode;\r\n\r\n if (mode === C.SceneMode.SCENE3D) {\r\n toggle2D3D(\r\n {\r\n CesiumNS: C,\r\n viewer: this.viewer,\r\n getLastPerspectiveOrientation: () => undefined,\r\n setLastPerspectiveOrientation: () => {},\r\n },\r\n { duration: 0 },\r\n );\r\n } \r\n // else if (mode !== C.SceneMode.SCENE2D) {\r\n // // Columbus View or morphing: do a direct morph to 2D and restore camera to same lon/lat/height\r\n // let captured: { lon: number; lat: number; height: number } | undefined;\r\n // let capturedOri: { heading: number; pitch: number; roll: number } | undefined;\r\n // try {\r\n // const cart = this.CesiumNS.Cartographic.fromCartesian(cam.position);\r\n // captured = {\r\n // lon: this.CesiumNS.Math.toDegrees(cart.longitude),\r\n // lat: this.CesiumNS.Math.toDegrees(cart.latitude),\r\n // height: cart.height,\r\n // };\r\n // capturedOri = {\r\n // heading: cam.heading ?? 0,\r\n // pitch: cam.pitch ?? -0.8,\r\n // roll: cam.roll ?? 0,\r\n // };\r\n // } catch {}\r\n // const onDone = () => {\r\n // try {\r\n // if (captured) {\r\n // const dest = this.CesiumNS.Cartesian3.fromDegrees(\r\n // captured.lon,\r\n // captured.lat,\r\n // Math.max(1, captured.height),\r\n // );\r\n // (this.viewer as any).camera.setView({\r\n // destination: dest,\r\n // orientation: capturedOri,\r\n // } as any);\r\n // }\r\n // } finally {\r\n // scene.morphComplete?.removeEventListener?.(onDone);\r\n // }\r\n // };\r\n // scene.morphComplete?.addEventListener?.(onDone);\r\n // scene.morphTo2D?.(0);\r\n // }\r\n } catch {\r\n // No-op: if anything fails, still try to start drawing\r\n }\r\n\r\n let layer = null;\r\n if(type == 'subarray') {\r\n if(this.viewer.dataSources.getByName('subarray').length < 1){\r\n const data = new this.CesiumNS.CustomDataSource('subarray')\r\n this.viewer.dataSources.add(data);\r\n layer = data;\r\n }else {\r\n layer = this.viewer.dataSources.getByName('subarray')[0];\r\n }\r\n \r\n // 创建或获取 subarray 图层后,确保 inverter 图层(如果存在)始终在最上层\r\n const inverterLayers = this.viewer.dataSources.getByName('inverter');\r\n if (inverterLayers.length > 0) {\r\n const inverterLayer = inverterLayers[0];\r\n const index = this.viewer.dataSources.indexOf(inverterLayer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n // 移除并重新添加到末尾\r\n this.viewer.dataSources.remove(inverterLayer as any, false); // false 表示不销毁\r\n this.viewer.dataSources.add(inverterLayer as any);\r\n }\r\n }\r\n }else if(type == 'inverter') {\r\n if(this.viewer.dataSources.getByName('inverter').length <1) {\r\n const data = new this.CesiumNS.CustomDataSource('inverter')\r\n this.viewer.dataSources.add(data);\r\n layer = data;\r\n }\r\n else {\r\n layer = this.viewer.dataSources.getByName('inverter')[0];\r\n }\r\n \r\n // 确保 inverter 图层始终在最上层(渲染顺序最后)\r\n // 如果 inverter 图层已存在但不在最后位置,将其移到最后\r\n if (layer) {\r\n const index = this.viewer.dataSources.indexOf(layer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n // 移除并重新添加到末尾\r\n this.viewer.dataSources.remove(layer as any, false); // false 表示不销毁\r\n this.viewer.dataSources.add(layer as any);\r\n }\r\n }\r\n }else {\r\n if(this.viewer.dataSources.getByName('other').length <1) {\r\n const data = new this.CesiumNS.CustomDataSource('other')\r\n this.viewer.dataSources.add(data);\r\n layer = data;\r\n }\r\n else {\r\n layer = this.viewer.dataSources.getByName('other')[0];\r\n }\r\n \r\n // 确保 inverter 图层始终在最上层(渲染顺序最后)\r\n // 如果 inverter 图层已存在但不在最后位置,将其移到最后\r\n if (layer) {\r\n const index = this.viewer.dataSources.indexOf(layer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n // 移除并重新添加到末尾\r\n this.viewer.dataSources.remove(layer as any, false); // false 表示不销毁\r\n this.viewer.dataSources.add(layer as any);\r\n }\r\n }\r\n }\r\n\r\n const session = this.polygonEditor.startDrawing(type, layer, (entity: Entity) => {\r\n this.cancelActivePolygonDrawing();\r\n onComplete?.(entity);\r\n });\r\n\r\n if (session && typeof session.stop === 'function') {\r\n this.activePolygonSession = session;\r\n } else {\r\n this.activePolygonSession = null;\r\n }\r\n\r\n return session;\r\n }\r\n\r\n /**\r\n * 圆形绘制会话管理接口,创建一个圆形绘制对话,允许用户通过鼠标交互绘制圆形。\r\n * 使用流程:\r\n * 1. 左键点击确定圆心\r\n * 2. 移动鼠标动态调整半径\r\n * 3. 再次左键点击确定半径,完成绘制\r\n * 4. 或右键/ESC取消绘制\r\n * \r\n * @param onComplete 结果回调函数,参数为新创建的圆形实体\r\n * @returns 返回一个圆形绘制会话对象,包含 stop() 方法\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 startCircleDrawing 方法\r\n */\r\n startCircleDrawing(onComplete?: (entity: Entity) => void): any {\r\n // 确保在 2D 模式下绘制圆形\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const scene: any = (this.viewer as any).scene;\r\n const mode = scene?.mode;\r\n\r\n if (mode === C.SceneMode.SCENE3D) {\r\n // 切换到 2D 模式\r\n toggle2D3D(\r\n {\r\n CesiumNS: C,\r\n viewer: this.viewer,\r\n getLastPerspectiveOrientation: () => undefined,\r\n setLastPerspectiveOrientation: () => {},\r\n },\r\n { duration: 0 },\r\n );\r\n }\r\n } catch (e) {\r\n console.warn('[CZMLManager] 切换到 2D 模式失败:', e);\r\n }\r\n\r\n // 获取或创建 'other' 图层\r\n let layer: any;\r\n if (this.viewer.dataSources.getByName('other').length < 1) {\r\n const data = new this.CesiumNS.CustomDataSource('other');\r\n this.viewer.dataSources.add(data);\r\n layer = data;\r\n } else {\r\n layer = this.viewer.dataSources.getByName('other')[0];\r\n }\r\n\r\n // 确保 other 图层在合适的位置\r\n if (layer) {\r\n const index = this.viewer.dataSources.indexOf(layer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n this.viewer.dataSources.remove(layer as any, false);\r\n this.viewer.dataSources.add(layer as any);\r\n }\r\n }\r\n\r\n return (this.polygonEditor as any).startCircleDrawing?.(layer, onComplete);\r\n }\r\n\r\n /**\r\n * 点标记绘制会话管理接口,创建一个点标记绘制对话,允许用户通过鼠标交互连续添加点标记。\r\n * 使用流程:\r\n * 1. 左键点击地图添加点标记\r\n * 2. 可连续点击添加多个点\r\n * 3. 右键或 ESC 结束绘制\r\n * \r\n * @param iconSvg SVG 图标的 data URL 或路径\r\n * @param onComplete 每次添加点时的回调函数(可选)\r\n * @returns 返回一个点标记绘制会话对象,包含 stop() 方法\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 startPointDrawing 方法\r\n */\r\n startPointDrawing(iconSvg?: string, onComplete?: (entity: Entity) => void): any {\r\n // 确保在 2D 模式下绘制点标记\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const scene: any = (this.viewer as any).scene;\r\n const mode = scene?.mode;\r\n\r\n if (mode === C.SceneMode.SCENE3D) {\r\n // 切换到 2D 模式\r\n toggle2D3D(\r\n {\r\n CesiumNS: C,\r\n viewer: this.viewer,\r\n getLastPerspectiveOrientation: () => undefined,\r\n setLastPerspectiveOrientation: () => {},\r\n },\r\n { duration: 0 },\r\n );\r\n }\r\n } catch (e) {\r\n console.warn('[CZMLManager] 切换到 2D 模式失败:', e);\r\n }\r\n\r\n // 获取或创建 'other' 图层\r\n let layer: any;\r\n if (this.viewer.dataSources.getByName('other').length < 1) {\r\n const data = new this.CesiumNS.CustomDataSource('other');\r\n this.viewer.dataSources.add(data);\r\n layer = data;\r\n } else {\r\n layer = this.viewer.dataSources.getByName('other')[0];\r\n }\r\n\r\n // 确保 other 图层在合适的位置\r\n if (layer) {\r\n const index = this.viewer.dataSources.indexOf(layer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n this.viewer.dataSources.remove(layer as any, false);\r\n this.viewer.dataSources.add(layer as any);\r\n }\r\n }\r\n\r\n return (this.polygonEditor as any).startPointDrawing?.(layer, iconSvg, onComplete);\r\n }\r\n\r\n // New: start editing an existing polygon entity's vertices\r\n // Accepts: an Entity, or an id string, or undefined to use the last selected entity from state\r\n startPolygonEditing(entityOrId?: Entity | string | undefined | null,\r\n onComplete?: (entity: Entity) => void, ) {\r\n this.cancelActivePolygonDrawing('switch to editing');\r\n // Ensure we are in 2D mode before starting polygon editing (same as drawing)\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const scene: any = (this.viewer as any).scene;\r\n // const cam: any = (this.viewer as any).camera;\r\n const mode = scene?.mode;\r\n\r\n if (mode === C.SceneMode.SCENE3D) {\r\n toggle2D3D(\r\n {\r\n CesiumNS: this.CesiumNS,\r\n viewer: this.viewer,\r\n getLastPerspectiveOrientation: () => undefined,\r\n setLastPerspectiveOrientation: () => {},\r\n },\r\n { duration: 0 },\r\n );\r\n } \r\n // else if (mode !== C.SceneMode.SCENE2D) {\r\n // let captured: { lon: number; lat: number; height: number } | undefined;\r\n // let capturedOri: { heading: number; pitch: number; roll: number } | undefined;\r\n // try {\r\n // const cart = this.CesiumNS.Cartographic.fromCartesian(cam.position);\r\n // captured = {\r\n // lon: this.CesiumNS.Math.toDegrees(cart.longitude),\r\n // lat: this.CesiumNS.Math.toDegrees(cart.latitude),\r\n // height: cart.height,\r\n // };\r\n // capturedOri = {\r\n // heading: cam.heading ?? 0,\r\n // pitch: cam.pitch ?? -0.8,\r\n // roll: cam.roll ?? 0,\r\n // };\r\n // } catch {}\r\n // const onDone = () => {\r\n // try {\r\n // if (captured) {\r\n // const dest = this.CesiumNS.Cartesian3.fromDegrees(\r\n // captured.lon,\r\n // captured.lat,\r\n // Math.max(1, captured.height),\r\n // );\r\n // (this.viewer as any).camera.setView({\r\n // destination: dest,\r\n // orientation: capturedOri,\r\n // } as any);\r\n // }\r\n // } finally {\r\n // scene.morphComplete?.removeEventListener?.(onDone);\r\n // }\r\n // };\r\n // scene.morphComplete?.addEventListener?.(onDone);\r\n // scene.morphTo2D?.(0);\r\n // }\r\n } catch {}\r\n\r\n let entity: Entity | undefined;\r\n if (!entityOrId) {\r\n const sel = globalState.getSelected?.() as any;\r\n entity = sel?.entity as Entity | undefined;\r\n } else if (typeof entityOrId === 'string') {\r\n entity = this.viewer.entities.getById(entityOrId) as Entity | undefined;\r\n } else {\r\n entity = entityOrId;\r\n }\r\n if (!entity || !(entity as any).polygon) return undefined;\r\n const dataSource = this.getEntityDataSource(entity) as Cesium.CustomDataSource | null;\r\n if(!dataSource) return undefined;\r\n \r\n // 如果编辑的是 inverter 图层,确保它始终在最上层\r\n if (dataSource.name === 'inverter') {\r\n const index = this.viewer.dataSources.indexOf(dataSource as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n // 移除并重新添加到末尾\r\n this.viewer.dataSources.remove(dataSource as any, false); // false 表示不销毁\r\n this.viewer.dataSources.add(dataSource as any);\r\n }\r\n }\r\n \r\n // 如果编辑的是 subarray 图层,确保 inverter 图层(如果存在)在最上层\r\n if (dataSource.name === 'subarray') {\r\n const inverterLayers = this.viewer.dataSources.getByName('inverter');\r\n if (inverterLayers.length > 0) {\r\n const inverterLayer = inverterLayers[0];\r\n const index = this.viewer.dataSources.indexOf(inverterLayer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n // 移除并重新添加到末尾\r\n this.viewer.dataSources.remove(inverterLayer as any, false); // false 表示不销毁\r\n this.viewer.dataSources.add(inverterLayer as any);\r\n }\r\n }\r\n \r\n }\r\n\r\n if (dataSource.name === 'other') {\r\n const otherLayers = this.viewer.dataSources.getByName('other');\r\n if (otherLayers.length > 0) {\r\n const otherLayer = otherLayers[0];\r\n const index = this.viewer.dataSources.indexOf(otherLayer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n // 移除并重新添加到末尾\r\n this.viewer.dataSources.remove(otherLayer as any, false); // false 表示不销毁\r\n this.viewer.dataSources.add(otherLayer as any);\r\n }\r\n }\r\n \r\n }\r\n \r\n return this.polygonEditor.startEditing(entity, dataSource,onComplete);\r\n }\r\n\r\n private ensurePolygonSessionHooks(): void {\r\n if (this.polygonSessionCleanup || typeof window === 'undefined' || typeof document === 'undefined') {\r\n return;\r\n }\r\n\r\n const blurHandler = () => this.cancelActivePolygonDrawing('window blurred');\r\n const visibilityHandler = () => {\r\n if (document.hidden) {\r\n this.cancelActivePolygonDrawing('document hidden');\r\n }\r\n };\r\n\r\n window.addEventListener('blur', blurHandler);\r\n document.addEventListener('visibilitychange', visibilityHandler);\r\n\r\n this.polygonSessionCleanup = () => {\r\n window.removeEventListener('blur', blurHandler);\r\n document.removeEventListener('visibilitychange', visibilityHandler);\r\n this.polygonSessionCleanup = undefined;\r\n };\r\n }\r\n\r\n private cancelActivePolygonDrawing(reason?: string): void {\r\n if (this.activePolygonSession?.stop) {\r\n try {\r\n this.activePolygonSession.stop();\r\n if (reason) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[CZMLManager] polygon session stopped: ${reason}`);\r\n }\r\n } catch (err) {\r\n // eslint-disable-next-line no-console\r\n console.warn('[CZMLManager] Failed to stop polygon session:', err);\r\n }\r\n }\r\n this.activePolygonSession = null;\r\n }\r\n\r\n /**\r\n * 删除一个 polygon 实体及其 outline\r\n * @param entityOrId 要删除的实体,或实体 ID,或 undefined 使用当前选中的实体\r\n * @param onComplete 删除完成后的回调函数\r\n * @returns 是否成功删除\r\n */\r\n startPolygonDeleting(entityOrId?: Entity | string | undefined | null, onComplete?: (entity: Entity) => void): boolean {\r\n let entity: Entity | undefined;\r\n \r\n // 解析实体\r\n if (!entityOrId) {\r\n const sel = globalState.getSelected?.() as any;\r\n entity = sel?.entity as Entity | undefined;\r\n } else if (typeof entityOrId === 'string') {\r\n entity = this.viewer.entities.getById(entityOrId) as Entity | undefined;\r\n } else {\r\n entity = entityOrId;\r\n }\r\n \r\n // 验证实体\r\n if (!entity || !(entity as any).polygon) {\r\n console.warn('[CZMLManager] Invalid entity for deletion: not a polygon');\r\n return false;\r\n }\r\n \r\n // 获取 DataSource\r\n const dataSource = this.getEntityDataSource(entity) as Cesium.CustomDataSource | null;\r\n if (!dataSource) {\r\n console.warn('[CZMLManager] Cannot find DataSource for entity:', entity.id);\r\n return false;\r\n }\r\n \r\n try {\r\n // 如果当前选中的是要删除的实体,先清除选择状态\r\n if (this.currentSelectedEntity === entity) {\r\n this.clearPolygonSelection();\r\n }\r\n \r\n // 删除 label 实体 (如果存在)\r\n const labelId = `${entity.id}-label`;\r\n const labelEntity = dataSource.entities.getById(labelId);\r\n if (labelEntity) {\r\n dataSource.entities.remove(labelEntity);\r\n }\r\n \r\n // 删除 outline 实体 (如果存在)\r\n const outlineId = `${entity.id}-outline`;\r\n const outlineEntity = dataSource.entities.getById(outlineId);\r\n if (outlineEntity) {\r\n dataSource.entities.remove(outlineEntity);\r\n }\r\n \r\n // 删除主实体\r\n const removed = dataSource.entities.remove(entity);\r\n \r\n if (removed) {\r\n // 调用完成回调\r\n if (onComplete) {\r\n try {\r\n onComplete(entity);\r\n } catch (e) {\r\n console.error('[CZMLManager] Error in onComplete callback:', e);\r\n }\r\n }\r\n \r\n return true;\r\n } else {\r\n console.warn('[CZMLManager] Failed to remove entity from DataSource');\r\n return false;\r\n }\r\n } catch (e) {\r\n console.error('[CZMLManager] Error during polygon deletion:', e);\r\n return false;\r\n }\r\n }\r\n\r\n updateEntity(id: string, patch: Partial<{ name: string; description: string }>): void {\r\n const e = this.viewer.entities.getById(id);\r\n if (!e) return;\r\n if (patch.name !== undefined) e.name = patch.name;\r\n if (patch.description !== undefined) e.description = patch.description as any;\r\n }\r\n\r\n deleteEntity(id: string): void {\r\n this.viewer.entities.removeById(id);\r\n }\r\n\r\n listEntities(): Entity[] {\r\n return this.viewer.entities.values as unknown as Entity[];\r\n }\r\n\r\n /**\r\n * 获取实体的经纬度与地形高数组(仅外环/各点/单点)。\r\n * - 地形高来自 viewer.scene.globe.getHeight(carto)\r\n * - 高度保留 3 位小数;若为负数则置为 0\r\n * - 无法获取地形高时 height 为 null\r\n *\r\n * 支持的实体类型:polygon(仅外环)、polyline、point/billboard\r\n */\r\n getEntityLonLatTerrainHeightArray(entity: any): LonLatHeight[] {\r\n const C: any = this.CesiumNS;\r\n const now = C.JulianDate.now();\r\n\r\n const toLonLatHeight = (p: any): LonLatHeight => {\r\n const carto = C.Cartographic.fromCartesian(p);\r\n const lon = C.Math.toDegrees(carto.longitude);\r\n const lat = C.Math.toDegrees(carto.latitude);\r\n let hTerrain: number | undefined;\r\n try {\r\n hTerrain = this.viewer?.scene?.globe?.getHeight?.(carto);\r\n } catch {}\r\n if (typeof hTerrain === 'number') {\r\n const fixed = Number(hTerrain.toFixed(3));\r\n const clamped = fixed < 0 ? 0 : fixed;\r\n return { lon, lat, height: clamped };\r\n }\r\n return { lon, lat, height: null };\r\n };\r\n\r\n // Polygon\r\n if (entity?.polygon?.hierarchy) {\r\n const hProp: any = entity.polygon.hierarchy;\r\n const hVal: any = typeof hProp?.getValue === 'function' ? hProp.getValue(now) : hProp;\r\n const outer: any[] = Array.isArray(hVal) ? hVal : (hVal?.positions ?? []);\r\n const points = outer.map(toLonLatHeight);\r\n // 多边形首尾闭合:如果首尾点不同,则添加第一个点到末尾\r\n if (points.length > 0) {\r\n const first = points[0];\r\n const last = points[points.length - 1];\r\n if (first.lon !== last.lon || first.lat !== last.lat || first.height !== last.height) {\r\n points.push({ ...first });\r\n }\r\n }\r\n return points;\r\n }\r\n\r\n // Polyline\r\n if (entity?.polyline?.positions) {\r\n const pProp: any = entity.polyline.positions;\r\n const pVal: any[] = typeof pProp?.getValue === 'function' ? pProp.getValue(now) : pProp;\r\n return (pVal ?? []).map(toLonLatHeight);\r\n }\r\n\r\n // Point / Billboard position\r\n if (entity?.position) {\r\n const pos: any = typeof entity.position?.getValue === 'function' ? entity.position.getValue(now) : entity.position;\r\n return pos ? [toLonLatHeight(pos)] : [];\r\n }\r\n\r\n return [];\r\n }\r\n\r\n getEntityDataSource(entity: any): Cesium.DataSource | null {\r\n if (!entity) return null;\r\n try {\r\n const owner = (entity as any)?.entityCollection?.owner;\r\n if (owner) return owner; // 通常为 CustomDataSource/CzmlDataSource\r\n } catch {}\r\n // 兜底:遍历 DataSourceCollection\r\n try {\r\n const dsCol = this.viewer?.dataSources;\r\n const len: number = typeof dsCol?.length === 'number' ? dsCol.length : 0;\r\n for (let i = 0; i < len; i++) {\r\n const ds = dsCol.get(i);\r\n if (ds?.entities?.contains?.(entity)) return ds;\r\n }\r\n } catch {}\r\n return null;\r\n}\r\n\r\n /**\r\n * 选择一个 polygon 实体并高亮显示\r\n * 新逻辑:\r\n * - 只对 subarray 和 inverter 图层的多边形生效\r\n * - 设置 checked=true,使用 type 对应的高亮颜色(faceColor 和 lineColor)\r\n * - faceColor:鲜艳的填充色(用于高亮)\r\n * - lineColor:鲜艳的轮廓线色(用于高亮)\r\n * \r\n * @param entity 要选择的实体,如果为 null 则取消当前选择\r\n * @returns 是否成功选择\r\n */\r\n selectPolygonEntity(entity: Entity | null): boolean {\r\n // 如果传入 null 或非 polygon 实体,取消当前选择\r\n if (!entity || !(entity as any).polygon) {\r\n return this.clearPolygonSelection();\r\n }\r\n \r\n // 获取实体所属图层\r\n const dataSource = this.getEntityDataSource(entity);\r\n const layerName = dataSource?.name || '';\r\n \r\n // 只对 subarray 和 inverter 图层的多边形进行高亮\r\n if (layerName !== 'subarray' && layerName !== 'inverter') {\r\n return false;\r\n }\r\n \r\n // 如果点击的是已经选中的实体,保持高亮状态\r\n if (this.currentSelectedEntity === entity) {\r\n return true; // 已经选中,无需重复操作\r\n }\r\n \r\n // 先取消之前选中实体的高亮\r\n if (this.currentSelectedEntity) {\r\n this.clearPolygonSelection();\r\n }\r\n \r\n // 保存新选中实体\r\n this.currentSelectedEntity = entity;\r\n \r\n // 设置 checked=true\r\n (entity as any).checked = true;\r\n \r\n // 获取实体的 type 和对应的颜色配置\r\n const entityType = (entity as any).type || layerName;\r\n const colors = this.polygonEditor.getColorConfig(entityType);\r\n \r\n try {\r\n // ✅ 高亮时使用 faceColor(鲜艳的填充色)\r\n (entity as any).polygon.material = colors.faceColor;\r\n \r\n // ✅ 高亮时使用 lineColor(鲜艳的轮廓线色)\r\n const entityId = (entity as any).id;\r\n const outlineId = `${entityId}-outline`;\r\n const outlineEntity = dataSource?.entities?.getById(outlineId);\r\n if (outlineEntity && (outlineEntity as any).polyline) {\r\n this.polygonEditor.applyDashedOutlineStyle(outlineEntity, colors.lineColor, 3, 10);\r\n }\r\n \r\n return true;\r\n } catch (e) {\r\n console.error('[CZMLManager] ❌ 高亮多边形失败:', e);\r\n return false;\r\n }\r\n }\r\n \r\n /**\r\n * 检查当前是否处于多边形绘制模式\r\n * @returns 如果正在绘制多边形则返回 true\r\n */\r\n isDrawingActive(): boolean {\r\n try {\r\n // 检查 polygonEditor 是否存在且有活动的 handler\r\n return !!(this._polygonEditor && (this._polygonEditor as any).handler);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n \r\n /**\r\n * 检查当前是否处于多边形编辑模式\r\n * @returns 如果正在编辑多边形则返回 true\r\n */\r\n isEditingActive(): boolean {\r\n try {\r\n // 检查 polygonEditor 是否存在且有编辑手柄\r\n const editor = this._polygonEditor as any;\r\n return !!(this._polygonEditor && editor.editHandles && editor.editHandles.length > 0);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n \r\n /**\r\n * 清除当前的 polygon 选择状态\r\n * 新逻辑:\r\n * - 设置 checked=false\r\n * - 恢复为对应 type 的默认颜色(faceFinalColor 和 lineFinalColor)\r\n * - faceFinalColor:较淡的填充色(默认状态)\r\n * - lineFinalColor:较淡的轮廓线色(默认状态)\r\n * \r\n * @returns 是否成功清除\r\n */\r\n clearPolygonSelection(): boolean {\r\n if (!this.currentSelectedEntity) {\r\n // 没有选中的实体,无需操作\r\n return true;\r\n }\r\n \r\n try {\r\n const entity = this.currentSelectedEntity;\r\n \r\n // 获取实体所属图层\r\n const dataSource = this.getEntityDataSource(entity);\r\n const layerName = dataSource?.name || '';\r\n \r\n // 只处理 subarray 和 inverter 图层\r\n if (layerName === 'subarray' || layerName === 'inverter') {\r\n // 设置 checked=false\r\n (entity as any).checked = false;\r\n \r\n // 获取实体的 type 和对应的颜色配置\r\n const entityType = (entity as any).type || layerName;\r\n const colors = this.polygonEditor.getColorConfig(entityType);\r\n \r\n // ✅ 恢复为 faceFinalColor(较淡的填充色)\r\n (entity as any).polygon.material = colors.faceFinalColor;\r\n \r\n // ✅ 恢复为 lineFinalColor(较淡的轮廓线色)\r\n const entityId = (entity as any).id;\r\n const outlineId = `${entityId}-outline`;\r\n const outlineEntity = dataSource?.entities?.getById(outlineId);\r\n if (outlineEntity && (outlineEntity as any).polyline) {\r\n this.polygonEditor.applyDashedOutlineStyle(outlineEntity, colors.lineFinalColor, 3, 10);\r\n }\r\n }\r\n \r\n // 清除引用\r\n this.currentSelectedEntity = null;\r\n \r\n return true;\r\n } catch (e) {\r\n console.error('[CZMLManager] ❌ 取消高亮失败:', e);\r\n this.currentSelectedEntity = null;\r\n return false;\r\n }\r\n }\r\n \r\n /**\r\n * 获取当前选中的 polygon 实体\r\n * @returns 当前选中的实体,如果没有则返回 null\r\n */\r\n getSelectedPolygonEntity(): Entity | null {\r\n return this.currentSelectedEntity;\r\n }\r\n\r\n /**\r\n * 从点位数组创建一个多边形及其轮廓线和标签\r\n * @param options 创建选项\r\n * - layerName: 图层名称 ('subarray' 或 'inverter')\r\n * - id: 实体ID\r\n * - name: 实体名称\r\n * - points: 点位数组 [{ lon, lat, height }]\r\n * @returns 创建的主多边形实体\r\n */\r\n createPolygonFromPoints(options: {\r\n layerName: 'subarray' | 'inverter';\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height?: number }>;\r\n }): Entity | null {\r\n const C = this.CesiumNS as any;\r\n const { layerName, id, name, points } = options;\r\n\r\n // 1. 获取或创建图层\r\n let layer = this.viewer.dataSources.getByName(layerName)[0];\r\n if (!layer) {\r\n layer = new C.CustomDataSource(layerName);\r\n this.viewer.dataSources.add(layer);\r\n }\r\n\r\n // 2. 调用 PolygonEditor 创建多边形 (颜色配置在 PolygonEditor 内部处理)\r\n // ⚠️ 注意:此方法需要 PolygonEditor 实现 createPolygonFromPoints 方法\r\n const entity = (this.polygonEditor as any).createPolygonFromPoints?.({\r\n layer: layer as any,\r\n id,\r\n name,\r\n points,\r\n });\r\n\r\n // 3. 如果创建的是 inverter 图层的多边形,确保 inverter 图层在最上层\r\n if (entity && layerName === 'inverter') {\r\n this.ensureInverterLayerOnTop();\r\n }\r\n\r\n return entity;\r\n }\r\n\r\n /**\r\n * 确保 inverter 图层始终在最上层\r\n */\r\n ensureInverterLayerOnTop(): void {\r\n const inverterLayers = this.viewer.dataSources.getByName('inverter');\r\n if (inverterLayers.length > 0) {\r\n const inverterLayer = inverterLayers[0];\r\n const index = this.viewer.dataSources.indexOf(inverterLayer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n this.viewer.dataSources.remove(inverterLayer as any, false);\r\n this.viewer.dataSources.add(inverterLayer as any);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 分析子阵和组串的层级关系,并自动重新编码\r\n * 代理到 PolygonEditor.analyzeAndEncodePolygonHierarchy()\r\n * @param targetSubarrayEntity - 可选,指定要处理的子阵实体。如果提供,则只处理该子阵及其内部组串\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 analyzeAndEncodePolygonHierarchy 方法\r\n */\r\n analyzeAndEncodePolygonHierarchy(targetSubarrayEntity?: any) {\r\n return (this.polygonEditor as any).analyzeAndEncodePolygonHierarchy?.(targetSubarrayEntity);\r\n }\r\n\r\n /**\r\n * 还原多边形的原始名称\r\n * 代理到 PolygonEditor.restoreOriginalNames()\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 restoreOriginalNames 方法\r\n */\r\n restoreOriginalNames() {\r\n return (this.polygonEditor as any).restoreOriginalNames?.();\r\n }\r\n\r\n /**\r\n * 仅分析多边形层级关系,不修改名称\r\n * 代理到 PolygonEditor.getPolygonHierarchyWithoutEncoding()\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 getPolygonHierarchyWithoutEncoding 方法\r\n */\r\n getPolygonHierarchyWithoutEncoding() {\r\n return (this.polygonEditor as any).getPolygonHierarchyWithoutEncoding?.();\r\n }\r\n\r\n /**\r\n * 导出指定子阵及其内部组串的层级结构\r\n * 代理到 PolygonEditor.exportSingleSubarrayHierarchy()\r\n * @param subarrayEntity - 要导出的子阵实体\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 exportSingleSubarrayHierarchy 方法\r\n */\r\n exportSingleSubarrayHierarchy(subarrayEntity: any) {\r\n return (this.polygonEditor as any).exportSingleSubarrayHierarchy?.(subarrayEntity);\r\n }\r\n\r\n /**\r\n * 导出指定组串的扁平结构\r\n * 代理到 PolygonEditor.exportSingleInverter()\r\n * @param inverterEntity - 要导出的组串实体\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 exportSingleInverter 方法\r\n */\r\n exportSingleInverter(inverterEntity: any) {\r\n return (this.polygonEditor as any).exportSingleInverter?.(inverterEntity);\r\n }\r\n\r\n /**\r\n * 从 JSON 数据批量创建多边形(层级结构)\r\n * 代理到 PolygonEditor.importPolygonsFromHierarchy()\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 importPolygonsFromHierarchy 方法\r\n */\r\n importPolygonsFromHierarchy(data: any) {\r\n return (this.polygonEditor as any).importPolygonsFromHierarchy?.(\r\n data,\r\n this.createPolygonFromPoints.bind(this)\r\n );\r\n }\r\n\r\n /**\r\n * 从 JSON 数据批量创建多边形(扁平结构)\r\n * 代理到 PolygonEditor.importPolygonsFromFlatStructure()\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 importPolygonsFromFlatStructure 方法\r\n */\r\n importPolygonsFromFlatStructure(data: any) {\r\n return (this.polygonEditor as any).importPolygonsFromFlatStructure?.(\r\n data,\r\n this.createPolygonFromPoints.bind(this)\r\n );\r\n }\r\n\r\n /**\r\n * 更新多边形实体的类型、颜色和标签\r\n * 代理到 PolygonEditor.updatePolygonTypeAndStyle()\r\n * @param entity 要更新的多边形实体\r\n * @param newType 新的类型 ('subarray' | 'inverter' | 'astrict' | 'rail' | 'feature')\r\n * @param customName 可选的自定义名称\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 updatePolygonTypeAndStyle 方法\r\n */\r\n updatePolygonTypeAndStyle(\r\n entity: any,\r\n newType: string,\r\n customName?: string\r\n ) {\r\n return (this.polygonEditor as any).updatePolygonTypeAndStyle?.(entity, newType, customName);\r\n }\r\n\r\n /**\r\n * 从 JSON 数据加载 other 图层 (多边形、圆形、特征点)\r\n * 代理到 PolygonEditor.loadOtherLayerFromJson()\r\n * @param data JSON 数据,包含 astrict, rail, feature, feature_point 数组\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 loadOtherLayerFromJson 方法\r\n */\r\n loadOtherLayerFromJson(data: {\r\n astrict?: Array<any>;\r\n rail?: Array<any>;\r\n feature?: Array<any>;\r\n feature_point?: Array<any>;\r\n }) {\r\n return (this.polygonEditor as any).loadOtherLayerFromJson?.(data);\r\n }\r\n\r\n /**\r\n * 计算多边形的周长和面积(忽略高度值)\r\n * 代理到 PolygonEditor.calculatePolygonPerimeterAndArea()\r\n * @param points 点位数组 [{ lon, lat, height }]\r\n * @returns { perimeter: 周长(米), area: 面积(平方米) }\r\n */\r\n calculatePolygonPerimeterAndArea(\r\n points: Array<{ lon: number; lat: number; height?: number }>\r\n ): { perimeter: number; area: number } {\r\n return this.polygonEditor.calculatePolygonPerimeterAndArea(points);\r\n }\r\n\r\n}\r\n","import { defineComponent, h, onMounted, onBeforeUnmount, ref, watch } from 'vue';\r\nimport type * as Cesium from 'cesium';\r\nimport { SceneManager } from '../../core/SceneManager';\r\nimport { CZMLManager } from '../../core/CZMLManager';\r\nimport { CameraManager } from '../../core/CameraManager';\r\n\r\n/**\r\n * 🎨 GisViewer 组件 - Vue3 声明式地图容器\r\n * \r\n * @example\r\n * ```vue\r\n * <template>\r\n * <GisViewer \r\n * :cesium=\"Cesium\" \r\n * :options=\"{ timeline: false, animation: false }\"\r\n * @ready=\"handleReady\"\r\n * class=\"map-container\"\r\n * style=\"width: 100%; height: 100vh;\"\r\n * />\r\n * </template>\r\n * \r\n * <script setup>\r\n * import * as Cesium from 'cesium';\r\n * import GisViewer from '@jorgmoritz/gis-manager/vue';\r\n * \r\n * const handleReady = ({ sceneManager, czmlManager, cameraManager, viewer }) => {\r\n * console.log('地图已就绪', viewer);\r\n * \r\n * // 使用 czmlManager 管理路径\r\n * czmlManager.createPath(...);\r\n * };\r\n * </script>\r\n * ```\r\n */\r\nexport default defineComponent({\r\n name: 'GisViewer',\r\n props: {\r\n /** Cesium 命名空间对象 */\r\n cesium: { \r\n type: Object as any, \r\n required: true \r\n },\r\n /** Cesium 初始化选项 */\r\n options: { \r\n type: Object as any, \r\n required: false \r\n },\r\n /** 容器 CSS 类名 */\r\n class: { \r\n type: String as any, \r\n required: false \r\n },\r\n /** 容器样式 */\r\n style: { \r\n type: Object as any, \r\n required: false \r\n },\r\n },\r\n emits: {\r\n /**\r\n * 地图初始化完成事件\r\n * @param payload - 包含所有管理器和 viewer 的对象\r\n */\r\n ready: (payload: {\r\n sceneManager: SceneManager;\r\n czmlManager: CZMLManager;\r\n cameraManager: CameraManager;\r\n viewer: Cesium.Viewer;\r\n }) => true,\r\n /**\r\n * 地图销毁事件\r\n */\r\n destroyed: () => true,\r\n /**\r\n * 初始化错误事件\r\n */\r\n error: (error: Error) => true,\r\n },\r\n setup(props: any, { emit, slots }: any) {\r\n const containerRef = ref(null) as { value: HTMLElement | null };\r\n let sceneManager: SceneManager | null = null;\r\n let czmlManager: CZMLManager | null = null;\r\n let cameraManager: CameraManager | null = null;\r\n\r\n onMounted(() => {\r\n try {\r\n if (!containerRef.value) {\r\n const error = new Error('Container element not found');\r\n emit('error', error);\r\n return;\r\n }\r\n\r\n // 创建 SceneManager\r\n sceneManager = new SceneManager(props.cesium, {\r\n container: containerRef.value,\r\n ...(props.options ?? {}),\r\n });\r\n\r\n // 创建其他管理器\r\n czmlManager = new CZMLManager(props.cesium, sceneManager.getViewer());\r\n cameraManager = new CameraManager(props.cesium, sceneManager.getViewer());\r\n\r\n // 触发 ready 事件,传递所有管理器\r\n emit('ready', {\r\n sceneManager,\r\n czmlManager,\r\n cameraManager,\r\n viewer: sceneManager.getViewer(),\r\n });\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error('Failed to initialize GIS Viewer');\r\n console.error('[GisViewer] 初始化失败:', error);\r\n emit('error', error);\r\n }\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n sceneManager?.destroy();\r\n sceneManager = null;\r\n czmlManager = null;\r\n cameraManager = null;\r\n emit('destroyed');\r\n });\r\n\r\n // 监听选项变化并应用\r\n watch(\r\n () => props.options?.sunlight,\r\n (val: any) => {\r\n if (sceneManager) {\r\n sceneManager.configureSunlight(!!val?.enabled, val?.time);\r\n }\r\n },\r\n { deep: true },\r\n );\r\n\r\n watch(\r\n () => props.options?.shadows,\r\n (val: any) => {\r\n if (sceneManager && typeof val === 'boolean') {\r\n sceneManager.setShadows(val);\r\n }\r\n },\r\n );\r\n\r\n return () =>\r\n h(\r\n 'div',\r\n { class: props.class, style: props.style },\r\n [\r\n h('div', { \r\n ref: containerRef, \r\n style: { width: '100%', height: '100%' } \r\n }), \r\n slots.default?.()\r\n ],\r\n );\r\n },\r\n});\r\n","import { ref, readonly, onMounted, onBeforeUnmount, unref } from 'vue';\r\nimport type * as Cesium from 'cesium';\r\nimport { SceneManager } from '../../core/SceneManager';\r\nimport { CZMLManager } from '../../core/CZMLManager';\r\nimport { CameraManager } from '../../core/CameraManager';\r\nimport { startPathDrawing } from '../../core/path-manager/startPathDrawing';\r\nimport { startPathEditing } from '../../core/path-manager/pathEditing';\r\nimport type { VertexDetailInfo, VertexOperationInfo } from '../../core/path-manager/editing/VertexDetailInfo';\r\n\r\n/**\r\n * GIS 查看器配置选项\r\n */\r\nexport interface GisViewerOptions {\r\n /** Cesium 初始化选项(会合并到 container 配置中) */\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Vue Ref 类型(兼容 Vue 2 和 Vue 3)\r\n */\r\nexport interface VueRef<T> {\r\n value: T;\r\n}\r\n\r\n/**\r\n * 路径绘制选项\r\n */\r\nexport interface PathDrawingOptions {\r\n layer?: Cesium.CustomDataSource;\r\n idPrefix?: string;\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n altitudeMode?: 'absolute' | 'relativeToStart' | 'relativeToGround';\r\n climbHeight?: number;\r\n autoStartEditing?: boolean | {\r\n preview?: {\r\n enabled?: boolean;\r\n showFootprint?: boolean;\r\n fov?: number;\r\n pitch?: number;\r\n roll?: number;\r\n lengthFactor?: number;\r\n container?: HTMLElement;\r\n };\r\n };\r\n onEditingStarted?: (editSession: any) => void;\r\n onVertexSelectDetail?: (info: VertexDetailInfo) => void;\r\n onVertexDragCompleteDetail?: (info: VertexOperationInfo) => void;\r\n onVertexInsertDetail?: (info: VertexOperationInfo) => void;\r\n onVertexDeleteDetail?: (info: VertexOperationInfo) => void;\r\n}\r\n\r\n/**\r\n * 路径编辑选项\r\n */\r\nexport interface PathEditingOptions {\r\n layer?: Cesium.CustomDataSource;\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n preview?: {\r\n enabled?: boolean;\r\n container?: HTMLElement;\r\n showFootprint?: boolean;\r\n fov?: number;\r\n pitch?: number;\r\n roll?: number;\r\n lengthFactor?: number;\r\n };\r\n quickEdit?: {\r\n enabled?: boolean;\r\n climbHeight?: number;\r\n altitudeMode?: 'absolute' | 'relativeToStart' | 'relativeToGround';\r\n };\r\n onVertexSelectDetail?: (info: VertexDetailInfo) => void;\r\n onVertexDragCompleteDetail?: (info: VertexOperationInfo) => void;\r\n onVertexInsertDetail?: (info: VertexOperationInfo) => void;\r\n onVertexDeleteDetail?: (info: VertexOperationInfo) => void;\r\n}\r\n\r\n/**\r\n * 🚀 Vue3 GIS 查看器 Composable\r\n * \r\n * @param cesium - Cesium 命名空间对象\r\n * @param containerOrRef - 容器元素、CSS选择器或 Vue Ref\r\n * @param options - 初始化选项\r\n * \r\n * @example\r\n * ```vue\r\n * <script setup>\r\n * import { ref } from 'vue';\r\n * import * as Cesium from 'cesium';\r\n * import { useGisViewer } from '@jorgmoritz/gis-manager/vue';\r\n * \r\n * const mapContainer = ref(null);\r\n * const { \r\n * sceneManager, \r\n * czmlManager, \r\n * cameraManager,\r\n * isReady,\r\n * startDrawingPath,\r\n * startEditingPath \r\n * } = useGisViewer(Cesium, mapContainer);\r\n * \r\n * // 开始绘制路径\r\n * const handleDrawPath = () => {\r\n * if (!isReady.value) return;\r\n * const session = startDrawingPath.value({\r\n * autoStartEditing: true,\r\n * onVertexSelectDetail: (info) => {\r\n * console.log('选中顶点:', info.displayNumber);\r\n * }\r\n * });\r\n * };\r\n * </script>\r\n * \r\n * <template>\r\n * <div ref=\"mapContainer\" class=\"map-container\"></div>\r\n * <button @click=\"handleDrawPath\" :disabled=\"!isReady\">绘制路径</button>\r\n * </template>\r\n * ```\r\n */\r\nexport function useGisViewer(\r\n cesium: typeof Cesium,\r\n containerOrRef?: HTMLElement | string | VueRef<HTMLElement | null>,\r\n options?: GisViewerOptions\r\n) {\r\n // 内部 container ref(如果用户没有提供)\r\n const internalContainerRef = ref(null) as { value: HTMLElement | null };\r\n const sceneManagerRef = ref(null) as { value: SceneManager | null };\r\n const czmlManagerRef = ref(null) as { value: CZMLManager | null };\r\n const cameraManagerRef = ref(null) as { value: CameraManager | null };\r\n const isReady = ref(false) as { value: boolean };\r\n const error = ref(null) as { value: Error | null };\r\n\r\n // 初始化函数\r\n const initialize = () => {\r\n try {\r\n let containerElement: HTMLElement | null = null;\r\n\r\n // 解析容器\r\n if (containerOrRef) {\r\n if (typeof containerOrRef === 'string') {\r\n // CSS 选择器\r\n containerElement = document.querySelector(containerOrRef);\r\n if (!containerElement) {\r\n throw new Error(`Container element not found: ${containerOrRef}`);\r\n }\r\n } else {\r\n // HTMLElement 或 Ref\r\n containerElement = unref(containerOrRef);\r\n }\r\n } else {\r\n // 使用内部 ref\r\n containerElement = internalContainerRef.value;\r\n }\r\n\r\n if (!containerElement) {\r\n throw new Error('Container element not found');\r\n }\r\n\r\n // 创建 SceneManager\r\n const sceneManager = new SceneManager(cesium, {\r\n container: containerElement,\r\n ...(options ?? {}),\r\n });\r\n\r\n sceneManagerRef.value = sceneManager;\r\n\r\n // 创建其他管理器\r\n czmlManagerRef.value = new CZMLManager(cesium, sceneManager.getViewer());\r\n cameraManagerRef.value = new CameraManager(cesium, sceneManager.getViewer());\r\n\r\n isReady.value = true;\r\n error.value = null;\r\n } catch (err) {\r\n error.value = err instanceof Error ? err : new Error('Failed to create GIS Viewer');\r\n sceneManagerRef.value = null;\r\n czmlManagerRef.value = null;\r\n cameraManagerRef.value = null;\r\n isReady.value = false;\r\n console.error('[useGisViewer] 初始化失败:', err);\r\n }\r\n };\r\n\r\n // 销毁函数\r\n const destroy = () => {\r\n if (sceneManagerRef.value) {\r\n sceneManagerRef.value.destroy();\r\n sceneManagerRef.value = null;\r\n czmlManagerRef.value = null;\r\n cameraManagerRef.value = null;\r\n isReady.value = false;\r\n }\r\n };\r\n\r\n onMounted(() => {\r\n initialize();\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n destroy();\r\n });\r\n\r\n // 包装路径绘制方法\r\n const startDrawingPath = ref((pathOptions?: PathDrawingOptions) => {\r\n if (!sceneManagerRef.value) {\r\n throw new Error('SceneManager 未初始化');\r\n }\r\n return startPathDrawing(cesium, sceneManagerRef.value.getViewer(), pathOptions);\r\n });\r\n\r\n // 包装路径编辑方法\r\n const startEditingPath = ref((\r\n entityOrId: Cesium.Entity | string,\r\n editOptions?: PathEditingOptions\r\n ) => {\r\n if (!sceneManagerRef.value) {\r\n throw new Error('SceneManager 未初始化');\r\n }\r\n return startPathEditing(cesium, sceneManagerRef.value.getViewer(), entityOrId, editOptions);\r\n });\r\n\r\n return {\r\n // 容器 ref(仅在用户未提供容器时使用)\r\n containerRef: internalContainerRef,\r\n\r\n // 核心管理器(响应式 readonly)\r\n sceneManager: readonly(sceneManagerRef),\r\n czmlManager: readonly(czmlManagerRef),\r\n cameraManager: readonly(cameraManagerRef),\r\n\r\n // 状态\r\n isReady: readonly(isReady),\r\n error: readonly(error),\r\n\r\n // 路径操作方法\r\n startDrawingPath: readonly(startDrawingPath),\r\n startEditingPath: readonly(startEditingPath),\r\n\r\n // 手动控制方法\r\n initialize,\r\n destroy,\r\n\r\n // Viewer 访问器\r\n get viewer() {\r\n return sceneManagerRef.value?.getViewer() ?? null;\r\n },\r\n } as const;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/assets.ts","../../src/utils/events.ts","../../src/core/LayerManager.ts","../../src/core/toggle2D3D.ts","../../src/core/CameraManager.ts","../../src/core/SceneManager.ts","../../src/core/StateManager.ts","../../src/core/path-manager/HeightMarker.ts","../../src/core/path-manager/CameraFOVController.ts","../../src/core/path-manager/PathPreview.ts","../../src/core/path-manager/FrustumPyramid.ts","../../src/core/path-manager/AirplaneCursor.ts","../../src/core/path-manager/editing/VertexLabelManager.ts","../../src/core/path-manager/editing/PathEditingUtils.ts","../../src/core/path-manager/editing/VertexInsertionHandler.ts","../../src/core/path-manager/editing/ContextMenuManager.ts","../../src/core/path-manager/editing/VertexDragHandler.ts","../../src/core/path-manager/utils/TerrainHeightQuery.ts","../../src/core/path-manager/editing/PathEditingEventHandler.ts","../../src/core/path-manager/editing/VertexHandleStyleManager.ts","../../src/core/path-manager/editing/PathStateManager.ts","../../src/core/path-manager/pathEditing.ts","../../src/core/path-manager/startPathDrawing.ts","../../src/utils/sinoflyAdapter.ts","../../src/core/path-manager/renderFlightPath.ts","../../src/core/path-manager/FlightSimulator.ts","../../src/core/CZMLPathManager.ts","../../src/core/PolygonEditor.ts","../../src/core/CZMLManager.ts","../../src/adapters/vue/GisViewer.ts","../../src/adapters/vue/useGisViewer.ts"],"names":["h","height","layer","options","colors","area","ref","onMounted","onBeforeUnmount"],"mappings":"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","file":"index.js","sourcesContent":["/* Cesium assets configuration helpers */\r\nimport type * as Cesium from 'cesium';\r\n\r\nexport interface CesiumAssetsOptions {\r\n baseUrl: string; // URL where Cesium Assets/Widgets/ThirdParty are served\r\n ionToken?: string; // Optional Cesium Ion access token\r\n}\r\n\r\nexport function configureCesiumAssets(opts: CesiumAssetsOptions): void {\r\n if (typeof window !== 'undefined') {\r\n (window as any).CESIUM_BASE_URL = opts.baseUrl;\r\n if (opts.ionToken) (window as any).__CESIUM_ION_TOKEN__ = opts.ionToken;\r\n }\r\n // Best-effort: call buildModuleUrl.setBaseUrl if present\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod: typeof Cesium | undefined = require('cesium');\r\n const anyCesium = mod as any;\r\n if (anyCesium?.buildModuleUrl?.setBaseUrl) {\r\n anyCesium.buildModuleUrl.setBaseUrl(opts.baseUrl);\r\n }\r\n if (opts.ionToken && anyCesium?.Ion) {\r\n anyCesium.Ion.defaultAccessToken = opts.ionToken;\r\n }\r\n } catch {\r\n // ignore if cesium not available at runtime\r\n }\r\n}\r\n\r\nexport function getCesiumBaseUrl(): string | undefined {\r\n if (typeof window !== 'undefined' && (window as any).CESIUM_BASE_URL) {\r\n return (window as any).CESIUM_BASE_URL as string;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function assertCesiumAssetsConfigured(): void {\r\n const base = getCesiumBaseUrl();\r\n if (!base && typeof console !== 'undefined') {\r\n // Friendly warning to consumers\r\n // eslint-disable-next-line no-console\r\n console.warn('[cesium-gis-manager] CESIUM_BASE_URL is not configured. Cesium assets may fail to load in browser. Call configureCesiumAssets({ baseUrl }) in your app and ensure assets are hosted.');\r\n }\r\n}\r\n\r\n/** Configure Cesium Ion token only. Safe to call before or after Cesium is imported. */\r\nexport function configureCesiumIonToken(token: string): void {\r\n if (typeof window !== 'undefined') {\r\n (window as any).__CESIUM_ION_TOKEN__ = token;\r\n }\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod: typeof Cesium | undefined = require('cesium');\r\n const anyCesium = mod as any;\r\n if (anyCesium?.Ion) anyCesium.Ion.defaultAccessToken = token;\r\n } catch {\r\n // ignore if cesium not available at runtime\r\n }\r\n}\r\n\r\nexport function getCesiumIonToken(): string | undefined {\r\n if (typeof window !== 'undefined' && (window as any).__CESIUM_ION_TOKEN__) {\r\n return (window as any).__CESIUM_ION_TOKEN__ as string;\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Ensure the provided Cesium namespace uses the configured Ion token.\r\n * This solves cases where the app's Cesium module instance differs from the one we can require(),\r\n * especially under ESM bundlers. Call this with the Cesium instance actually used to construct Viewer.\r\n */\r\nexport function ensureCesiumIonToken(CesiumNS: typeof Cesium): void {\r\n try {\r\n const token = getCesiumIonToken();\r\n if (token && (CesiumNS as any)?.Ion) {\r\n (CesiumNS as any).Ion.defaultAccessToken = token;\r\n }\r\n } catch {\r\n // no-op\r\n }\r\n}\r\n","export type Listener<T> = (payload: T) => void;\r\n\r\nexport class Emitter<T> {\r\n private listeners: Set<Listener<T>> = new Set();\r\n on(fn: Listener<T>): () => void {\r\n this.listeners.add(fn);\r\n return () => this.off(fn);\r\n }\r\n off(fn: Listener<T>): void {\r\n this.listeners.delete(fn);\r\n }\r\n emit(payload: T): void {\r\n for (const fn of this.listeners) fn(payload);\r\n }\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n}\r\n\r\n/**\r\n * 相机 FOV 变化事件\r\n */\r\nexport interface CameraFOVChangeEvent {\r\n /** 当前 FOV 值(度) */\r\n fov: number;\r\n /** 等效焦距(mm) */\r\n focalLength: number;\r\n /** 事件来源 */\r\n source: 'controller' | 'preview' | 'frustum' | 'user';\r\n}\r\n\r\n/**\r\n * 相机姿态变化事件\r\n */\r\nexport interface CameraPoseChangeEvent {\r\n /** 相机位置 */\r\n position: any; // Cesium.Cartesian3\r\n /** 航向角(度) */\r\n heading: number;\r\n /** 俯仰角(度) */\r\n pitch: number;\r\n /** 翻滚角(度) */\r\n roll: number;\r\n /** FOV(度) */\r\n fov?: number;\r\n /** 事件来源 */\r\n source: 'preview' | 'frustum' | 'airplane' | 'user';\r\n}\r\n\r\n/**\r\n * 视锥体形状变化事件\r\n */\r\nexport interface FrustumShapeChangeEvent {\r\n /** FOV(度) */\r\n fov: number;\r\n /** 视锥体长度(米) */\r\n length: number;\r\n /** 宽高比 */\r\n aspectRatio: number;\r\n /** 事件来源 */\r\n source: 'controller' | 'user';\r\n}\r\n\r\n/**\r\n * 飞机游标姿态变化事件\r\n */\r\nexport interface CursorPoseChangeEvent {\r\n /** 游标位置 */\r\n position: any; // Cesium.Cartesian3\r\n /** 航向角(度) */\r\n heading: number;\r\n /** 俯仰角(度) */\r\n pitch: number;\r\n /** 翻滚角(度) */\r\n roll: number;\r\n /** 海拔高度(米) */\r\n altitude: number;\r\n /** 事件来源 */\r\n source: 'cursor' | 'user';\r\n}\r\n\r\n/**\r\n * 全局事件总线\r\n * 用于管理 CameraFOVController、PathPreview、FrustumPyramid 之间的通信\r\n */\r\nexport class CameraEventBus {\r\n /** FOV 变化事件 */\r\n public readonly onFOVChange = new Emitter<CameraFOVChangeEvent>();\r\n \r\n /** 相机姿态变化事件 */\r\n public readonly onPoseChange = new Emitter<CameraPoseChangeEvent>();\r\n \r\n /** 视锥体形状变化事件 */\r\n public readonly onFrustumShapeChange = new Emitter<FrustumShapeChangeEvent>();\r\n\r\n /** 飞机游标姿态变化事件 */\r\n public readonly onCursorPoseChange = new Emitter<CursorPoseChangeEvent>();\r\n\r\n /**\r\n * 清理所有监听器\r\n */\r\n public destroy(): void {\r\n this.onFOVChange.clear();\r\n this.onPoseChange.clear();\r\n this.onFrustumShapeChange.clear();\r\n this.onCursorPoseChange.clear();\r\n }\r\n}\r\n\r\n/**\r\n * 全局单例事件总线实例\r\n * 用于跨组件通信\r\n * \r\n * 使用 window 对象存储确保真正的单例,\r\n * 避免 npm link 导致的多实例问题\r\n */\r\nconst GLOBAL_KEY = '__gisManager_globalCameraEventBus__';\r\n\r\nfunction getGlobalEventBus(): CameraEventBus {\r\n if (typeof window !== 'undefined') {\r\n if (!(window as any)[GLOBAL_KEY]) {\r\n (window as any)[GLOBAL_KEY] = new CameraEventBus();\r\n }\r\n return (window as any)[GLOBAL_KEY];\r\n }\r\n // Node.js 环境回退\r\n return new CameraEventBus();\r\n}\r\n\r\nexport const globalCameraEventBus = getGlobalEventBus();\r\n","import type * as Cesium from 'cesium';\r\nimport { Emitter } from '../utils/events';\r\nimport type { ImageryOptions, TerrainOptions } from '../types/public';\r\n\r\nexport type LayerType = 'terrain' | 'imagery' | 'tileset' | 'datasource';\r\n\r\nexport interface LayerHandle {\r\n id: string;\r\n type: LayerType;\r\n dispose(): void;\r\n}\r\n\r\nexport interface LayerEvents {\r\n added: LayerHandle;\r\n removed: LayerHandle;\r\n error: { id?: string; error: unknown };\r\n}\r\n\r\nexport interface PhotoBillboardItem {\r\n lon: number;\r\n lat: number;\r\n height?: number;\r\n imgUrl: string;\r\n name?: string;\r\n id?: string;\r\n}\r\n\r\nexport interface PhotoBillboardLayerOptions {\r\n items: PhotoBillboardItem[];\r\n layerName?: string;\r\n size?: number;\r\n preloadImages?: boolean;\r\n}\r\n\r\nexport interface PhotoBillboardResult {\r\n handle: LayerHandle;\r\n dataSource: Cesium.CustomDataSource;\r\n layerName: string;\r\n added: number;\r\n total: number;\r\n}\r\n\r\nlet layerIdSeq = 0;\r\n\r\nexport class LayerManager {\r\n private imageryIdMap = new Map<string, Cesium.ImageryLayer>();\r\n private tilesetIdMap = new Map<string, Cesium.Cesium3DTileset>();\r\n private dataSourceIdMap = new Map<string, Cesium.CustomDataSource>();\r\n private terrainId?: string;\r\n public events = new Emitter<LayerEvents>();\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Cesium.Viewer,\r\n ) {}\r\n\r\n addDOM(options: ImageryOptions): LayerHandle | undefined {\r\n try {\r\n const provider = this.createImageryProvider(options);\r\n if (!provider) return undefined;\r\n const layer = (this.viewer.imageryLayers as any).addImageryLayer\r\n ? (this.viewer.imageryLayers as any).addImageryLayer(provider)\r\n : (this.viewer.imageryLayers.addImageryProvider?.(provider) ??\r\n (this.viewer.imageryLayers as any).addImageryProvider?.(provider));\r\n const id = `img_${++layerIdSeq}`;\r\n this.imageryIdMap.set(id, layer);\r\n if (typeof options.opacity === 'number') layer.alpha = options.opacity;\r\n const handle: LayerHandle = { id, type: 'imagery', dispose: () => this.remove(id) };\r\n this.events.emit({ added: handle } as any);\r\n return handle;\r\n } catch (error) {\r\n this.events.emit({ error: { error } } as any);\r\n return undefined;\r\n }\r\n }\r\n\r\n async addDEM(options: TerrainOptions): Promise<LayerHandle | undefined> {\r\n try {\r\n const tp = await this.createTerrain(options);\r\n if (!tp) return undefined;\r\n this.viewer.terrainProvider = tp;\r\n const id = (this.terrainId = `ter_${++layerIdSeq}`);\r\n const handle: LayerHandle = { id, type: 'terrain', dispose: () => this.remove(id) };\r\n this.events.emit({ added: handle } as any);\r\n return handle;\r\n } catch (error) {\r\n this.events.emit({ error: { error } } as any);\r\n return undefined;\r\n }\r\n }\r\n\r\n async addDSM(options: {\r\n url: string;\r\n show?: boolean;\r\n maximumScreenSpaceError?: number;\r\n }): Promise<LayerHandle | undefined> {\r\n try {\r\n const tileset = await (this.CesiumNS as any).Cesium3DTileset.fromUrl(options.url, {\r\n show: options.show ?? true,\r\n maximumScreenSpaceError: options.maximumScreenSpaceError ?? 16,\r\n requestWaterMask: true,\r\n requestVertexNormals: true,\r\n });\r\n this.viewer.scene.primitives.add(tileset);\r\n const id = `dsm_${++layerIdSeq}`;\r\n this.tilesetIdMap.set(id, tileset);\r\n const handle: LayerHandle = { id, type: 'tileset', dispose: () => this.remove(id) };\r\n this.events.emit({ added: handle } as any);\r\n return handle;\r\n } catch (error) {\r\n this.events.emit({ error: { error } } as any);\r\n return undefined;\r\n }\r\n }\r\n\r\n async addPhotoBillboards(options: PhotoBillboardLayerOptions): Promise<PhotoBillboardResult | undefined> {\r\n const { items, layerName = 'photo-billboards', size = 110, preloadImages = true } = options;\r\n const borderColor = '#1e90ff';\r\n const borderWidth = 1;\r\n\r\n if (!Array.isArray(items) || items.length === 0) {\r\n console.warn('[LayerManager] No photo billboard data provided');\r\n return undefined;\r\n }\r\n\r\n const C = this.CesiumNS as any;\r\n let dataSource: Cesium.CustomDataSource | undefined;\r\n\r\n try {\r\n dataSource = new C.CustomDataSource(layerName) as Cesium.CustomDataSource;\r\n this.viewer.dataSources.add(dataSource);\r\n\r\n const baseId = `photo-marker-${Date.now()}`;\r\n let added = 0;\r\n\r\n await Promise.all(\r\n items.map(async (item, index) => {\r\n if (typeof item.lon !== 'number' || typeof item.lat !== 'number' || !item.imgUrl) {\r\n console.warn('[LayerManager] Skipping invalid photo marker:', item);\r\n return;\r\n }\r\n\r\n let billboardImage = item.imgUrl;\r\n if (preloadImages) {\r\n try {\r\n const img = await C.Resource.fetchImage({ url: item.imgUrl });\r\n const bordered = this.composeImageWithBorder(img, size, borderColor, borderWidth);\r\n if (bordered) {\r\n billboardImage = bordered;\r\n }\r\n } catch (error) {\r\n console.error(`[LayerManager] Failed to preload image ${item.imgUrl}`, error);\r\n return;\r\n }\r\n }\r\n\r\n dataSource!.entities.add({\r\n id: item.id || `${baseId}-${index}`,\r\n name: item.name || `图片标记-${index + 1}`,\r\n position: C.Cartesian3.fromDegrees(item.lon, item.lat, item.height ?? 0),\r\n billboard: {\r\n image: billboardImage,\r\n width: size,\r\n height: size,\r\n sizeInMeters: false,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n horizontalOrigin: C.HorizontalOrigin.CENTER,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: new C.PropertyBag({\r\n type: 'photo-marker',\r\n imgUrl: item.imgUrl,\r\n }),\r\n });\r\n\r\n added += 1;\r\n }),\r\n );\r\n\r\n if (!added) {\r\n this.viewer.dataSources.remove(dataSource, true);\r\n return undefined;\r\n }\r\n\r\n const id = `ds_${++layerIdSeq}`;\r\n this.dataSourceIdMap.set(id, dataSource!);\r\n const handle: LayerHandle = { id, type: 'datasource', dispose: () => this.remove(id) };\r\n this.events.emit({ added: handle } as any);\r\n\r\n return {\r\n handle,\r\n dataSource: dataSource!,\r\n layerName,\r\n added,\r\n total: items.length,\r\n };\r\n } catch (error) {\r\n if (dataSource) {\r\n this.viewer.dataSources.remove(dataSource, true);\r\n }\r\n this.events.emit({ error: { error } } as any);\r\n return undefined;\r\n }\r\n }\r\n\r\n setVisible(id: string, visible: boolean): void {\r\n const img = this.imageryIdMap.get(id);\r\n if (img) {\r\n img.show = visible;\r\n return;\r\n }\r\n const ts = this.tilesetIdMap.get(id);\r\n if (ts) {\r\n ts.show = visible;\r\n return;\r\n }\r\n const ds = this.dataSourceIdMap.get(id);\r\n if (ds) ds.show = visible;\r\n }\r\n\r\n setOpacity(id: string, opacity: number): void {\r\n const img = this.imageryIdMap.get(id);\r\n if (img) img.alpha = opacity;\r\n }\r\n\r\n remove(id: string): void {\r\n if (this.imageryIdMap.has(id)) {\r\n const layer = this.imageryIdMap.get(id)!;\r\n this.viewer.imageryLayers.remove(layer, true);\r\n this.imageryIdMap.delete(id);\r\n this.events.emit({ removed: { id, type: 'imagery', dispose: () => {} } } as any);\r\n return;\r\n }\r\n if (this.tilesetIdMap.has(id)) {\r\n const ts = this.tilesetIdMap.get(id)!;\r\n this.viewer.scene.primitives.remove(ts);\r\n this.tilesetIdMap.delete(id);\r\n this.events.emit({ removed: { id, type: 'tileset', dispose: () => {} } } as any);\r\n return;\r\n }\r\n if (this.dataSourceIdMap.has(id)) {\r\n const ds = this.dataSourceIdMap.get(id)!;\r\n this.viewer.dataSources.remove(ds, true);\r\n this.dataSourceIdMap.delete(id);\r\n this.events.emit({ removed: { id, type: 'datasource', dispose: () => {} } } as any);\r\n return;\r\n }\r\n if (this.terrainId === id) {\r\n // reset to ellipsoid\r\n this.viewer.terrainProvider = new (this.CesiumNS as any).EllipsoidTerrainProvider();\r\n this.events.emit({ removed: { id, type: 'terrain', dispose: () => {} } } as any);\r\n this.terrainId = undefined;\r\n }\r\n }\r\n\r\n private composeImageWithBorder(\r\n source: CanvasImageSource,\r\n size: number,\r\n borderColor: string,\r\n borderWidth: number,\r\n ): string | undefined {\r\n if (typeof document === 'undefined') return undefined;\r\n const canvas = document.createElement('canvas');\r\n canvas.width = size;\r\n canvas.height = size;\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return undefined;\r\n\r\n ctx.clearRect(0, 0, size, size);\r\n const innerSize = Math.max(size - borderWidth * 2, 1);\r\n ctx.drawImage(source, borderWidth, borderWidth, innerSize, innerSize);\r\n ctx.strokeStyle = borderColor;\r\n ctx.lineWidth = borderWidth;\r\n const inset = borderWidth / 2;\r\n ctx.strokeRect(inset, inset, size - borderWidth, size - borderWidth);\r\n return canvas.toDataURL('image/png');\r\n }\r\n\r\n private createImageryProvider(options: ImageryOptions): Cesium.ImageryProvider | undefined {\r\n const C = this.CesiumNS as any;\r\n const zr = (options as any).zoomRange as { min?: number; max?: number } | undefined;\r\n const minLevel = typeof zr?.min === 'number' ? zr!.min : undefined;\r\n const maxLevel = typeof zr?.max === 'number' ? zr!.max : undefined;\r\n\r\n let bounds: [number, number, number, number] = (options as any).rectangle as any;\r\n console.log('[demo] bounds!!', bounds);\r\n // Heuristic reorder to [W,S,E,N] if second value looks like longitude and third like latitude\r\n if (Math.abs(bounds[1]) > 90 && Math.abs(bounds[2]) <= 90) {\r\n bounds = [bounds[0], bounds[2], bounds[1], bounds[3]];\r\n console.warn('[demo] Reordered bounds to [W,S,E,N]:', bounds);\r\n }\r\n\r\n const rectDeg = bounds; \r\n const rectangle = rectDeg\r\n ? C.Rectangle.fromDegrees(rectDeg[0], rectDeg[1], rectDeg[2], rectDeg[3])\r\n : undefined;\r\n switch (options.provider) {\r\n case 'urlTemplate':\r\n return new C.UrlTemplateImageryProvider({\r\n url: options.url,\r\n // Apply zoom constraints if provided\r\n minimumLevel: minLevel,\r\n maximumLevel: maxLevel,\r\n rectangle,\r\n });\r\n case 'wmts':\r\n return new C.WebMapTileServiceImageryProvider({\r\n url: options.url,\r\n layer: (options as any).layer,\r\n style: (options as any).style ?? 'default',\r\n tileMatrixSetID: (options as any).tileMatrixSetID,\r\n format: (options as any).format ?? 'image/png',\r\n });\r\n case 'wms':\r\n return new C.WebMapServiceImageryProvider({\r\n url: options.url,\r\n layers: (options as any).layers,\r\n parameters: (options as any).parameters,\r\n });\r\n case 'arcgis':\r\n return new C.ArcGisMapServerImageryProvider({ url: options.url });\r\n default:\r\n return undefined;\r\n }\r\n }\r\n\r\n private async createTerrain(\r\n options: TerrainOptions,\r\n ): Promise<Cesium.TerrainProvider | undefined> {\r\n const C = this.CesiumNS as any;\r\n switch (options.type) {\r\n case 'ellipsoid':\r\n return new C.EllipsoidTerrainProvider();\r\n case 'cesium-ion': {\r\n const assetId = (options.ionAssetId ?? (options as any).assetId ?? 1) as number;\r\n // Prefer the modern factory if available\r\n // if (C.CesiumTerrainProvider?.fromIonAssetId) {\r\n // return await C.CesiumTerrainProvider.fromIonAssetId(assetId, {\r\n // requestVertexNormals: true,\r\n // requestWaterMask: true,\r\n // });\r\n // }\r\n // Fallback: build an Ion resource and pass to fromUrl\r\n const IonResource = C.IonResource ?? C.Resource;\r\n if (IonResource?.fromAssetId) {\r\n const resource = await IonResource.fromAssetId(assetId);\r\n return await C.CesiumTerrainProvider.fromUrl(resource, {\r\n requestVertexNormals: true,\r\n requestWaterMask: true,\r\n });\r\n }\r\n // As an ultimate fallback, try world terrain helper if present\r\n if (C.createWorldTerrain) {\r\n return C.createWorldTerrain({\r\n requestVertexNormals: true,\r\n requestWaterMask: true,\r\n });\r\n }\r\n return undefined;\r\n }\r\n case 'url':\r\n // Use the recommended async factory\r\n return await C.CesiumTerrainProvider.fromUrl(options.url, {\r\n requestVertexNormals: true,\r\n requestWaterMask: true,\r\n });\r\n default:\r\n return undefined;\r\n }\r\n }\r\n\r\n // Helper getters to retrieve underlying Cesium primitives by id\r\n getImageryLayer(id: string): Cesium.ImageryLayer | undefined {\r\n return this.imageryIdMap.get(id);\r\n }\r\n\r\n getTileset(id: string): Cesium.Cesium3DTileset | undefined {\r\n return this.tilesetIdMap.get(id);\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\nexport type Toggle2D3DOptions = {\r\n orthographicWidth?: number; // reserved for potential future use; ignored for now in 2D mode\r\n pitch3D?: number;\r\n heading3D?: number;\r\n roll3D?: number;\r\n height3D?: number; // default camera height when switching to 3D\r\n duration?: number; // morph animation duration in seconds\r\n};\r\n\r\nexport type Orientation = { heading: number; pitch: number; roll: number };\r\n\r\nexport interface Toggle2D3DContext {\r\n CesiumNS: typeof Cesium;\r\n viewer: Cesium.Viewer;\r\n getLastPerspectiveOrientation: () => Orientation | undefined;\r\n setLastPerspectiveOrientation: (o: Orientation | undefined) => void;\r\n}\r\n\r\n/**\r\n * Toggle between 3D and 2D scene modes with orientation preservation on return to 3D.\r\n * This utility is framework-agnostic and only depends on Cesium viewer and a tiny state bridge.\r\n */\r\nexport function toggle2D3D(ctx: Toggle2D3DContext, options?: Toggle2D3DOptions): void {\r\n const C: any = ctx.CesiumNS as any;\r\n const scene: any = (ctx.viewer as any).scene;\r\n const cam = (ctx.viewer as any).camera;\r\n const duration = options?.duration ?? 0;\r\n\r\n // Reset any transforms to avoid unexpected lookAt matrices affecting orientation\r\n (ctx.viewer as any).trackedEntity = undefined as any;\r\n (ctx.viewer as any).camera.lookAtTransform(ctx.CesiumNS.Matrix4.IDENTITY);\r\n\r\n const mode = scene.mode;\r\n const is3D = mode === C.SceneMode.SCENE3D;\r\n // console.log('[toggle2D3D] start, is3D =', is3D, 'duration =', duration);\r\n\r\n // Helper: capture the lon/lat under the canvas center to avoid hemisphere flips across modes\r\n const captureCenterLonLat = (): { lon: number; lat: number } | undefined => {\r\n try {\r\n const canvas: HTMLCanvasElement = scene.canvas;\r\n const cx = (canvas as any).clientWidth ? canvas.clientWidth / 2 : canvas.width / 2;\r\n const cy = (canvas as any).clientHeight ? canvas.clientHeight / 2 : canvas.height / 2;\r\n const win = new C.Cartesian2(cx, cy);\r\n const ellipsoid = scene.globe?.ellipsoid ?? C.Ellipsoid.WGS84;\r\n // Prefer precise ground point under the window center\r\n const p = cam.pickEllipsoid?.(win, ellipsoid) ?? (() => {\r\n const ray = cam.getPickRay?.(win);\r\n return ray ? scene.globe?.pick?.(ray, scene) : undefined;\r\n })();\r\n if (p) {\r\n const carto = C.Cartographic.fromCartesian(p);\r\n const res = {\r\n lon: C.Math.toDegrees(carto.longitude),\r\n lat: C.Math.toDegrees(carto.latitude),\r\n };\r\n // NOTE: don't spam too much here; print once per call\r\n // console.log('[toggle2D3D] captureCenterLonLat via pick:', res);\r\n return res;\r\n }\r\n\r\n // Fallback: in 2D, use camera.positionCartographic instead of fromCartesian(cam.position)\r\n const pc = cam.positionCartographic;\r\n if (pc) {\r\n const res = {\r\n lon: C.Math.toDegrees(pc.longitude),\r\n lat: C.Math.toDegrees(pc.latitude),\r\n };\r\n // console.log('[toggle2D3D] captureCenterLonLat via camera.positionCartographic:', res);\r\n return res;\r\n }\r\n return undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n };\r\n\r\n // Capture current camera view (center lon/lat and current height/orientation) before morph\r\n let capturedCenterLonLat: { lon: number; lat: number } | undefined;\r\n let capturedLonLatHeight: { lon: number; lat: number; height: number } | undefined;\r\n let capturedOrientation: Orientation | undefined;\r\n try {\r\n capturedCenterLonLat = captureCenterLonLat();\r\n // Use positionCartographic when available (correct in 2D), fallback to fromCartesian only in 3D context\r\n const pc = cam.positionCartographic ?? ctx.CesiumNS.Cartographic.fromCartesian(cam.position);\r\n capturedLonLatHeight = {\r\n lon: ctx.CesiumNS.Math.toDegrees(pc.longitude),\r\n lat: ctx.CesiumNS.Math.toDegrees(pc.latitude),\r\n height: pc.height,\r\n };\r\n capturedOrientation = {\r\n heading: cam.heading ?? 0,\r\n pitch: cam.pitch ?? -0.8,\r\n roll: cam.roll ?? 0,\r\n };\r\n // console.log('[toggle2D3D] capturedCenterLonLat =', capturedCenterLonLat);\r\n // console.log('[toggle2D3D] capturedLonLatHeight =', capturedLonLatHeight);\r\n // console.log('[toggle2D3D] capturedOrientation =', capturedOrientation);\r\n } catch {\r\n // ignore capture failure; will fall back to existing behavior\r\n }\r\n\r\n if (is3D) {\r\n // Save current 3D orientation for later restoration\r\n ctx.setLastPerspectiveOrientation({\r\n heading: cam.heading ?? 0,\r\n pitch: cam.pitch ?? -0.8,\r\n roll: cam.roll ?? 0,\r\n });\r\n // Switch to 2D map mode\r\n const onComplete = () => {\r\n // console.log('[toggle2D3D] morphTo2D complete');\r\n try {\r\n // Prefer restoring to the center lon/lat we were looking at, to avoid E/W flips\r\n const center = capturedCenterLonLat ?? (capturedLonLatHeight && { lon: capturedLonLatHeight.lon, lat: capturedLonLatHeight.lat });\r\n if (center) {\r\n const dest = ctx.CesiumNS.Cartesian3.fromDegrees(\r\n center.lon,\r\n center.lat,\r\n Math.max(1, capturedLonLatHeight?.height ?? 1000),\r\n );\r\n (ctx.viewer as any).camera.setView({\r\n destination: dest,\r\n orientation: capturedOrientation,\r\n } as any);\r\n const cur = captureCenterLonLat();\r\n if (cur) {\r\n // console.log('[toggle2D3D] after 3D->2D setView center =', cur, 'expect =', center, 'delta(deg)=', { dLon: (cur.lon - center.lon).toFixed(6), dLat: (cur.lat - center.lat).toFixed(6) });\r\n }\r\n }\r\n } catch {\r\n /* ignore */\r\n } finally {\r\n scene.morphComplete?.removeEventListener?.(onComplete);\r\n }\r\n };\r\n scene.morphComplete?.addEventListener?.(onComplete);\r\n scene.morphTo2D(duration);\r\n } else {\r\n // Switch to 3D and restore the last saved orientation if available\r\n const saved = ctx.getLastPerspectiveOrientation();\r\n const defaultHeight3D = options?.height3D ?? 1500;\r\n // Prefer explicit options for heading/pitch/roll; otherwise use sensible defaults.\r\n const restoreOrientation: Orientation = {\r\n heading: options?.heading3D ?? (saved?.heading ?? 0),\r\n // Force a stable 3D pitch default even if saved is odd or unavailable\r\n pitch: options?.pitch3D ?? -0.8,\r\n roll: options?.roll3D ?? (saved?.roll ?? 0),\r\n };\r\n\r\n const onComplete = () => {\r\n // console.log('[toggle2D3D] morphTo3D complete');\r\n try {\r\n const center = capturedCenterLonLat ?? (capturedLonLatHeight && { lon: capturedLonLatHeight.lon, lat: capturedLonLatHeight.lat });\r\n if (center) {\r\n // 使用两步法确保目标点绝对居中:\r\n // 1) 先用俯视(top-down)姿态锁定在目标点正上方\r\n const target = ctx.CesiumNS.Cartesian3.fromDegrees(center.lon, center.lat);\r\n const safeRange0 = capturedLonLatHeight?.height ?? defaultHeight3D;\r\n const range0 = ctx.CesiumNS.Math.clamp(safeRange0, 50, 5_000_000);\r\n // console.log('[toggle2D3D] restoreOrientation =', restoreOrientation, 'range0 =', range0, 'center =', center);\r\n\r\n const camAny: any = (ctx.viewer as any).camera;\r\n camAny.lookAt(\r\n target,\r\n new (ctx.CesiumNS as any).HeadingPitchRange(\r\n 0,\r\n -Math.PI / 2, // 直视向下,确保目标点成为中心\r\n range0,\r\n ),\r\n );\r\n\r\n // 2) 在保持同一 target 的前提下,应用期望的 heading/pitch/roll\r\n camAny.lookAt(\r\n target,\r\n new (ctx.CesiumNS as any).HeadingPitchRange(\r\n restoreOrientation.heading,\r\n restoreOrientation.pitch,\r\n range0,\r\n ),\r\n );\r\n\r\n // 3) 解除 ENU 变换以免锁定相机,但保持当前视图(将局部坐标转换到世界坐标后再解除)\r\n const t = ctx.CesiumNS.Matrix4.clone(camAny.transform);\r\n const worldPos = ctx.CesiumNS.Matrix4.multiplyByPoint(\r\n t,\r\n camAny.position,\r\n new ctx.CesiumNS.Cartesian3(),\r\n );\r\n const worldDir = ctx.CesiumNS.Matrix4.multiplyByPointAsVector(\r\n t,\r\n camAny.direction,\r\n new ctx.CesiumNS.Cartesian3(),\r\n );\r\n const worldUp = ctx.CesiumNS.Matrix4.multiplyByPointAsVector(\r\n t,\r\n camAny.up,\r\n new ctx.CesiumNS.Cartesian3(),\r\n );\r\n // 归一化方向与上向量\r\n ctx.CesiumNS.Cartesian3.normalize(worldDir, worldDir);\r\n ctx.CesiumNS.Cartesian3.normalize(worldUp, worldUp);\r\n camAny.lookAtTransform(ctx.CesiumNS.Matrix4.IDENTITY);\r\n camAny.setView({ destination: worldPos, orientation: { direction: worldDir, up: worldUp } as any } as any);\r\n\r\n const cur = captureCenterLonLat();\r\n if (cur) {\r\n // console.log('[toggle2D3D] after 2D->3D lookAt center =', cur, 'expect =', center, 'delta(deg)=', { dLon: (cur.lon - center.lon).toFixed(6), dLat: (cur.lat - center.lat).toFixed(6) });\r\n } else {\r\n // console.log('[toggle2D3D] after 2D->3D lookAt center pick failed');\r\n }\r\n // const pcNow = cam.positionCartographic ?? ctx.CesiumNS.Cartographic.fromCartesian(cam.position);\r\n // console.log('[toggle2D3D] camera now carto =', {\r\n // lon: ctx.CesiumNS.Math.toDegrees(pcNow.longitude),\r\n // lat: ctx.CesiumNS.Math.toDegrees(pcNow.latitude),\r\n // height: pcNow.height,\r\n // heading: cam.heading,\r\n // pitch: cam.pitch,\r\n // roll: cam.roll,\r\n // });\r\n } else {\r\n (ctx.viewer as any).camera.setView({ orientation: restoreOrientation } as any);\r\n }\r\n } catch {\r\n /* ignore */\r\n } finally {\r\n scene.morphComplete?.removeEventListener?.(onComplete);\r\n }\r\n };\r\n scene.morphComplete?.addEventListener?.(onComplete);\r\n scene.morphTo3D(duration);\r\n }\r\n\r\n scene.requestRender?.();\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { toggle2D3D as toggle2D3DHelper } from './toggle2D3D';\r\nimport type { Toggle2D3DOptions } from './toggle2D3D';\r\nimport type {\r\n CameraView,\r\n CameraDestinationInput as LonLatInput,\r\n CameraOrientation as OrientationInput,\r\n CameraFlyOptions as EasyArgs,\r\n} from '../types/public';\r\n\r\nexport interface FlyToOptions {\r\n duration?: number;\r\n}\r\n\r\nexport interface PathOptions {\r\n speed?: number; // meters per second equivalent for duration calc\r\n loop?: boolean;\r\n}\r\n\r\nexport class CameraManager {\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Cesium.Viewer,\r\n ) { }\r\n\r\n // Remember last perspective orientation so we can restore it when toggling back\r\n private _lastPerspectiveOrientation?: { heading: number; pitch: number; roll: number };\r\n\r\n // Remember state for birds-eye view toggle\r\n private _isBirdsEyeView: boolean = false;\r\n private _beforeBirdsEye?: {\r\n position: any;\r\n orientation: { heading: number; pitch: number; roll: number };\r\n frustumType: 'perspective' | 'orthographic';\r\n orthographicWidth?: number;\r\n };\r\n\r\n private parseLonLat(input: LonLatInput): { lon?: number; lat?: number; height?: number } {\r\n if (Array.isArray(input)) {\r\n const [lon, lat, h] = [input[0], input[1], (input as [number, number, number])[2]];\r\n return { lon, lat, height: h };\r\n }\r\n if ('lon' in input && 'lat' in input)\r\n return { lon: input.lon, lat: input.lat, height: input.height };\r\n if ('lng' in input && 'lat' in input)\r\n return { lon: (input as any).lng, lat: input.lat, height: input.height };\r\n if ('longitude' in input && 'latitude' in input)\r\n return { lon: (input as any).longitude, lat: (input as any).latitude, height: input.height };\r\n return {};\r\n }\r\n\r\n initCamera(\r\n destination: LonLatInput | EasyArgs,\r\n height?: number,\r\n orientation?: OrientationInput,\r\n ): void {\r\n let lon: number | undefined;\r\n let lat: number | undefined;\r\n let h: number | undefined;\r\n let ori: OrientationInput | undefined = orientation;\r\n if ((destination as EasyArgs).destination) {\r\n const args = destination as EasyArgs;\r\n const parsed = this.parseLonLat(args.destination);\r\n lon = parsed.lon;\r\n lat = parsed.lat;\r\n h = parsed.height ?? args.height;\r\n ori = args.orientation ?? orientation;\r\n } else {\r\n const parsed = this.parseLonLat(destination as LonLatInput);\r\n lon = parsed.lon;\r\n lat = parsed.lat;\r\n h = parsed.height ?? height;\r\n }\r\n if (lon == null || lat == null) return;\r\n const finalHeight = h ?? 1500;\r\n const dest = this.CesiumNS.Cartesian3.fromDegrees(lon, lat, finalHeight);\r\n this.viewer.trackedEntity = undefined as any;\r\n this.viewer.camera.lookAtTransform(this.CesiumNS.Matrix4.IDENTITY);\r\n this.setView({ destination: dest, heading: ori?.heading, pitch: ori?.pitch, roll: ori?.roll });\r\n (this.viewer.scene as any).requestRender?.();\r\n }\r\n\r\n setPerspective(): void {\r\n const C = this.CesiumNS as any;\r\n const canvas: HTMLCanvasElement | undefined = (this.viewer.scene as any)?.canvas;\r\n const aspect =\r\n canvas && canvas.clientHeight > 0 ? canvas.clientWidth / canvas.clientHeight : 1.0;\r\n const pf = new C.PerspectiveFrustum();\r\n pf.fov = C.Math.toRadians(60); // a reasonable default vertical FOV\r\n pf.aspectRatio = aspect;\r\n pf.near = 0.1;\r\n pf.far = 1.0e8;\r\n this.viewer.scene.camera.frustum = pf;\r\n }\r\n\r\n setOrthographic(width = 1000000): void {\r\n const C = this.CesiumNS as any;\r\n const canvas: HTMLCanvasElement | undefined = (this.viewer.scene as any)?.canvas;\r\n const aspect =\r\n canvas && canvas.clientHeight > 0 ? canvas.clientWidth / canvas.clientHeight : 1.0;\r\n const frustum = new C.OrthographicFrustum();\r\n frustum.width = width; // horizontal width in meters at the near plane\r\n frustum.aspectRatio = aspect;\r\n frustum.near = 0.1;\r\n frustum.far = 1.0e8;\r\n this.viewer.scene.camera.frustum = frustum;\r\n }\r\n\r\n /**\r\n * Toggle between 2D and 3D scene modes while preserving and restoring a 3D orientation.\r\n */\r\n toggle2D3D(options?: Toggle2D3DOptions): void {\r\n toggle2D3DHelper(\r\n {\r\n CesiumNS: this.CesiumNS,\r\n viewer: this.viewer,\r\n getLastPerspectiveOrientation: () => this._lastPerspectiveOrientation,\r\n setLastPerspectiveOrientation: (o) => {\r\n this._lastPerspectiveOrientation = o;\r\n },\r\n },\r\n options,\r\n );\r\n }\r\n\r\n /**\r\n * @deprecated Use toggle2D3D instead.\r\n */\r\n toggleBirdsEye3D(options?: Toggle2D3DOptions): void {\r\n this.toggle2D3D(options);\r\n }\r\n\r\n /**\r\n * 切换鸟瞰视角(垂直俯视)\r\n * 在当前3D场景中切换到垂直向下的俯视角度,并可选择使用正交投影\r\n *\r\n * @param options 配置选项\r\n * @param options.useOrthographic 是否使用正交投影(默认false,使用透视投影)\r\n * @param options.height 鸟瞰高度(米,默认自动计算)\r\n * @param options.orthographicWidth 正交视图宽度(米,默认1000000)\r\n * @param options.duration 飞行动画时长(秒,默认1.0)\r\n *\r\n * @example\r\n * ```typescript\r\n * // 切换到鸟瞰视角(透视投影)\r\n * cameraManager.toggleBirdsEyeView();\r\n *\r\n * // 切换到鸟瞰视角(正交投影)\r\n * cameraManager.toggleBirdsEyeView({ useOrthographic: true });\r\n *\r\n * // 自定义高度和宽度\r\n * cameraManager.toggleBirdsEyeView({\r\n * useOrthographic: true,\r\n * height: 50000,\r\n * orthographicWidth: 500000\r\n * });\r\n * ```\r\n */\r\n toggleBirdsEyeView(options?: {\r\n useOrthographic?: boolean;\r\n height?: number;\r\n orthographicWidth?: number;\r\n duration?: number;\r\n }): void {\r\n const duration = options?.duration ?? 1.0;\r\n\r\n if (this._isBirdsEyeView) {\r\n // 恢复到之前的视角\r\n this.restoreFromBirdsEye(duration);\r\n } else {\r\n // 切换到鸟瞰视角\r\n this.enterBirdsEyeView(options);\r\n }\r\n }\r\n\r\n /**\r\n * 进入鸟瞰视角\r\n */\r\n private enterBirdsEyeView(options?: {\r\n useOrthographic?: boolean;\r\n height?: number;\r\n orthographicWidth?: number;\r\n duration?: number;\r\n }): void {\r\n const C = this.CesiumNS as any;\r\n const camera = this.viewer.camera;\r\n const duration = options?.duration ?? 1.0;\r\n\r\n // 保存当前状态\r\n try {\r\n const currentPosition = camera.position.clone();\r\n const currentFrustum = camera.frustum;\r\n const isOrthographic = currentFrustum instanceof C.OrthographicFrustum;\r\n\r\n this._beforeBirdsEye = {\r\n position: currentPosition,\r\n orientation: {\r\n heading: camera.heading ?? 0,\r\n pitch: camera.pitch ?? -0.8,\r\n roll: camera.roll ?? 0,\r\n },\r\n frustumType: isOrthographic ? 'orthographic' : 'perspective',\r\n orthographicWidth: isOrthographic ? (currentFrustum as any).width : undefined,\r\n };\r\n } catch (error) {\r\n console.error('[CameraManager] Failed to save camera state:', error);\r\n }\r\n\r\n // 获取当前位置\r\n let currentLonLatHeight: { lon: number; lat: number; height: number };\r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(camera.position);\r\n currentLonLatHeight = {\r\n lon: C.Math.toDegrees(cartographic.longitude),\r\n lat: C.Math.toDegrees(cartographic.latitude),\r\n height: cartographic.height,\r\n };\r\n } catch {\r\n // 如果获取失败,使用默认值\r\n currentLonLatHeight = { lon: 0, lat: 0, height: 10000 };\r\n }\r\n\r\n // 计算鸟瞰高度\r\n const birdsEyeHeight = options?.height ?? Math.max(currentLonLatHeight.height, 5000);\r\n\r\n // 设置鸟瞰视角(垂直向下)\r\n const destination = C.Cartesian3.fromDegrees(\r\n currentLonLatHeight.lon,\r\n currentLonLatHeight.lat,\r\n birdsEyeHeight,\r\n );\r\n\r\n // 飞到鸟瞰位置\r\n camera.flyTo({\r\n destination,\r\n orientation: {\r\n heading: 0,\r\n pitch: C.Math.toRadians(-90), // 垂直向下\r\n roll: 0,\r\n },\r\n duration,\r\n complete: () => {\r\n // 如果需要,切换到正交投影\r\n if (options?.useOrthographic) {\r\n this.setOrthographic(options.orthographicWidth ?? 1000000);\r\n }\r\n this._isBirdsEyeView = true;\r\n },\r\n });\r\n }\r\n\r\n // Fly to a specified lon, lat, height (in meters). In 3D mode, ensure the given lon, lat is at the center of the view.\r\n flyToSimple(lon: number, lat: number, height?: number): void {\r\n height = height ?? 500;\r\n\r\n const is3D = this.viewer?.scene?.mode === this.CesiumNS.SceneMode.SCENE3D;\r\n if (is3D) {\r\n // 在 3D 下确保以指定经纬度为视角中心:使用 BoundingSphere + HeadingPitchRange\r\n const target = this.CesiumNS.Cartesian3.fromDegrees(lon, lat, 0);\r\n const desiredHeight = height; // 期望近似高度\r\n const pitch = this.CesiumNS.Math.toRadians(-45);\r\n const sinPitch = Math.sin(Math.abs(pitch)) || 1; // 避免除以 0\r\n const range = desiredHeight / sinPitch; // 使相机高度约等于 desiredHeight\r\n const heading = 0; // 北向\r\n this.viewer.camera.flyToBoundingSphere(new this.CesiumNS.BoundingSphere(target, 1.0), {\r\n offset: new this.CesiumNS.HeadingPitchRange(heading, pitch, range),\r\n duration: 2.0,\r\n });\r\n } else {\r\n // 2D 保持垂直俯视\r\n this.flyToEasy({\r\n destination: [lon, lat],\r\n height: height,\r\n orientation: { pitch: this.CesiumNS.Math.toRadians(-90) },\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 从鸟瞰视角恢复\r\n */\r\n private restoreFromBirdsEye(duration: number = 1.0): void {\r\n if (!this._beforeBirdsEye) {\r\n this._isBirdsEyeView = false;\r\n return;\r\n }\r\n\r\n const C = this.CesiumNS as any;\r\n const camera = this.viewer.camera;\r\n const saved = this._beforeBirdsEye;\r\n\r\n // 先恢复投影类型(如果需要)\r\n if (saved.frustumType === 'perspective') {\r\n const currentFrustum = camera.frustum;\r\n if (currentFrustum instanceof C.OrthographicFrustum) {\r\n this.setPerspective();\r\n }\r\n } else if (saved.frustumType === 'orthographic' && saved.orthographicWidth) {\r\n const currentFrustum = camera.frustum;\r\n if (!(currentFrustum instanceof C.OrthographicFrustum)) {\r\n this.setOrthographic(saved.orthographicWidth);\r\n }\r\n }\r\n\r\n // 飞回之前的位置和方向\r\n camera.flyTo({\r\n destination: saved.position,\r\n orientation: saved.orientation,\r\n duration,\r\n complete: () => {\r\n this._isBirdsEyeView = false;\r\n this._beforeBirdsEye = undefined;\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * 设置为鸟瞰视角(不切换,直接设置)\r\n *\r\n * @param options 配置选项\r\n * @param options.useOrthographic 是否使用正交投影\r\n * @param options.height 鸟瞰高度\r\n * @param options.orthographicWidth 正交视图宽度\r\n */\r\n setBirdsEyeView(options?: {\r\n useOrthographic?: boolean;\r\n height?: number;\r\n orthographicWidth?: number;\r\n }): void {\r\n const C = this.CesiumNS as any;\r\n const camera = this.viewer.camera;\r\n\r\n // 获取当前位置\r\n let currentLonLatHeight: { lon: number; lat: number; height: number };\r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(camera.position);\r\n currentLonLatHeight = {\r\n lon: C.Math.toDegrees(cartographic.longitude),\r\n lat: C.Math.toDegrees(cartographic.latitude),\r\n height: cartographic.height,\r\n };\r\n } catch {\r\n currentLonLatHeight = { lon: 0, lat: 0, height: 10000 };\r\n }\r\n\r\n const birdsEyeHeight = options?.height ?? Math.max(currentLonLatHeight.height, 5000);\r\n const destination = C.Cartesian3.fromDegrees(\r\n currentLonLatHeight.lon,\r\n currentLonLatHeight.lat,\r\n birdsEyeHeight,\r\n );\r\n\r\n // 设置鸟瞰视角\r\n camera.setView({\r\n destination,\r\n orientation: {\r\n heading: 0,\r\n pitch: C.Math.toRadians(-90),\r\n roll: 0,\r\n },\r\n });\r\n\r\n // 如果需要,切换到正交投影\r\n if (options?.useOrthographic) {\r\n this.setOrthographic(options.orthographicWidth ?? 1000000);\r\n }\r\n\r\n this._isBirdsEyeView = true;\r\n }\r\n\r\n /**\r\n * 检查当前是否处于鸟瞰视角\r\n */\r\n isBirdsEyeView(): boolean {\r\n return this._isBirdsEyeView;\r\n }\r\n\r\n setView(view: CameraView): void {\r\n const { destination, heading = 0, pitch = -Math.PI / 4, roll = 0 } = view;\r\n this.viewer.camera.setView({ destination, orientation: { heading, pitch, roll } });\r\n }\r\n\r\n // Debug helper: move camera to Chengdu, Sichuan\r\n moveToChengdu(): void {\r\n const lon = 104.0665;\r\n const lat = 30.5728;\r\n const height = 2000;\r\n const dest = this.CesiumNS.Cartesian3.fromDegrees(lon, lat, height);\r\n this.viewer.trackedEntity = undefined as any;\r\n this.viewer.camera.lookAtTransform(this.CesiumNS.Matrix4.IDENTITY);\r\n this.viewer.camera.setView({\r\n destination: dest,\r\n orientation: { heading: 0, pitch: -0.8, roll: 0 },\r\n });\r\n }\r\n\r\n isitwork(): void {\r\n console.log('isitwork!!!!!!!!', this.viewer);\r\n console.log('isitwork cesium!!!!!!!!', this.CesiumNS);\r\n this.viewer.camera.setView({\r\n destination: this.CesiumNS.Cartesian3.fromDegrees(-117.16, 32.71, 15000.0),\r\n });\r\n }\r\n\r\n setViewEasy(args: { destination: LonLatInput; orientation?: OrientationInput }): void {\r\n const parsed = this.parseLonLat(args.destination);\r\n const lon = parsed.lon;\r\n const lat = parsed.lat;\r\n const h = parsed.height ?? 1500;\r\n if (lon == null || lat == null) return;\r\n const dest = this.CesiumNS.Cartesian3.fromDegrees(lon, lat, h);\r\n this.setView({\r\n destination: dest,\r\n heading: args.orientation?.heading,\r\n pitch: args.orientation?.pitch,\r\n roll: args.orientation?.roll,\r\n });\r\n }\r\n\r\n async flyToTerrain(\r\n bounds: [number, number, number, number],\r\n tp: Cesium.CesiumTerrainProvider,\r\n ): Promise<void> {\r\n const centerLon = (bounds[0] + bounds[2]) / 2;\r\n const centerLat = (bounds[1] + bounds[3]) / 2;\r\n\r\n const sampleCartographic = this.CesiumNS.Cartographic.fromDegrees(centerLon, centerLat);\r\n let cameraHeight = 1500; // 默认\r\n\r\n try {\r\n const availability = (tp as any).availability ?? (tp as any)._availability;\r\n if (availability) {\r\n // 优先使用最高精度采样(需 availability)\r\n const samples = await this.CesiumNS.sampleTerrainMostDetailed(tp as any, [\r\n sampleCartographic,\r\n ]);\r\n const terrainHeight = samples?.[0]?.height ?? 0;\r\n cameraHeight = Math.max(terrainHeight + Math.abs(terrainHeight) * 0.2, 300);\r\n // eslint-disable-next-line no-console\r\n console.log('[demo][DSM] ✓ 获取地形高度', terrainHeight, ',相机高度', cameraHeight);\r\n } else {\r\n // 回退:尝试在一个合理层级采样;若失败则继续使用默认高度\r\n const fallbackLevel = 12;\r\n try {\r\n const samples = await this.CesiumNS.sampleTerrain(tp as any, fallbackLevel, [\r\n sampleCartographic,\r\n ]);\r\n const terrainHeight = samples?.[0]?.height;\r\n if (typeof terrainHeight === 'number') {\r\n cameraHeight = Math.max(terrainHeight + Math.abs(terrainHeight) * 0.2, 300);\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n '[demo][DSM] ⚠️ 地形缺少 availability,使用 fallbackLevel=',\r\n fallbackLevel,\r\n ' 估算高度=',\r\n terrainHeight,\r\n );\r\n } else {\r\n // eslint-disable-next-line no-console\r\n console.warn('[demo][DSM] ⚠️ 估算高度失败,使用默认相机高度', cameraHeight);\r\n }\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.warn('[demo][DSM] ⚠️ sampleTerrain 回退失败,将使用默认相机高度', e);\r\n }\r\n }\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.warn('[demo][DSM] ⚠️ 采样地形高度失败,将使用默认相机高度', e);\r\n }\r\n\r\n this.viewer.camera.flyTo({\r\n destination: this.CesiumNS.Cartesian3.fromDegrees(centerLon, centerLat, cameraHeight),\r\n orientation: {\r\n pitch: this.CesiumNS.Math.toRadians(-90.0),\r\n heading: 0.0,\r\n roll: 0.0,\r\n },\r\n duration: 1.8,\r\n complete: () => {\r\n // 限制相机高度,避免飞出范围太远\r\n this.viewer.camera.constrainedAxis = this.CesiumNS.Cartesian3.UNIT_Z;\r\n this.viewer.scene.screenSpaceCameraController.minimumZoomDistance = 10;\r\n this.viewer.scene.screenSpaceCameraController.maximumZoomDistance = cameraHeight * 5;\r\n // eslint-disable-next-line no-console\r\n console.log('[demo][DSM] ✓ 已飞入地形范围,并限制相机高度');\r\n },\r\n });\r\n }\r\n\r\n flyToEasy(\r\n destination: LonLatInput | EasyArgs,\r\n heightOrOrientation?: number | OrientationInput,\r\n orientationOrDuration?: OrientationInput | number,\r\n duration?: number,\r\n ): void {\r\n let lon: number | undefined;\r\n let lat: number | undefined;\r\n let h: number | undefined;\r\n let orientation: OrientationInput | undefined;\r\n let finalDuration: number | undefined;\r\n\r\n if ((destination as EasyArgs).destination) {\r\n const args = destination as EasyArgs;\r\n const parsed = this.parseLonLat(args.destination);\r\n lon = parsed.lon;\r\n lat = parsed.lat;\r\n h = parsed.height ?? args.height;\r\n orientation = args.orientation;\r\n finalDuration = args.duration;\r\n } else {\r\n const parsed = this.parseLonLat(destination as LonLatInput);\r\n lon = parsed.lon;\r\n lat = parsed.lat;\r\n h = parsed.height;\r\n if (typeof heightOrOrientation === 'number') {\r\n h = h ?? heightOrOrientation;\r\n if (typeof orientationOrDuration === 'number')\r\n finalDuration = orientationOrDuration as number;\r\n else orientation = orientationOrDuration as OrientationInput;\r\n if (typeof duration === 'number') finalDuration = duration;\r\n } else {\r\n orientation = heightOrOrientation as OrientationInput;\r\n if (typeof orientationOrDuration === 'number')\r\n finalDuration = orientationOrDuration as number;\r\n }\r\n }\r\n\r\n const finalHeight = h ?? 1500;\r\n if (lon == null || lat == null) return;\r\n const dest = this.CesiumNS.Cartesian3.fromDegrees(lon, lat, finalHeight);\r\n this.flyTo({ destination: dest, ...orientation }, { duration: finalDuration });\r\n }\r\n\r\n flyTo(view: CameraView, opts?: FlyToOptions): void {\r\n const { destination, heading = 0, pitch = -Math.PI / 4, roll = 0 } = view;\r\n this.viewer.camera.flyTo({\r\n destination,\r\n orientation: { heading, pitch, roll },\r\n duration: opts?.duration ?? 2.0,\r\n });\r\n }\r\n\r\n lookAt(target: any, offset?: any): void {\r\n this.viewer.camera.lookAt(target, offset);\r\n }\r\n\r\n zoom(delta: number): void {\r\n if (delta > 0) this.viewer.camera.zoomIn(delta);\r\n else this.viewer.camera.zoomOut(-delta);\r\n }\r\n\r\n pan(dx: number, dy: number): void {\r\n this.viewer.camera.moveRight(dx);\r\n this.viewer.camera.moveUp(dy);\r\n }\r\n\r\n async followPath(positions: any[], opts?: PathOptions): Promise<void> {\r\n // Simple flyToSequence based on speed heuristic\r\n const duration = opts?.speed ? undefined : 2.0; // fallback duration per segment\r\n for (let i = 0; i < positions.length; i++) {\r\n await this.flyToAsync({ destination: positions[i] }, { duration });\r\n }\r\n }\r\n\r\n flyToRectangle(\r\n rect: Cesium.Rectangle,\r\n opts?: FlyToOptions & { heading?: number; pitch?: number; roll?: number; zoomScale?: number },\r\n ): void {\r\n const C = this.CesiumNS as any;\r\n const bs =\r\n (C.BoundingSphere?.fromRectangle3D?.(rect) ?? C.BoundingSphere?.fromRectangle2D?.(rect)) ||\r\n undefined;\r\n const duration = opts?.duration ?? 2.0;\r\n const heading = opts?.heading ?? 0;\r\n const pitch = opts?.pitch ?? -0.8;\r\n const rangeScale = opts?.zoomScale ?? 1.2; // smaller is closer; 1.2 gives a tighter frame\r\n if (bs && C.HeadingPitchRange) {\r\n const offset = new C.HeadingPitchRange(heading, pitch, Math.max(1, bs.radius * rangeScale));\r\n this.viewer.camera.flyToBoundingSphere(bs, { duration, offset } as any);\r\n } else if (bs) {\r\n this.viewer.camera.flyToBoundingSphere(bs, { duration } as any);\r\n } else {\r\n this.viewer.camera.flyTo({ destination: rect, duration } as any);\r\n }\r\n }\r\n\r\n focusOnImageryLayer(\r\n layer: Cesium.ImageryLayer,\r\n opts?: FlyToOptions & {\r\n heading?: number;\r\n pitch?: number;\r\n roll?: number;\r\n height?: number;\r\n zoomScale?: number;\r\n },\r\n ): void {\r\n const provider: Cesium.ImageryProvider & { ready?: boolean; readyPromise?: Promise<void> } = (\r\n layer as any\r\n ).imageryProvider;\r\n if (provider && provider.ready === false && provider.readyPromise) {\r\n // Wait until provider is ready to ensure rectangle/tilingScheme are populated\r\n provider.readyPromise\r\n .then(() => this.focusOnImageryLayer(layer, opts))\r\n .catch(() => {\r\n /* ignore */\r\n });\r\n return;\r\n }\r\n const rect: Cesium.Rectangle | undefined =\r\n (provider as any)?.rectangle ?? (provider as any)?.tilingScheme?.rectangle;\r\n if (rect) {\r\n // 优先:若有地形高度,则使用“地形高度 + 1000m”作为飞行高度,定位到图层中心\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const center = C.Rectangle.center(rect); // radians Cartographic\r\n const hTerrain = (this.viewer.scene as any)?.globe?.getHeight?.(center);\r\n if (typeof hTerrain === 'number' && isFinite(hTerrain)) {\r\n const base = Math.max(0, hTerrain);\r\n const height = base + 500; // 指定规则:地形高 + 1000m\r\n const dest = C.Cartesian3.fromRadians(center.longitude, center.latitude, height);\r\n // 修改:存在地形时,镜头垂直俯视\r\n const pitch = opts?.pitch ?? C.Math.toRadians(-90);\r\n this.flyTo(\r\n { destination: dest, heading: opts?.heading, pitch, roll: opts?.roll },\r\n { duration: opts?.duration },\r\n );\r\n return;\r\n }\r\n } catch {}\r\n // 回退:按矩形范围框选飞行\r\n this.flyToRectangle(rect, opts as any);\r\n return;\r\n }\r\n // Fallback: try to fly to provider's center if we can estimate one (use global center)\r\n const lon = 0;\r\n const lat = 0;\r\n const height = opts?.height ?? 1500000; // heuristic height\r\n const destination = this.CesiumNS.Cartesian3.fromDegrees(lon, lat, height);\r\n this.flyTo(\r\n { destination, heading: opts?.heading, pitch: opts?.pitch ?? -0.8, roll: opts?.roll },\r\n { duration: opts?.duration },\r\n );\r\n }\r\n\r\n /**\r\n * fly to with promise\r\n * @param view\r\n * @param opts\r\n * @returns\r\n */\r\n private flyToAsync(view: CameraView, opts?: FlyToOptions): Promise<void> {\r\n return new Promise((resolve) => {\r\n const { destination, heading = 0, pitch = -Math.PI / 4, roll = 0 } = view;\r\n this.viewer.camera.flyTo({\r\n destination,\r\n orientation: { heading, pitch, roll },\r\n duration: opts?.duration ?? 2.0,\r\n complete: () => resolve(),\r\n cancel: () => resolve(),\r\n } as any);\r\n });\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { assertCesiumAssetsConfigured, ensureCesiumIonToken } from './assets';\r\nimport { LayerManager } from './LayerManager';\r\nimport { CameraManager } from './CameraManager';\r\nimport {\r\n type CameraView,\r\n type ImageryOptions,\r\n type TerrainOptions,\r\n type CameraInitOptions,\r\n} from '../types/public';\r\n\r\nexport interface SceneOptions {\r\n container: string | HTMLElement;\r\n imagery?: ImageryOptions;\r\n terrain?: TerrainOptions;\r\n initialCamera?: CameraView | CameraInitOptions;\r\n sunlight?: {\r\n enabled: boolean;\r\n time?: Date;\r\n };\r\n shadows?: boolean;\r\n viewerOptions?: Cesium.Viewer.ConstructorOptions;\r\n}\r\n\r\nexport class SceneManager {\r\n private viewer: Cesium.Viewer;\r\n private layerManager: LayerManager;\r\n private cameraManager: CameraManager;\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n options: SceneOptions,\r\n ) {\r\n console.log('SceneManager constructor', options);\r\n assertCesiumAssetsConfigured();\r\n // Ensure the Ion token (if configured) is applied to this Cesium instance\r\n ensureCesiumIonToken(CesiumNS);\r\n const { imagery, terrain, initialCamera, sunlight, shadows, viewerOptions } = options;\r\n\r\n const container = this.resolveContainer(options.container);\r\n this.viewer = new CesiumNS.Viewer(container, {\r\n baseLayer: false,\r\n // 时间控制相关\r\n animation: false,\r\n timeline: false,\r\n // UI控件\r\n geocoder: false,\r\n homeButton: false,\r\n sceneModePicker: false,\r\n baseLayerPicker: false,\r\n navigationHelpButton: false,\r\n fullscreenButton: false,\r\n vrButton: false,\r\n // 信息框\r\n infoBox: false,\r\n selectionIndicator: false,\r\n // 默认数据源\r\n shouldAnimate: false,\r\n // 地形和影像\r\n terrainProvider: undefined,\r\n creditContainer: undefined,\r\n // 其他\r\n contextOptions: {\r\n webgl: {\r\n alpha: true,\r\n depth: true,\r\n stencil: true,\r\n antialias: true,\r\n powerPreference: 'high-performance',\r\n preserveDrawingBuffer: true, // 必需:允许 canvas.toDataURL() 截图\r\n },\r\n },\r\n ...viewerOptions,\r\n });\r\n\r\n // Additional cleanup: hide credit display\r\n // try {\r\n // const creditContainer = (this.viewer as any).cesiumWidget?.creditContainer;\r\n // if (creditContainer) {\r\n // creditContainer.style.display = 'none';\r\n // }\r\n // // Also hide the bottom container\r\n // const bottomContainer = (this.viewer as any).bottomContainer;\r\n // if (bottomContainer) {\r\n // bottomContainer.style.display = 'none';\r\n // }\r\n // } catch {}\r\n\r\n // Create managers\r\n this.layerManager = new LayerManager(CesiumNS, this.viewer);\r\n this.layerManager.events.on((evt) => {\r\n // For now, just log errors; could expose SceneManager-level events later\r\n if ((evt as any).error) {\r\n // eslint-disable-next-line no-console\r\n console.error('[SceneManager] Layer error:', (evt as any).error);\r\n }\r\n });\r\n this.cameraManager = new CameraManager(CesiumNS, this.viewer);\r\n\r\n // Initialize base layers via LayerManager\r\n if (imagery) this.applyImagery(imagery);\r\n if (terrain) this.applyTerrain(terrain);\r\n if (typeof shadows === 'boolean') this.setShadows(shadows);\r\n if (sunlight?.enabled) this.configureSunlight(true, sunlight.time);\r\n if (initialCamera) this.setInitialCamera(initialCamera);\r\n }\r\n\r\n getViewer(): Cesium.Viewer {\r\n return this.viewer;\r\n }\r\n\r\n /**\r\n * Set a black background for areas without imagery. Optionally clear existing base imagery layers.\r\n */\r\n useBlackBackground(removeAllImagery = true): void {\r\n const C = this.CesiumNS as any;\r\n if (removeAllImagery) this.viewer.imageryLayers.removeAll();\r\n this.viewer.scene.globe.baseColor = C.Color.BLACK;\r\n }\r\n\r\n destroy(): void {\r\n this.viewer?.destroy();\r\n // @ts-expect-error\r\n this.viewer = undefined;\r\n }\r\n\r\n configureSunlight(enabled: boolean, datetime?: Date): void {\r\n const { CesiumNS } = this;\r\n const scene = this.viewer.scene;\r\n scene.globe.enableLighting = enabled;\r\n if (enabled && datetime) {\r\n this.viewer.clock.currentTime = CesiumNS.JulianDate.fromDate(datetime);\r\n this.viewer.clock.shouldAnimate = false;\r\n }\r\n }\r\n\r\n setShadows(enabled: boolean): void {\r\n this.viewer.shadows = enabled;\r\n }\r\n\r\n setInitialCamera(view: CameraView | CameraInitOptions): void {\r\n // Delegate to CameraManager for all camera operations\r\n this.cameraManager.initCamera(view);\r\n }\r\n\r\n getCameraManager(): CameraManager {\r\n return this.cameraManager;\r\n }\r\n\r\n getLayerManager(): LayerManager {\r\n return this.layerManager;\r\n }\r\n\r\n setBaseImagery(\r\n url: string,\r\n layer_id: string,\r\n opts?: Omit<ImageryOptions, 'url'>,\r\n ): Cesium.ImageryLayer | undefined {\r\n for (let i = 0; i < this.viewer.imageryLayers.length; i++) {\r\n const layer = this.viewer.imageryLayers.get(i);\r\n if ((layer as any)._customId === layer_id) {\r\n // this.viewer.imageryLayers.remove(layer);\r\n console.log(`[SceneManager] 缓存 ImageryLayer_id`, (layer as any)._customId);\r\n return layer;\r\n }\r\n }\r\n // const urlroot = `${url}/{z}/{x}/{y}.png`;\r\n\r\n opts = opts ?? {};\r\n const minZoom: number = typeof opts.zoomRange?.min === 'number' ? opts.zoomRange.min : 17;\r\n const maxZoom: number = typeof opts.zoomRange?.max === 'number' ? opts.zoomRange.max : 20;\r\n\r\n opts = {\r\n ...opts,\r\n zoomRange: { min: minZoom, max: maxZoom },\r\n };\r\n\r\n const layer = this.applyImagery({ url: url, provider: 'urlTemplate', ...opts });\r\n if (layer) {\r\n (layer as any)._customId = layer_id;\r\n console.log(`[SceneManager] 新建 ImageryLayer_id`, (layer as any)._customId);\r\n }\r\n return layer;\r\n }\r\n\r\n // private tilese3DtMap: Map<string, any> = new Map();\r\n async set3DTiles(url: string, layer_id: string): Promise<any | undefined> {\r\n const primitives = this.viewer.scene.primitives;\r\n for (let i = primitives.length - 1; i >= 0; i--) {\r\n const primitive = primitives.get(i);\r\n if (primitive && primitive._customId === layer_id) {\r\n console.log(`[SceneManager] 缓存 3DTiles_id`, (primitive as any)._customId);\r\n return primitive;\r\n }\r\n }\r\n\r\n try {\r\n const tileset = await this.apply3Dtiles(url);\r\n if (tileset) {\r\n (tileset as any)._customId = layer_id;\r\n (tileset as any)._url = url; // 保存 URL 以便其他组件(如 PathPreview)使用\r\n // this.tilese3DtMap.set(layer_id, tileset);\r\n this.viewer.scene.primitives.add(tileset);\r\n console.log(`[SceneManager] 新建 3DTiles_id`, (tileset as any)._customId);\r\n }\r\n return tileset;\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.error('[SceneManager] Failed to load 3DTiles:', e);\r\n return undefined;\r\n }\r\n }\r\n\r\n async setTerrain(options: TerrainOptions): Promise<Cesium.TerrainProvider | undefined> {\r\n // this.viewer.scene.skyAtmosphere?.show = false;\r\n if (this.viewer.scene.skyBox) {\r\n this.viewer.scene.skyBox.show = false;\r\n }\r\n this.viewer.scene.backgroundColor = this.CesiumNS.Color.BLACK;\r\n this.viewer.scene.globe.baseColor = this.CesiumNS.Color.BLACK;\r\n return this.applyTerrain(options);\r\n }\r\n\r\n // Expose DSM (3D Tiles) loading for demos and consumers\r\n async addDSM(options: { url: string; show?: boolean; maximumScreenSpaceError?: number }) {\r\n const handle = await this.layerManager.addDSM(options);\r\n try {\r\n if (handle) {\r\n const ts = this.layerManager.getTileset(handle.id);\r\n if ((ts as any)?.ready === false && (ts as any)?.readyPromise) {\r\n await (ts as any).readyPromise;\r\n }\r\n if (ts) {\r\n // Zoom to the tileset bounds for convenience\r\n await (this.viewer as any).zoomTo?.(ts);\r\n }\r\n }\r\n } catch {\r\n // ignore zoom errors\r\n }\r\n return handle;\r\n }\r\n\r\n private resolveContainer(container: string | HTMLElement): HTMLElement {\r\n if (typeof container === 'string') {\r\n const el = document.getElementById(container);\r\n if (!el) throw new Error(`Container element #${container} not found`);\r\n return el;\r\n }\r\n return container;\r\n }\r\n\r\n private applyImagery(options: ImageryOptions): Cesium.ImageryLayer | undefined {\r\n try {\r\n const handle = this.layerManager.addDOM(options);\r\n if (!handle) return undefined;\r\n // Backward-compatible: return underlying Cesium layer\r\n const layer = this.layerManager.getImageryLayer(handle.id);\r\n // if (layer) {\r\n // // Fly to and focus on the imagery layer's extent/center\r\n // this.cameraManager.focusOnImageryLayer(layer);\r\n // }\r\n return layer;\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.error('[SceneManager] Failed to apply imagery:', e);\r\n return undefined;\r\n }\r\n }\r\n\r\n private async apply3Dtiles(url: string): Promise<any | undefined> {\r\n const tileset = await this.CesiumNS.Cesium3DTileset.fromUrl(url, {\r\n maximumScreenSpaceError: 16, // 降低以提高点云质量\r\n dynamicScreenSpaceError: true,\r\n dynamicScreenSpaceErrorDensity: 0.00278,\r\n dynamicScreenSpaceErrorFactor: 4.0,\r\n skipLevelOfDetail: false,\r\n baseScreenSpaceError: 1024,\r\n skipScreenSpaceErrorFactor: 16,\r\n skipLevels: 1,\r\n immediatelyLoadDesiredLevelOfDetail: false,\r\n loadSiblings: false,\r\n cullWithChildrenBounds: true,\r\n // 点云特定选项\r\n pointCloudShading: {\r\n attenuation: true,\r\n geometricErrorScale: 1.0,\r\n maximumAttenuation: undefined,\r\n baseResolution: undefined,\r\n eyeDomeLighting: true, // 启用 EDL 可以改善点云视觉效果\r\n eyeDomeLightingStrength: 1.0,\r\n eyeDomeLightingRadius: 1.0,\r\n } as any,\r\n });\r\n return tileset ?? undefined;\r\n }\r\n\r\n private async applyTerrain(options: TerrainOptions): Promise<Cesium.TerrainProvider | undefined> {\r\n try {\r\n const handle = await this.layerManager.addDEM(options);\r\n // LayerManager.addDEM sets viewer.terrainProvider; return it for convenience\r\n console.log('handle', this.viewer.terrainProvider);\r\n return handle ? this.viewer.terrainProvider : undefined;\r\n } catch (e) {\r\n // eslint-disable-next-line no-console\r\n console.error('[SceneManager] Failed to apply terrain:', e);\r\n return undefined;\r\n }\r\n }\r\n}\r\n","import type { CameraView } from '../types/public';\r\nimport { Emitter } from '../utils/events';\r\n\r\nexport interface SelectionChange<T = unknown> {\r\n current?: T;\r\n previous?: T;\r\n}\r\n\r\nexport interface EditingChange<T = unknown> {\r\n editing: boolean;\r\n target?: T;\r\n}\r\n\r\nexport interface PreviousViewChange {\r\n current?: CameraView;\r\n previous?: CameraView;\r\n}\r\n\r\n/**\r\n * Lightweight state manager for common UI states:\r\n * - selection (arbitrary payload)\r\n * - editing (boolean + optional target)\r\n * - previous camera view (for simple back navigation)\r\n */\r\nexport class StateManager<TSelection = unknown, TEditingTarget = unknown> {\r\n private selected?: TSelection;\r\n private editing = false;\r\n private editingTarget?: TEditingTarget;\r\n private previousView?: CameraView;\r\n\r\n // Emitters\r\n readonly onSelectionChange = new Emitter<SelectionChange<TSelection>>();\r\n readonly onEditingChange = new Emitter<EditingChange<TEditingTarget>>();\r\n readonly onPreviousViewChange = new Emitter<PreviousViewChange>();\r\n\r\n // Selection\r\n setSelected(next?: TSelection): void {\r\n const prev = this.selected;\r\n this.selected = next;\r\n // console.log('setSelected', next);\r\n this.onSelectionChange.emit({ current: next, previous: prev });\r\n }\r\n /**\r\n * 获取当前选中对象。\r\n * - 若未传入类型,直接返回当前选中对象。\r\n * - 若传入类型,则当且仅当选中对象的 `type` 字段与之匹配时返回,否则返回 undefined。\r\n */\r\n getSelected(): TSelection | undefined;\r\n getSelected(type: 'line' | 'shape' | 'point' | 'unknown'): TSelection | undefined;\r\n getSelected(type?: 'line' | 'shape' | 'point' | 'unknown'): TSelection | undefined {\r\n if (!type) return this.selected;\r\n const cur: any = this.selected as any;\r\n return cur && cur.type === type ? (this.selected as any) : undefined;\r\n }\r\n clearSelected(): void {\r\n this.setSelected(undefined);\r\n }\r\n\r\n // Editing\r\n startEditing(target?: TEditingTarget): void {\r\n this.editing = true;\r\n this.editingTarget = target;\r\n this.onEditingChange.emit({ editing: true, target });\r\n }\r\n stopEditing(): void {\r\n this.editing = false;\r\n const target = this.editingTarget;\r\n this.editingTarget = undefined;\r\n this.onEditingChange.emit({ editing: false, target });\r\n }\r\n toggleEditing(target?: TEditingTarget): void {\r\n if (this.editing) this.stopEditing();\r\n else this.startEditing(target);\r\n }\r\n isEditing(): boolean {\r\n return this.editing;\r\n }\r\n getEditingTarget(): TEditingTarget | undefined {\r\n return this.editingTarget;\r\n }\r\n\r\n // Previous camera view\r\n setPreviousCameraView(view?: CameraView): void {\r\n const prev = this.previousView;\r\n this.previousView = view;\r\n this.onPreviousViewChange.emit({ current: view, previous: prev });\r\n }\r\n getPreviousCameraView(): CameraView | undefined {\r\n return this.previousView;\r\n }\r\n}\r\n\r\n// Lightweight global state singleton for apps that don't integrate an external store.\r\n// Consumers with their own store can ignore this and pass a StateManager explicitly.\r\nexport const globalState = new StateManager<any, any>();\r\n","import type * as Cesium from 'cesium';\r\n\r\n/** A vertical ground marker: yellow line from point to ground with a circular marker at the base. */\r\nexport class HeightMarker {\r\n private C: any;\r\n private entity?: Cesium.Entity;\r\n private labelEntity?: Cesium.Entity;\r\n private destroyed = false;\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Cesium.Viewer,\r\n private layer: Cesium.CustomDataSource,\r\n private opts: { width?: number; color?: Cesium.Color; circleRadius?: number } = {},\r\n ) {\r\n this.C = this.CesiumNS as any;\r\n }\r\n\r\n private ensureEntity() {\r\n if (this.entity) return;\r\n const C = this.C;\r\n const color = (this.opts.color as any) ?? C.Color.YELLOW;\r\n // Create a single entity holding both the polyline and the ground circle (ellipse)\r\n this.entity = this.layer.entities.add({\r\n position: C.Cartesian3.ZERO, // will be set to ground point for ellipse\r\n polyline: {\r\n positions: [C.Cartesian3.ZERO, C.Cartesian3.ZERO],\r\n width: this.opts.width ?? 2,\r\n material: color,\r\n clampToGround: false, // vertical line in 3D space\r\n },\r\n ellipse: {\r\n semiMajorAxis: this.opts.circleRadius ?? 5.0,\r\n semiMinorAxis: this.opts.circleRadius ?? 5.0,\r\n material: (color as any).withAlpha ? (color as any).withAlpha(0.65) : color,\r\n outline: true,\r\n outlineColor: color,\r\n heightReference: C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n properties: { _type: 'height-marker' },\r\n } as any);\r\n\r\n // Create a separate entity for the label so it can sit at the mid-point of the line\r\n this.labelEntity = this.layer.entities.add({\r\n position: C.Cartesian3.ZERO,\r\n label: {\r\n text: '',\r\n font: '14px sans-serif',\r\n style: C.LabelStyle.FILL_AND_OUTLINE,\r\n fillColor: C.Color.BLACK,\r\n outlineColor: C.Color.WHITE,\r\n outlineWidth: 3,\r\n pixelOffset: new C.Cartesian2(0, -6),\r\n showBackground: false,\r\n horizontalOrigin: C.HorizontalOrigin.CENTER,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: { _type: 'height-marker-label' },\r\n } as any);\r\n }\r\n\r\n /** Compute ground point directly under the given world position. */\r\n private computeGroundPoint(top: Cesium.Cartesian3): Cesium.Cartesian3 {\r\n const C = this.C;\r\n const scene = (this.viewer as any).scene;\r\n try {\r\n // Down vector from local ENU\r\n const enu = C.Transforms.eastNorthUpToFixedFrame(top);\r\n const up4 = C.Matrix4.getColumn(enu, 2, new C.Cartesian4());\r\n const up = new C.Cartesian3(up4.x, up4.y, up4.z);\r\n const down = C.Cartesian3.negate(up, new C.Cartesian3());\r\n const ray = new C.Ray(top, down);\r\n const pick = scene?.globe?.pick?.(ray, scene);\r\n if (pick) return pick;\r\n } catch {}\r\n // Fallback: use cartographic lon/lat and query height\r\n try {\r\n const carto = this.C.Cartographic.fromCartesian(top);\r\n const h = (this.viewer.scene as any).globe?.getHeight?.(carto);\r\n const height = typeof h === 'number' ? h : 0;\r\n return this.C.Cartesian3.fromRadians(carto.longitude, carto.latitude, height);\r\n } catch {}\r\n // Last resort: project to ellipsoid surface (height 0)\r\n try {\r\n const carto = this.C.Cartographic.fromCartesian(top);\r\n return this.C.Cartesian3.fromRadians(carto.longitude, carto.latitude, 0);\r\n } catch {}\r\n return top;\r\n }\r\n\r\n /** Show or update the marker for the given position. */\r\n showAt(position: Cesium.Cartesian3) {\r\n if (this.destroyed) return;\r\n this.ensureEntity();\r\n const bottom = this.computeGroundPoint(position);\r\n try {\r\n if (this.entity) {\r\n (this.entity as any).polyline.positions = [position, bottom];\r\n (this.entity as any).position = bottom; // for ellipse\r\n }\r\n\r\n // Update label position (mid-point) and text (height in meters)\r\n if (this.labelEntity) {\r\n const C = this.C;\r\n const mid = C.Cartesian3.lerp(position, bottom, 0.5, new C.Cartesian3());\r\n (this.labelEntity as any).position = mid;\r\n // Compute height difference using cartographic heights for robustness\r\n let text = '0 m';\r\n try {\r\n const topCarto = C.Cartographic.fromCartesian(position);\r\n const botCarto = C.Cartographic.fromCartesian(bottom);\r\n const h = Math.max(0, (topCarto.height ?? 0) - (botCarto.height ?? 0));\r\n const meters = Math.round(h);\r\n text = `${meters} m`;\r\n } catch {}\r\n (this.labelEntity as any).label.text = text;\r\n }\r\n } catch {}\r\n }\r\n\r\n /**\r\n * Show or update the marker with a dynamic callback for real-time updates.\r\n * Uses CallbackProperty so Cesium automatically evaluates position every frame.\r\n */\r\n showAtDynamic(positionCallback: () => Cesium.Cartesian3) {\r\n if (this.destroyed) return;\r\n this.ensureEntity();\r\n\r\n const C = this.C;\r\n\r\n // Create a callback that computes both the top position and ground point\r\n const computePositions = () => {\r\n const top = positionCallback();\r\n const bottom = this.computeGroundPoint(top);\r\n return { top, bottom };\r\n };\r\n\r\n try {\r\n if (this.entity) {\r\n // Update polyline positions dynamically\r\n (this.entity as any).polyline.positions = new C.CallbackProperty(() => {\r\n const { top, bottom } = computePositions();\r\n return [top, bottom];\r\n }, false);\r\n\r\n // Update ellipse position (ground point) dynamically\r\n (this.entity as any).position = new C.CallbackProperty(() => {\r\n const { bottom } = computePositions();\r\n return bottom;\r\n }, false);\r\n }\r\n\r\n // Update label position (mid-point) and text (height in meters) dynamically\r\n if (this.labelEntity) {\r\n (this.labelEntity as any).position = new C.CallbackProperty(() => {\r\n const { top, bottom } = computePositions();\r\n const mid = C.Cartesian3.lerp(top, bottom, 0.5, new C.Cartesian3());\r\n return mid;\r\n }, false);\r\n\r\n (this.labelEntity as any).label.text = new C.CallbackProperty(() => {\r\n const { top, bottom } = computePositions();\r\n try {\r\n const topCarto = C.Cartographic.fromCartesian(top);\r\n const botCarto = C.Cartographic.fromCartesian(bottom);\r\n const h = Math.max(0, (topCarto.height ?? 0) - (botCarto.height ?? 0));\r\n const meters = Math.round(h);\r\n return `${meters} m`;\r\n } catch {\r\n return '0 m';\r\n }\r\n }, false);\r\n }\r\n } catch {}\r\n }\r\n\r\n destroy() {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n try {\r\n if (this.entity) this.layer.entities.remove(this.entity);\r\n if (this.labelEntity) this.layer.entities.remove(this.labelEntity);\r\n } catch {}\r\n this.entity = undefined;\r\n this.labelEntity = undefined;\r\n }\r\n}\r\n","import { Emitter, globalCameraEventBus, CameraFOVChangeEvent } from '../../utils/events';\r\n\r\nexport interface FOVControllerOptions {\r\n /** 初始 FOV 值(度) */\r\n initialFOV?: number;\r\n /** 最小 FOV 值(度),对应长焦 */\r\n minFOV?: number;\r\n /** 最大 FOV 值(度),对应广角 */\r\n maxFOV?: number;\r\n /** UI 容器元素,如果不提供则自动创建 */\r\n container?: HTMLElement;\r\n /** 是否显示焦距刻度标签 */\r\n showLabels?: boolean;\r\n /** 预设焦距档位(焦距值数组,mm) */\r\n focalLengthPresets?: number[];\r\n /** 传感器宽度(mm),用于计算焦距,默认 35mm 全画幅 */\r\n sensorWidth?: number;\r\n /** 是否使用全局事件总线,默认 true */\r\n useGlobalEventBus?: boolean;\r\n /** 滑块容器高度(px),默认 300 */\r\n sliderHeight?: number;\r\n}\r\n\r\nexport interface FOVChangeEvent {\r\n /** 当前 FOV 值(度) */\r\n fov: number;\r\n /** 等效焦距(mm) */\r\n focalLength: number;\r\n}\r\n\r\n/**\r\n * 相机 FOV(视场角)控制器\r\n * 提供焦距滑块控制,模拟镜头焦距变化(14mm 广角 到 200mm 长焦)\r\n * 通过全局事件总线与 PathPreview 和 FrustumPyramid 通信\r\n */\r\nexport class CameraFOVController {\r\n private containerEl?: HTMLElement;\r\n private sliderEl?: HTMLInputElement;\r\n private labelEl?: HTMLElement;\r\n private destroyed = false;\r\n private useGlobalEventBus: boolean;\r\n\r\n // 本地事件发射器(向后兼容)\r\n public onFOVChange = new Emitter<FOVChangeEvent>();\r\n\r\n // FOV 范围(度)\r\n private minFOV: number;\r\n private maxFOV: number;\r\n private currentFOV: number;\r\n\r\n // 焦距相关\r\n private sensorWidth: number;\r\n private focalLengthPresets: number[];\r\n\r\n constructor(private opts: FOVControllerOptions = {}) {\r\n this.sensorWidth = opts.sensorWidth ?? 36; // 35mm 全画幅\r\n this.focalLengthPresets = opts.focalLengthPresets ?? [112, 56, 14, 7, 3, 1];\r\n\r\n\r\n // 如果没有指定 FOV 范围,根据焦距预设自动计算\r\n if (opts.minFOV === undefined || opts.maxFOV === undefined) {\r\n const minFocalLength = Math.min(...this.focalLengthPresets); // 最小焦距 (1mm) -> 最大 FOV\r\n const maxFocalLength = Math.max(...this.focalLengthPresets); // 最大焦距 (112mm) -> 最小 FOV\r\n\r\n // 小焦距对应大FOV,大焦距对应小FOV\r\n this.maxFOV = this.focalLengthToFOVDirect(minFocalLength);\r\n this.minFOV = this.focalLengthToFOVDirect(maxFocalLength);\r\n } else {\r\n this.minFOV = opts.minFOV;\r\n this.maxFOV = opts.maxFOV;\r\n }\r\n\r\n this.currentFOV = opts.initialFOV ?? this.focalLengthToFOVDirect(56); // 默认 56mm 标准焦距\r\n this.useGlobalEventBus = opts.useGlobalEventBus ?? true; // 默认使用全局事件总线\r\n\r\n this.createUI();\r\n this.setupExternalFOVListener();\r\n }\r\n\r\n /**\r\n * 🆕 监听外部 FOV 变化事件(来自 UI 面板等),同步更新滑块位置\r\n */\r\n private setupExternalFOVListener(): void {\r\n if (!this.useGlobalEventBus) return;\r\n \r\n globalCameraEventBus.onFOVChange.on((event) => {\r\n // 只响应非自身发出的事件,避免循环\r\n if (event.source !== 'controller') {\r\n this.setFOVSilent(event.fov);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 焦距转换为 FOV(度)- 直接计算版本\r\n */\r\n private focalLengthToFOVDirect(focalLengthMm: number): number {\r\n const fovRad = 2 * Math.atan(this.sensorWidth / (2 * focalLengthMm));\r\n return (fovRad * 180) / Math.PI;\r\n }\r\n\r\n /**\r\n * 创建 UI 控件\r\n */\r\n private createUI(): void {\r\n if (typeof document === 'undefined') return;\r\n\r\n // 创建或使用提供的容器\r\n let container = this.opts.container;\r\n if (!container) {\r\n container = document.createElement('div');\r\n container.style.position = 'absolute';\r\n container.style.top = '10px';\r\n container.style.right = '10px';\r\n container.style.zIndex = '1000';\r\n document.body.appendChild(container);\r\n }\r\n this.containerEl = container;\r\n\r\n // 创建控制面板\r\n const panel = document.createElement('div');\r\n panel.style.cssText = `\r\n background: transparent;\r\n color: #00ffdd;\r\n font-family: Arial, sans-serif;\r\n font-size: 12px;\r\n user-select: none;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: flex-start;\r\n gap: 20px;\r\n height: 100%;\r\n `;\r\n\r\n // 中间顶部区域:变焦标签 + 焦距数值\r\n const centerContainer = document.createElement('div');\r\n centerContainer.style.cssText = `\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: flex-start;\r\n padding-top: 10px;\r\n `;\r\n\r\n // 变焦标签\r\n this.labelEl = document.createElement('div');\r\n this.labelEl.style.cssText = `\r\n text-align: center;\r\n font-size: 18px;\r\n font-weight: bold;\r\n color: white;\r\n margin-bottom: 8px;\r\n text-shadow: \r\n -1px -1px 0 #000,\r\n 1px -1px 0 #000,\r\n -1px 1px 0 #000,\r\n 1px 1px 0 #000;\r\n `;\r\n centerContainer.appendChild(this.labelEl);\r\n\r\n panel.appendChild(centerContainer);\r\n\r\n // 右侧滑块容器(垂直)\r\n const sliderHeight = this.opts.sliderHeight ?? 300;\r\n const sliderContainer = document.createElement('div');\r\n sliderContainer.style.cssText = `\r\n position: relative;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n height: ${sliderHeight}px;\r\n background: linear-gradient(to left, rgba(0, 0, 0, 0.75), rgba(0, 0, 0, 0));\r\n padding: 10px 15px;\r\n `;\r\n\r\n // 创建垂直滑块(使用预设索引而非 FOV 值)\r\n this.sliderEl = document.createElement('input');\r\n this.sliderEl.type = 'range';\r\n this.sliderEl.min = '0';\r\n this.sliderEl.max = String(this.focalLengthPresets.length - 1);\r\n this.sliderEl.step = '0.01'; // 允许小数步进,实现平滑拖动\r\n // 找到最接近当前 FOV 的预设索引\r\n const currentIndex = this.getClosestPresetIndex(this.currentFOV);\r\n this.sliderEl.value = String(currentIndex);\r\n this.sliderEl.setAttribute('orient', 'vertical'); // For Firefox\r\n this.sliderEl.style.cssText = `\r\n writing-mode: bt-lr;\r\n -webkit-appearance: slider-vertical;\r\n width: 8px;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.5);\r\n border-radius: 4px;\r\n outline: none;\r\n cursor: pointer;\r\n position: relative;\r\n `;\r\n\r\n // 滑块样式(Chrome/Safari/Firefox)\r\n const style = document.createElement('style');\r\n style.textContent = `\r\n input[type=range][orient=vertical]::-webkit-slider-thumb,\r\n input[type=range].vertical::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n appearance: none;\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 50%;\r\n background: white;\r\n cursor: pointer;\r\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);\r\n }\r\n input[type=range][orient=vertical]::-moz-range-thumb,\r\n input[type=range].vertical::-moz-range-thumb {\r\n width: 20px;\r\n height: 20px;\r\n border-radius: 50%;\r\n background: white;\r\n cursor: pointer;\r\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);\r\n border: none;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n\r\n sliderContainer.appendChild(this.sliderEl);\r\n\r\n // 预设焦距标记(垂直显示在滑块右侧,均匀分布)\r\n if (this.opts.showLabels !== false) {\r\n const markersContainer = document.createElement('div');\r\n markersContainer.style.cssText = `\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n height: 100%;\r\n font-size: 10px;\r\n color: rgba(255, 255, 255, 1);\r\n margin-left: 2px;\r\n `;\r\n\r\n // 直接使用预设数组:从上到下为 112mm -> 1mm\r\n this.focalLengthPresets.forEach((fl) => {\r\n const marker = document.createElement('div');\r\n marker.textContent = `${fl}`; // 直接显示焦距值\r\n marker.style.cssText = `\r\n cursor: pointer;\r\n padding: 2px 4px;\r\n border-radius: 3px;\r\n transition: all 0.2s;\r\n white-space: nowrap;\r\n `;\r\n marker.addEventListener('mouseenter', () => {\r\n marker.style.background = 'rgba(0, 255, 221, 0.3)';\r\n });\r\n marker.addEventListener('mouseleave', () => {\r\n marker.style.background = 'transparent';\r\n });\r\n marker.addEventListener('click', () => {\r\n this.setFocalLength(fl); // 点击直接设置焦距\r\n });\r\n markersContainer.appendChild(marker);\r\n });\r\n\r\n sliderContainer.appendChild(markersContainer);\r\n }\r\n\r\n panel.appendChild(sliderContainer);\r\n\r\n container.appendChild(panel);\r\n\r\n // 绑定事件\r\n this.sliderEl.addEventListener('input', this.handleSliderChange);\r\n\r\n // 初始更新\r\n this.updateDisplay();\r\n this.emitChange();\r\n }\r\n\r\n /**\r\n * 滑块变化处理\r\n */\r\n private handleSliderChange = (): void => {\r\n if (!this.sliderEl) return;\r\n // 滑块值是预设数组的索引(可以是小数,需要插值)\r\n const sliderValue = parseFloat(this.sliderEl.value);\r\n // 反转索引:滑块顶部(max)对应数组开头(112mm),滑块底部(min)对应数组末尾(1mm)\r\n const sliderIndex = this.focalLengthPresets.length - 1 - sliderValue;\r\n \r\n // 在两个预设焦距值之间插值\r\n const focalLength = this.interpolateFocalLength(sliderIndex);\r\n \r\n // 设置对应的 FOV\r\n const fov = this.focalLengthToFOV(focalLength);\r\n this.currentFOV = fov;\r\n this.updateDisplay();\r\n this.emitChange();\r\n };\r\n\r\n /**\r\n * 根据索引插值计算焦距值\r\n */\r\n private interpolateFocalLength(index: number): number {\r\n // 确保索引在有效范围内\r\n const clampedIndex = Math.max(0, Math.min(this.focalLengthPresets.length - 1, index));\r\n \r\n // 如果是整数索引,直接返回对应的预设值\r\n if (Number.isInteger(clampedIndex)) {\r\n return this.focalLengthPresets[clampedIndex];\r\n }\r\n \r\n // 获取相邻的两个预设值\r\n const lowerIndex = Math.floor(clampedIndex);\r\n const upperIndex = Math.ceil(clampedIndex);\r\n const lowerFL = this.focalLengthPresets[lowerIndex];\r\n const upperFL = this.focalLengthPresets[upperIndex];\r\n \r\n // 计算插值比例\r\n const fraction = clampedIndex - lowerIndex;\r\n \r\n // 线性插值\r\n return lowerFL + (upperFL - lowerFL) * fraction;\r\n }\r\n\r\n /**\r\n * 根据焦距值计算对应的索引(可以是小数)\r\n */\r\n private getFocalLengthIndex(focalLength: number): number {\r\n // 确保在范围内\r\n const minFL = Math.min(...this.focalLengthPresets);\r\n const maxFL = Math.max(...this.focalLengthPresets);\r\n const clampedFL = Math.max(minFL, Math.min(maxFL, focalLength));\r\n \r\n // 找到相邻的两个预设值\r\n for (let i = 0; i < this.focalLengthPresets.length - 1; i++) {\r\n const current = this.focalLengthPresets[i];\r\n const next = this.focalLengthPresets[i + 1];\r\n \r\n if ((current <= clampedFL && clampedFL <= next) || \r\n (current >= clampedFL && clampedFL >= next)) {\r\n // 计算在这两个值之间的位置\r\n const fraction = (clampedFL - current) / (next - current);\r\n return i + fraction;\r\n }\r\n }\r\n \r\n // 如果没找到,返回最接近的\r\n return this.focalLengthPresets.indexOf(\r\n this.focalLengthPresets.reduce((prev, curr) =>\r\n Math.abs(curr - clampedFL) < Math.abs(prev - clampedFL) ? curr : prev\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * 根据 FOV 找到最接近的预设索引(可以是小数)\r\n */\r\n private getClosestPresetIndex(fov: number): number {\r\n // 将 FOV 转换为焦距\r\n const focalLength = this.fovToFocalLength(fov);\r\n \r\n // 获取对应的索引(直接使用焦距值)\r\n const index = this.getFocalLengthIndex(focalLength);\r\n \r\n // 反转索引以匹配滑块方向(滑块顶部=max value,对应数组开头=index 0)\r\n return this.focalLengthPresets.length - 1 - index;\r\n }\r\n\r\n /**\r\n * 更新显示\r\n */\r\n private updateDisplay(): void {\r\n const focalLength = this.fovToFocalLength(this.currentFOV);\r\n\r\n if (this.labelEl) {\r\n // 直接显示焦距值,与 UI 面板保持一致\r\n this.labelEl.textContent = `焦距 ${Math.round(focalLength)}`;\r\n }\r\n }\r\n\r\n /**\r\n * 发射 FOV 变化事件\r\n */\r\n private emitChange(): void {\r\n const focalLength = this.fovToFocalLength(this.currentFOV);\r\n const event: FOVChangeEvent = {\r\n fov: this.currentFOV,\r\n focalLength,\r\n };\r\n\r\n // 发送到本地事件(向后兼容)\r\n this.onFOVChange.emit(event);\r\n\r\n // 发送到全局事件总线\r\n if (this.useGlobalEventBus) {\r\n const globalEvent: CameraFOVChangeEvent = {\r\n fov: this.currentFOV,\r\n focalLength,\r\n source: 'controller',\r\n };\r\n globalCameraEventBus.onFOVChange.emit(globalEvent);\r\n }\r\n }\r\n\r\n /**\r\n * FOV 转换为等效焦距(mm)\r\n * 公式: f = (sensor_width / 2) / tan(fov / 2)\r\n */\r\n private fovToFocalLength(fovDeg: number): number {\r\n const fovRad = (fovDeg * Math.PI) / 180;\r\n return this.sensorWidth / 2 / Math.tan(fovRad / 2);\r\n }\r\n\r\n /**\r\n * 焦距转换为 FOV(度)\r\n * 公式: fov = 2 * atan(sensor_width / (2 * f))\r\n */\r\n private focalLengthToFOV(focalLengthMm: number): number {\r\n const fovRad = 2 * Math.atan(this.sensorWidth / (2 * focalLengthMm));\r\n return (fovRad * 180) / Math.PI;\r\n }\r\n\r\n /**\r\n * 变焦倍数转换为 FOV(度)\r\n */\r\n private zoomMultiplierToFOV(zoomMultiplier: number): number {\r\n const focalLength = zoomMultiplier * this.sensorWidth;\r\n return this.focalLengthToFOV(focalLength);\r\n }\r\n\r\n /**\r\n * 设置焦距(mm)\r\n */\r\n public setFocalLength(focalLengthMm: number): void {\r\n const fov = this.focalLengthToFOV(focalLengthMm);\r\n this.setFOV(fov);\r\n }\r\n\r\n /**\r\n * 设置变焦倍数\r\n */\r\n public setZoomMultiplier(zoomMultiplier: number): void {\r\n const fov = this.zoomMultiplierToFOV(zoomMultiplier);\r\n this.setFOV(fov);\r\n }\r\n\r\n /**\r\n * 设置 FOV(度)\r\n */\r\n public setFOV(fovDeg: number): void {\r\n this.currentFOV = Math.max(this.minFOV, Math.min(this.maxFOV, fovDeg));\r\n if (this.sliderEl) {\r\n // 找到最接近的预设索引并设置滑块\r\n const index = this.getClosestPresetIndex(this.currentFOV);\r\n this.sliderEl.value = String(index);\r\n }\r\n this.updateDisplay();\r\n this.emitChange();\r\n }\r\n\r\n /**\r\n * 🆕 静默设置 FOV(度)- 只更新滑块位置,不广播事件\r\n * 用于响应外部 FOV 变化事件,避免循环广播\r\n */\r\n public setFOVSilent(fovDeg: number): void {\r\n this.currentFOV = Math.max(this.minFOV, Math.min(this.maxFOV, fovDeg));\r\n if (this.sliderEl) {\r\n const index = this.getClosestPresetIndex(this.currentFOV);\r\n this.sliderEl.value = String(index);\r\n }\r\n this.updateDisplay();\r\n // 注意:不调用 emitChange(),避免循环\r\n }\r\n\r\n /**\r\n * 获取当前 FOV\r\n */\r\n public getFOV(): number {\r\n return this.currentFOV;\r\n }\r\n\r\n /**\r\n * 获取当前焦距\r\n */\r\n public getFocalLength(): number {\r\n return this.fovToFocalLength(this.currentFOV);\r\n }\r\n\r\n /**\r\n * 显示控制器\r\n */\r\n public show(): void {\r\n if (this.containerEl) {\r\n this.containerEl.style.display = 'block';\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏控制器\r\n */\r\n public hide(): void {\r\n if (this.containerEl) {\r\n this.containerEl.style.display = 'none';\r\n }\r\n }\r\n\r\n /**\r\n * 销毁控制器\r\n */\r\n public destroy(): void {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n\r\n // 移除事件监听\r\n if (this.sliderEl) {\r\n this.sliderEl.removeEventListener('input', this.handleSliderChange);\r\n }\r\n\r\n // 移除 DOM\r\n if (this.containerEl && !this.opts.container) {\r\n this.containerEl.remove();\r\n }\r\n\r\n // 清理事件\r\n this.onFOVChange.clear();\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { CameraFOVController, FOVControllerOptions } from './CameraFOVController';\r\nimport { globalCameraEventBus } from '../../utils/events';\r\n\r\nexport interface PathPreviewOptions {\r\n container?: HTMLElement;\r\n showFootprint?: boolean;\r\n fov?: number; // degrees\r\n pitch?: number; // degrees\r\n roll?: number; // degrees\r\n /** FOV 控制器选项 */\r\n fovController?: FOVControllerOptions | false; // false 表示禁用 FOV 控制器\r\n /** 是否使用全局事件总线 */\r\n useGlobalEventBus?: boolean;\r\n}\r\n\r\n/**\r\n * PathPreview class provides a lightweight mini preview window and ground footprint helper for Cesium applications.\r\n * It creates an overlay viewer that can be positioned and oriented independently of the main viewer,\r\n * allowing users to visualize a different perspective or path.\r\n * \r\n * 集成 CameraFOVController 用于动态调节视场角\r\n */\r\nexport class PathPreview {\r\n private overlayViewer?: Cesium.Viewer; // Lightweight overlay viewer\r\n private containerEl?: HTMLElement; // Container for the overlay viewer\r\n private footprintEntity?: Cesium.Entity; // Entity for ground footprint polygon\r\n private destroyed = false; // Track if the instance has been destroyed\r\n private fovController?: CameraFOVController; // FOV 控制器\r\n private currentFOV: number; // 当前 FOV 值\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private mainViewer: Cesium.Viewer,\r\n // private layer: Cesium.CustomDataSource,\r\n private opts: PathPreviewOptions = {},\r\n ) {\r\n this.currentFOV = opts.fov ?? 50;\r\n this.ensureViewer();\r\n this.ensureFOVController();\r\n // if (this.opts.showFootprint !== false) this.ensureFootprint();\r\n }\r\n\r\n private ensureViewer(): void {\r\n if (this.overlayViewer) return;\r\n const C: any = this.CesiumNS as any;\r\n // Container initialization ---!\r\n let host = this.opts.container;\r\n if (!host && typeof document !== 'undefined') {\r\n host = document.createElement('div');\r\n host.style.position = 'absolute';\r\n host.style.right = '10px';\r\n host.style.bottom = '10px';\r\n host.style.width = '480px';\r\n host.style.height = '320px';\r\n host.style.border = '1px solid rgba(255, 255, 255, 1)';\r\n host.style.borderRadius = '6px';\r\n host.style.overflow = 'hidden';\r\n host.style.background = '#000';\r\n try {\r\n const parent = (this.mainViewer as any).container as HTMLElement;\r\n parent?.appendChild(host);\r\n } catch {}\r\n }\r\n this.containerEl = host;\r\n // Create lightweight viewer\r\n const v = new C.Viewer(host, {\r\n animation: false,\r\n baseLayer:false,\r\n baseLayerPicker: false,\r\n geocoder: false,\r\n homeButton: false,\r\n infoBox: false,\r\n navigationHelpButton: false,\r\n sceneModePicker: false,\r\n timeline: false,\r\n fullscreenButton: false,\r\n selectionIndicator: false,\r\n requestRenderMode: true,\r\n terrain: undefined,\r\n // Hide Cesium branding and credits for clean preview\r\n creditContainer: undefined,\r\n });\r\n\r\n // Additional cleanup: hide credit display\r\n try {\r\n const creditContainer = (v as any).cesiumWidget?.creditContainer;\r\n if (creditContainer) {\r\n creditContainer.style.display = 'none';\r\n }\r\n // Also hide the bottom container\r\n const bottomContainer = (v as any).bottomContainer;\r\n if (bottomContainer) {\r\n bottomContainer.style.display = 'none';\r\n }\r\n } catch {}\r\n\r\n this.overlayViewer = v as any;\r\n\r\n // 同步主 viewer 的配置\r\n this.syncFromMainViewer();\r\n\r\n // 禁用用户交互\r\n this.disableUserInteraction();\r\n }\r\n\r\n /**\r\n * 从主 viewer 同步配置\r\n * 共享 Provider(安全)而非 DataSource\r\n */\r\n private syncFromMainViewer(): void {\r\n if (!this.overlayViewer) return;\r\n \r\n this.syncImageryLayers();\r\n this.syncTerrainProvider();\r\n this.syncSceneSettings();\r\n this.sync3DTiles();\r\n }\r\n\r\n /**\r\n * 同步影像图层(共享 ImageryProvider)\r\n */\r\n private syncImageryLayers(): void {\r\n const v = this.overlayViewer as any;\r\n if (!v) return;\r\n\r\n try {\r\n // 清除默认图层\r\n v.imageryLayers?.removeAll?.();\r\n \r\n // 共享主 viewer 的 ImageryProvider(安全,Provider 是无状态的)\r\n const mainImageryLayers = this.mainViewer.imageryLayers;\r\n for (let i = 0; i < mainImageryLayers.length; i++) {\r\n const layer = mainImageryLayers.get(i);\r\n try {\r\n v.imageryLayers?.addImageryProvider?.(layer.imageryProvider);\r\n } catch {}\r\n }\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to sync imagery layers:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 同步地形提供者(共享 TerrainProvider)\r\n */\r\n private syncTerrainProvider(): void {\r\n const v = this.overlayViewer as any;\r\n if (!v) return;\r\n\r\n try {\r\n // 共享主 viewer 的 TerrainProvider(安全,Provider 是无状态的)\r\n if (this.mainViewer.terrainProvider) {\r\n v.terrainProvider = this.mainViewer.terrainProvider;\r\n }\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to sync terrain provider:', e);\r\n }\r\n }\r\n\r\n /** 已加载的 3D Tiles 实例(预览窗口独立的) */\r\n private tilesets: Map<string, any> = new Map();\r\n\r\n /**\r\n * 同步 3D Tiles(点云、倾斜摄影等)\r\n * 注意:Primitive 不能直接共享,需要创建独立实例\r\n * 此方法查找主 viewer 中的 tileset 并尝试使用相同 URL 创建新实例\r\n */\r\n private sync3DTiles(): void {\r\n const v = this.overlayViewer as any;\r\n if (!v) return;\r\n\r\n const C: any = this.CesiumNS as any;\r\n const mainPrimitives = (this.mainViewer.scene as any).primitives;\r\n\r\n try {\r\n // 遍历主 viewer 的 primitives,找到 Cesium3DTileset\r\n for (let i = 0; i < mainPrimitives.length; i++) {\r\n const primitive = mainPrimitives.get(i);\r\n \r\n // 检查是否是 Cesium3DTileset 且有 URL\r\n if (primitive && primitive instanceof C.Cesium3DTileset) {\r\n const customId = primitive._customId;\r\n const url = primitive._url || primitive.resource?.url;\r\n \r\n // 如果有 URL 且未创建过,则创建新实例\r\n if (url && customId && !this.tilesets.has(customId)) {\r\n this.add3DTiles(url, customId);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to sync 3DTiles:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 手动添加 3D Tiles 到预览窗口\r\n * @param url 3D Tiles URL\r\n * @param id 唯一标识符\r\n */\r\n async add3DTiles(url: string, id: string): Promise<any | undefined> {\r\n const v = this.overlayViewer as any;\r\n if (!v) return undefined;\r\n\r\n // 检查是否已存在\r\n if (this.tilesets.has(id)) {\r\n return this.tilesets.get(id);\r\n }\r\n\r\n const C: any = this.CesiumNS as any;\r\n\r\n try {\r\n const tileset = await C.Cesium3DTileset.fromUrl(url, {\r\n maximumScreenSpaceError: 16,\r\n });\r\n \r\n if (tileset) {\r\n tileset._customId = id;\r\n tileset._url = url;\r\n v.scene.primitives.add(tileset);\r\n this.tilesets.set(id, tileset);\r\n console.log('[PathPreview] Added 3DTiles:', id);\r\n }\r\n return tileset;\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to add 3DTiles:', url, e);\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 移除 3D Tiles\r\n */\r\n remove3DTiles(id: string): void {\r\n const v = this.overlayViewer as any;\r\n if (!v) return;\r\n\r\n const tileset = this.tilesets.get(id);\r\n if (tileset) {\r\n try {\r\n v.scene.primitives.remove(tileset);\r\n } catch {}\r\n this.tilesets.delete(id);\r\n }\r\n }\r\n\r\n /**\r\n * 同步场景设置(Globe、天空、雾效等)\r\n */\r\n private syncSceneSettings(): void {\r\n const v = this.overlayViewer as any;\r\n if (!v) return;\r\n\r\n const s = v.scene;\r\n const mainScene: any = this.mainViewer.scene;\r\n\r\n try {\r\n // 同步 Globe 设置\r\n if (s.globe && mainScene.globe) {\r\n s.globe.show = mainScene.globe.show;\r\n s.globe.enableLighting = mainScene.globe.enableLighting;\r\n s.globe.baseColor = mainScene.globe.baseColor;\r\n s.globe.showGroundAtmosphere = mainScene.globe.showGroundAtmosphere;\r\n s.globe.depthTestAgainstTerrain = mainScene.globe.depthTestAgainstTerrain;\r\n }\r\n\r\n // 同步天空盒\r\n if (mainScene.skyBox) {\r\n s.skyBox = mainScene.skyBox;\r\n } else {\r\n s.skyBox = undefined;\r\n }\r\n\r\n // 同步天空大气\r\n if (mainScene.skyAtmosphere) {\r\n s.skyAtmosphere.show = mainScene.skyAtmosphere.show;\r\n }\r\n\r\n // 同步雾效\r\n if (s.fog && mainScene.fog) {\r\n s.fog.enabled = mainScene.fog.enabled;\r\n s.fog.density = mainScene.fog.density;\r\n }\r\n\r\n // 同步阴影设置\r\n v.shadows = this.mainViewer.shadows;\r\n\r\n // 同步后处理(FXAA 等)\r\n if (s.postProcessStages?.fxaa && mainScene.postProcessStages?.fxaa) {\r\n s.postProcessStages.fxaa.enabled = mainScene.postProcessStages.fxaa.enabled;\r\n }\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to sync scene settings:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 禁用用户交互,相机仅通过 setPose() 控制\r\n */\r\n private disableUserInteraction(): void {\r\n const v = this.overlayViewer as any;\r\n if (!v) return;\r\n\r\n const s = v.scene;\r\n\r\n try {\r\n // 禁用所有相机控制\r\n const scc = s.screenSpaceCameraController;\r\n if (scc) {\r\n scc.enableInputs = false;\r\n scc.enableRotate = false;\r\n scc.enableTranslate = false;\r\n scc.enableZoom = false;\r\n scc.enableTilt = false;\r\n scc.enableLook = false;\r\n scc.inertiaSpin = 0;\r\n scc.inertiaZoom = 0;\r\n scc.inertiaTranslate = 0;\r\n }\r\n\r\n // 确保 canvas 不拦截主 viewer 的事件\r\n const canvas = s?.canvas ?? v.scene?.canvas;\r\n if (canvas && canvas.style) {\r\n canvas.style.pointerEvents = 'none';\r\n try {\r\n canvas.setAttribute('tabindex', '-1');\r\n } catch {}\r\n }\r\n\r\n // 禁用实体追踪和时钟动画\r\n v.trackedEntity = undefined;\r\n if (v.clock) {\r\n v.clock.shouldAnimate = false;\r\n }\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to disable user interaction:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 刷新同步(运行时更新)\r\n */\r\n refresh(): void {\r\n this.syncFromMainViewer();\r\n }\r\n\r\n /**\r\n * 创建 FOV 控制器\r\n */\r\n private ensureFOVController(): void {\r\n // 如果选项明确设置为 false,或者已经存在1个controller,则不再创建控制器\r\n if (this.opts.fovController === false) return;\r\n if (this.fovController) return;\r\n\r\n // 创建 FOV 控制器容器(放在预览地图容器中)\r\n let fovContainer: HTMLElement | undefined;\r\n let containerHeight = 300; // 默认高度\r\n if (this.containerEl && typeof document !== 'undefined') {\r\n fovContainer = document.createElement('div');\r\n fovContainer.style.position = 'absolute';\r\n fovContainer.style.top = '0';\r\n fovContainer.style.right = '0';\r\n fovContainer.style.height = '100%';\r\n fovContainer.style.zIndex = '10';\r\n fovContainer.style.pointerEvents = 'auto'; // 确保可以交互\r\n this.containerEl.appendChild(fovContainer);\r\n \r\n // 获取容器的实际高度\r\n const computedHeight = this.containerEl.offsetHeight;\r\n if (computedHeight > 0) {\r\n // 留出上下边距,滑块高度为容器高度减去 padding\r\n containerHeight = computedHeight-20; // 减去上下各 20px 的边距\r\n }\r\n }\r\n\r\n // 创建 FOV 控制器\r\n const fovOptions: FOVControllerOptions = {\r\n initialFOV: this.currentFOV,\r\n useGlobalEventBus: this.opts.useGlobalEventBus ?? true,\r\n container: fovContainer, // 使用我们创建的容器\r\n sliderHeight: containerHeight, // 传入计算的高度\r\n ...(typeof this.opts.fovController === 'object' ? this.opts.fovController : {}),\r\n };\r\n\r\n this.fovController = new CameraFOVController(fovOptions);\r\n\r\n // 监听 FOV 变化,更新预览窗口\r\n this.fovController.onFOVChange.on((event) => {\r\n this.currentFOV = event.fov;\r\n this.updateCameraFOV(event.fov);\r\n });\r\n\r\n // 如果使用全局事件总线,也监听全局事件\r\n if (this.opts.useGlobalEventBus !== false) {\r\n globalCameraEventBus.onFOVChange.on((event) => {\r\n if (event.source === 'controller') {\r\n this.currentFOV = event.fov;\r\n this.updateCameraFOV(event.fov);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 更新相机 FOV\r\n */\r\n private updateCameraFOV(fovDeg: number): void {\r\n if (!this.overlayViewer) return;\r\n const C: any = this.CesiumNS as any;\r\n const v = this.overlayViewer as any;\r\n \r\n try {\r\n const fov = C.Math.toRadians(Math.max(1, Math.min(120, fovDeg)));\r\n const fr = v.camera.frustum as any;\r\n if (fr && typeof fr.fov === 'number') {\r\n fr.fov = fov;\r\n v.scene?.requestRender?.();\r\n }\r\n } catch (e) {\r\n console.warn('[PathPreview] Failed to update FOV:', e);\r\n }\r\n }\r\n\r\n // private ensureFootprint(): void {\r\n // const C: any = this.CesiumNS as any;\r\n // if (this.footprintEntity) return;\r\n // this.footprintEntity = (this.layer.entities as any).add({\r\n // polygon: {\r\n // // Only show when we have at least 3 ground hit points\r\n // show: new C.CallbackProperty(() => (this._footprintPositions?.length ?? 0) >= 3, false),\r\n // hierarchy: new C.CallbackProperty(() => {\r\n // const arr = this._footprintPositions;\r\n // return arr && arr.length >= 3 ? arr.slice() : undefined;\r\n // }, false),\r\n // material: C.Color.CYAN.withAlpha(0.18),\r\n // outline: true,\r\n // outlineColor: C.Color.CYAN.withAlpha(0.7),\r\n // outlineWidth: 1,\r\n // // Use per-position heights from globe intersections to avoid terrain-ground primitive path\r\n // perPositionHeight: true,\r\n // },\r\n // properties: { _type: 'preview-footprint' },\r\n // });\r\n // }\r\n\r\n // private _footprintPositions: any[] | undefined;\r\n\r\n /**\r\n * Set the camera pose and field of view for the overlay viewer.\r\n * @param cartesian cartesian position\r\n * @param headingDeg heading angle in degrees\r\n * @param pitchDeg pitch angle in degrees\r\n * @param rollDeg roll angle in degrees\r\n * @param fovDeg field of view angle in degrees\r\n */\r\n setPose(\r\n cartesian: any,\r\n headingDeg: number,\r\n pitchDeg?: number,\r\n rollDeg?: number,\r\n fovDeg?: number,\r\n ) {\r\n // if (this.destroyed) return;\r\n const C: any = this.CesiumNS as any;\r\n const v = this.overlayViewer as any;\r\n // if (!v) return;\r\n\r\n const h = C.Math.toRadians(headingDeg ?? 0);\r\n const p = C.Math.toRadians(pitchDeg ?? this.opts.pitch ?? -10);\r\n const r = C.Math.toRadians(rollDeg ?? this.opts.roll ?? 0);\r\n\r\n v.camera.setView({\r\n destination: cartesian,\r\n orientation: { heading: h, pitch: p, roll: r },\r\n });\r\n // const fov = C.Math.toRadians(Math.max(1, Math.min(120, fovDeg ?? this.opts.fov ?? 50)));\r\n\r\n // // Debug: log camera update\r\n // console.log('[PathPreview] Setting camera:', {\r\n // heading: headingDeg,\r\n // pitch: pitchDeg ?? this.opts.pitch ?? -10,\r\n // roll: rollDeg ?? this.opts.roll ?? 0,\r\n // fov: fovDeg ?? this.opts.fov ?? 50,\r\n // });\r\n\r\n // try {\r\n // // Set FOV first\r\n // const fr = v.camera.frustum as any;\r\n // if (fr && typeof fr.fov === 'number') fr.fov = fov;\r\n\r\n // Use lookAt for more explicit camera positioning\r\n // Calculate a point ahead of the camera based on heading and pitch\r\n // const ellipsoid = v.scene.globe?.ellipsoid ?? C.Ellipsoid.WGS84;\r\n // const forward = new C.Cartesian3();\r\n // const up = new C.Cartesian3();\r\n // const right = new C.Cartesian3();\r\n\r\n // // Create rotation matrix from HPR\r\n // const hpr = new C.HeadingPitchRoll(h, p, r);\r\n // const orientation = C.Transforms.headingPitchRollQuaternion(cartesian, hpr, ellipsoid);\r\n // const rotationMatrix = C.Matrix3.fromQuaternion(orientation);\r\n\r\n // Get camera direction vectors\r\n // C.Matrix3.getColumn(rotationMatrix, 0, right);\r\n // C.Matrix3.getColumn(rotationMatrix, 2, forward);\r\n // C.Matrix3.negate(forward, forward); // Cesium camera looks down -Z\r\n // C.Matrix3.getColumn(rotationMatrix, 1, up);\r\n\r\n // Set camera position and orientation directly\r\n // v.camera.position = cartesian;\r\n // v.camera.direction = forward;\r\n // v.camera.up = up;\r\n // v.camera.right = right;\r\n // } catch (e) {\r\n // // Fallback to simpler setView if the above fails\r\n // try {\r\n // v.camera.setView({\r\n // destination: cartesian,\r\n // orientation: { heading: h, pitch: p, roll: r },\r\n // });\r\n // } catch {}\r\n }\r\n\r\n // // Recompute footprint using overlay scene\r\n // try {\r\n // const scene: any = v.scene;\r\n // const w = scene?.canvas?.width ?? 256;\r\n // const hgt = scene?.canvas?.height ?? 144;\r\n // const corners = [\r\n // new C.Cartesian2(2, 2),\r\n // new C.Cartesian2(w - 2, 2),\r\n // new C.Cartesian2(w - 2, hgt - 2),\r\n // new C.Cartesian2(2, hgt - 2),\r\n // ];\r\n // const pts: any[] = [];\r\n // for (const c of corners) {\r\n // const ray = v.camera.getPickRay(c);\r\n // if (!ray) continue;\r\n // const hit = scene.globe?.pick?.(ray, scene);\r\n // if (hit) pts.push(hit);\r\n // }\r\n // // this._footprintPositions = pts.length >= 3 ? pts : undefined;\r\n // v.scene?.requestRender?.();\r\n // (this.mainViewer.scene as any)?.requestRender?.();\r\n // } catch {}\r\n // }\r\n\r\n /**\r\n * 设置 FOV(如果启用了 FOV 控制器)\r\n */\r\n setFOV(fov: number): void {\r\n this.currentFOV = fov;\r\n if (this.fovController) {\r\n this.fovController.setFOV(fov);\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前 FOV\r\n */\r\n getFOV(): number {\r\n return this.currentFOV;\r\n }\r\n\r\n /**\r\n * 显示 FOV 控制器\r\n */\r\n showFOVController(): void {\r\n if (this.fovController) {\r\n this.fovController.show();\r\n } else if (this.opts.fovController !== false) {\r\n this.ensureFOVController();\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏 FOV 控制器\r\n */\r\n hideFOVController(): void {\r\n if (this.fovController) {\r\n this.fovController.hide();\r\n }\r\n }\r\n\r\n /**\r\n * 显示预览窗口\r\n */\r\n show(): void {\r\n if (this.containerEl) {\r\n this.containerEl.style.display = 'block';\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏预览窗口\r\n */\r\n hide(): void {\r\n if (this.containerEl) {\r\n this.containerEl.style.display = 'none';\r\n }\r\n }\r\n\r\n /**\r\n * 获取预览 viewer 实例\r\n */\r\n getOverlayViewer(): Cesium.Viewer | undefined {\r\n return this.overlayViewer;\r\n }\r\n\r\n /**\r\n * 销毁预览窗口,释放所有资源\r\n */\r\n destroy(): void {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n\r\n // 销毁 FOV 控制器\r\n try {\r\n this.fovController?.destroy();\r\n } catch {}\r\n this.fovController = undefined;\r\n\r\n // 销毁 footprint 实体\r\n this.footprintEntity = undefined;\r\n\r\n // 清理 3D Tiles\r\n try {\r\n this.tilesets.forEach((tileset) => {\r\n try {\r\n (this.overlayViewer as any)?.scene?.primitives?.remove?.(tileset);\r\n } catch {}\r\n });\r\n this.tilesets.clear();\r\n } catch {}\r\n\r\n // 销毁 overlay viewer\r\n try {\r\n (this.overlayViewer as any)?.destroy?.();\r\n } catch {}\r\n this.overlayViewer = undefined;\r\n\r\n // 移除容器元素\r\n try {\r\n if (this.containerEl && this.containerEl.parentElement) {\r\n this.containerEl.parentElement.removeChild(this.containerEl);\r\n }\r\n } catch {}\r\n this.containerEl = undefined;\r\n }\r\n}\r\n","/**\r\n * 视锥体/金字塔可视化工具\r\n * - 用多段线与多边形在 Cesium 中绘制一个“相机视锥体”样式的方锥体\r\n * - 支持静态一次性绘制(showAt)与基于 CallbackProperty 的动态绘制(showAtDynamic)\r\n * - 几何计算集中在 computeFrustumGeometry,避免重复代码\r\n */\r\nimport type * as Cesium from 'cesium';\r\n\r\nexport interface FrustumPyramidOptions {\r\n /** 顶点到底面中心的距离(米) */\r\n length?: number;\r\n /** 水平视场角(度,整角) */\r\n fov?: number;\r\n /** 底面宽高比(width:height),默认 4:3 模拟相机画幅 */\r\n aspectRatio?: number;\r\n /** 边线颜色 */\r\n color?: Cesium.Color;\r\n /** 面填充颜色(alpha 由 fillAlpha 决定或自身附带) */\r\n fillColor?: Cesium.Color;\r\n /** 面透明度 [0..1],默认 0.25 */\r\n fillAlpha?: number;\r\n /** 边线宽度(像素) */\r\n width?: number;\r\n /** 是否打印上下左右半视场角(度)变化日志(默认关闭) */\r\n logAngles?: boolean;\r\n /** 日志节流间隔(毫秒),仅在 logAngles=true 时生效,默认 250ms */\r\n logThrottleMs?: number;\r\n}\r\n\r\n/**\r\n * 在给定姿态处渲染一个方锥体视锥(边线 + 面填充 + 垂直箭头)\r\n * - 通过 Entity 层级维护几何,支持重复更新与清理\r\n */\r\nexport class FrustumPyramid {\r\n /** 4 条边线实体(apex->四个角) */\r\n private edgeEntities: Cesium.Entity[] = [];\r\n /** 底面填充多边形实体(可选显示) */\r\n private baseFillEntity?: Cesium.Entity;\r\n /** 4 个侧面三角形实体(apex->ci->c(i+1)) */\r\n private faceEntities: Cesium.Entity[] = [];\r\n /** 顶点到底面中心的垂直“箭头线”(用于指示方向/深度) */\r\n private verticalLineEntity?: Cesium.Entity;\r\n private destroyed = false;\r\n /** 上次记录的半视场角(度),用于判定变化 */\r\n private lastAngles?: { left: number; right: number; up: number; down: number };\r\n /** 上次打印日志的时间戳(ms) */\r\n private lastLogAt = 0;\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private layer: Cesium.CustomDataSource,\r\n private opts: FrustumPyramidOptions = {},\r\n ) {}\r\n\r\n /**\r\n * 计算视锥体几何(顶点、四个底面角点与底面中心)\r\n * - 先根据 HPR 在 apex 处构造模型矩阵,取 forward(列1)方向\r\n * - 用 apex 的地表法线作为世界 up,重建无滚转的 right/up,从而避免 pitch 时的视觉侧倾\r\n * - 基于 fov 与 aspectRatio 求得底面半宽半高,沿 forward 推进 length 得到 baseCenter\r\n */\r\n private computeFrustumGeometry(\r\n apex: Cesium.Cartesian3,\r\n headingDeg: number,\r\n pitchDeg: number,\r\n rollDeg: number,\r\n fovDeg: number,\r\n length: number,\r\n ): { apex: Cesium.Cartesian3; corners: Cesium.Cartesian3[]; baseCenter: Cesium.Cartesian3 } {\r\n const C: any = this.CesiumNS as any;\r\n const fov = Math.max(1, Math.min(120, fovDeg ?? this.opts.fov ?? 50));\r\n const aspectRatio = this.opts.aspectRatio ?? 4 / 3;\r\n const halfFovH = C.Math.toRadians(fov / 2);\r\n const halfWidth = Math.tan(halfFovH) * length;\r\n const halfHeight = halfWidth / aspectRatio;\r\n\r\n // 使用 ENU 基向量 + heading/pitch 直接构造“朝向”向量(忽略 roll)\r\n // 这样可以明确保证 pitch 改变会体现在 forward 上,避免列索引/坐标定义差异导致的误判\r\n const enu = C.Transforms.eastNorthUpToFixedFrame(apex);\r\n const eastCol = C.Matrix4.getColumn(enu, 0, new C.Cartesian4());\r\n const northCol = C.Matrix4.getColumn(enu, 1, new C.Cartesian4());\r\n const upCol = C.Matrix4.getColumn(enu, 2, new C.Cartesian4());\r\n const east3 = new C.Cartesian3(eastCol.x, eastCol.y, eastCol.z);\r\n const north3 = new C.Cartesian3(northCol.x, northCol.y, northCol.z);\r\n const up3 = new C.Cartesian3(upCol.x, upCol.y, upCol.z);\r\n const hr = C.Math.toRadians(headingDeg ?? 0);\r\n const pr = C.Math.toRadians(pitchDeg ?? 0);\r\n // 水平分量:在 ENU 平面内由 heading 确定(heading=0 指向 north3)\r\n const horiz = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(east3, Math.sin(hr), new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(north3, Math.cos(hr), new C.Cartesian3()),\r\n new C.Cartesian3(),\r\n );\r\n const horizNorm = C.Cartesian3.normalize(horiz, new C.Cartesian3());\r\n // 前向:水平分量按 cos(pitch) 缩放 + up 分量按 sin(pitch) 叠加\r\n let forward = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(horizNorm, Math.cos(pr), new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(up3, Math.sin(pr), new C.Cartesian3()),\r\n new C.Cartesian3(),\r\n );\r\n forward = C.Cartesian3.normalize(forward, forward);\r\n\r\n // 基于 apex 位置求地表法线,作为世界上方向参考(worldUp)\r\n const worldUp = C.Ellipsoid.WGS84.geodeticSurfaceNormal(apex, new C.Cartesian3());\r\n\r\n // 计算“去滚转”的 right = normalize( forward × worldUp )\r\n let right = C.Cartesian3.cross(forward, worldUp, new C.Cartesian3());\r\n let magRight = C.Cartesian3.magnitude(right);\r\n if (magRight < 1e-6) {\r\n // 当 forward 近似与 worldUp 平行(直上/直下)时的退化处理:\r\n // 选用固定参考轴(全球 X 轴)重新 cross。\r\n const fallback = new C.Cartesian3(1, 0, 0);\r\n right = C.Cartesian3.cross(forward, fallback, new C.Cartesian3());\r\n magRight = C.Cartesian3.magnitude(right);\r\n }\r\n if (magRight > 0) right = C.Cartesian3.multiplyByScalar(right, 1 / magRight, right);\r\n\r\n // 重新构造 upNoRoll = normalize( right × forward ),保证正交与“无侧倾”\r\n let up = C.Cartesian3.cross(right, forward, new C.Cartesian3());\r\n const magUp = C.Cartesian3.magnitude(up);\r\n if (magUp > 0) up = C.Cartesian3.multiplyByScalar(up, 1 / magUp, up);\r\n\r\n // 计算 baseCenter:沿 forward 方向推进 length(包含 pitch 分量)\r\n const baseCenter = C.Cartesian3.add(\r\n apex,\r\n C.Cartesian3.multiplyByScalar(forward, length, new C.Cartesian3()),\r\n new C.Cartesian3(),\r\n );\r\n\r\n // 根据“去滚转”的 right/up 构建底面矩形的偏移向量\r\n const rOff = C.Cartesian3.multiplyByScalar(right, halfWidth, new C.Cartesian3());\r\n const uOff = C.Cartesian3.multiplyByScalar(up, halfHeight, new C.Cartesian3());\r\n\r\n const c0 = C.Cartesian3.add(\r\n C.Cartesian3.add(baseCenter, rOff, new C.Cartesian3()),\r\n uOff,\r\n new C.Cartesian3(),\r\n );\r\n const c1 = C.Cartesian3.add(\r\n C.Cartesian3.subtract(baseCenter, rOff, new C.Cartesian3()),\r\n uOff,\r\n new C.Cartesian3(),\r\n );\r\n const c2 = C.Cartesian3.subtract(\r\n C.Cartesian3.subtract(baseCenter, rOff, new C.Cartesian3()),\r\n uOff,\r\n new C.Cartesian3(),\r\n );\r\n const c3 = C.Cartesian3.subtract(\r\n C.Cartesian3.add(baseCenter, rOff, new C.Cartesian3()),\r\n uOff,\r\n new C.Cartesian3(),\r\n );\r\n\r\n return { apex, corners: [c0, c1, c2, c3], baseCenter };\r\n }\r\n\r\n /**\r\n * 若启用日志,则在“左右/上下对应的世界角度”变化时打印一条日志。\r\n * - 左右角度:以 heading 为中心的 ±(FOV/2)\r\n * - 上下角度:以 pitch 为中心的 ±(verticalHalfFov)\r\n * - 采用节流与变化判定:小于 logThrottleMs 的间隔或角度未变时不重复打印\r\n */\r\n private logAnglesIfChanged(\r\n fovDeg: number,\r\n aspectRatio: number,\r\n headingDeg: number = 0,\r\n pitchDeg: number = 0,\r\n ) {\r\n if (!this.opts.logAngles) return;\r\n const now = Date.now();\r\n const throttle = this.opts.logThrottleMs ?? 250;\r\n if (now - this.lastLogAt < throttle) return;\r\n\r\n const clampedFov = Math.max(1, Math.min(120, fovDeg));\r\n const ar = aspectRatio > 0 ? aspectRatio : 4 / 3;\r\n const halfH = clampedFov / 2; // 左右半视场角(度)\r\n const halfV = (180 / Math.PI) * Math.atan(Math.tan((Math.PI / 180) * halfH) / ar); // 上下半视场角(度)\r\n // 基于当前 heading/pitch 的世界角度\r\n const next = {\r\n left: headingDeg - halfH,\r\n right: headingDeg + halfH,\r\n up: pitchDeg + halfV,\r\n down: pitchDeg - halfV,\r\n };\r\n\r\n const prev = this.lastAngles;\r\n const changed =\r\n !prev ||\r\n Math.abs(prev.left - next.left) > 1e-4 ||\r\n Math.abs(prev.right - next.right) > 1e-4 ||\r\n Math.abs(prev.up - next.up) > 1e-4 ||\r\n Math.abs(prev.down - next.down) > 1e-4;\r\n if (!changed) return;\r\n\r\n this.lastAngles = next;\r\n this.lastLogAt = now;\r\n try {\r\n // 示例输出:FOV=50, AR=1.333 => L/R=±25.00°, U/D=±18.92°\r\n console.log(\r\n '[FrustumPyramid] 角度更新',\r\n `FOV=${clampedFov.toFixed(2)}°`,\r\n `AR=${ar.toFixed(3)}`,\r\n `Heading=${headingDeg.toFixed(2)}°`,\r\n `Pitch=${pitchDeg.toFixed(2)}°`,\r\n `Left=${next.left.toFixed(2)}°`,\r\n `Right=${next.right.toFixed(2)}°`,\r\n `Up=${next.up.toFixed(2)}°`,\r\n `Down=${next.down.toFixed(2)}°`,\r\n );\r\n } catch {}\r\n }\r\n\r\n /**\r\n * 确保实体已创建:\r\n * - 4 条边线、4 个侧面三角形、1 个底面填充、多一条垂直箭头线\r\n * - 若已存在则直接返回,避免重复创建\r\n */\r\n private ensureEntities(edgeColor: Cesium.Color, width: number, fillColor: Cesium.Color) {\r\n const C: any = this.CesiumNS as any;\r\n if (\r\n this.edgeEntities.length === 4 &&\r\n this.baseFillEntity &&\r\n this.faceEntities.length === 4 &&\r\n this.verticalLineEntity\r\n )\r\n return;\r\n // 底面填充多边形(默认隐藏,可设置描边)\r\n this.baseFillEntity = (this.layer.entities as any).add({\r\n polygon: {\r\n show: false,\r\n hierarchy: new C.PolygonHierarchy([]),\r\n material: fillColor,\r\n perPositionHeight: true,\r\n outline: true,\r\n outlineColor: edgeColor,\r\n outlineWidth: width,\r\n },\r\n properties: { _type: 'frustum-base-fill' },\r\n } as any);\r\n this.edgeEntities = [];\r\n for (let i = 0; i < 4; i++) {\r\n const e = (this.layer.entities as any).add({\r\n polyline: { positions: [], width, material: edgeColor, clampToGround: false },\r\n properties: { _type: 'frustum-edge', _edgeIndex: i },\r\n } as any);\r\n this.edgeEntities.push(e);\r\n }\r\n // 侧面(4 个三角形)\r\n this.faceEntities = [];\r\n for (let i = 0; i < 4; i++) {\r\n const f = (this.layer.entities as any).add({\r\n polygon: {\r\n show: false,\r\n hierarchy: new C.PolygonHierarchy([]),\r\n material: fillColor,\r\n perPositionHeight: true,\r\n outline: false,\r\n },\r\n properties: { _type: 'frustum-face', _faceIndex: i },\r\n } as any);\r\n this.faceEntities.push(f);\r\n }\r\n // 从顶点指向底面中心的“垂直箭头线”(用于强调深度/方向)\r\n if (!this.verticalLineEntity) {\r\n this.verticalLineEntity = (this.layer.entities as any).add({\r\n polyline: {\r\n show: true,\r\n positions: [],\r\n width: width * 1.5, // Slightly wider for visibility\r\n material: new C.PolylineArrowMaterialProperty(edgeColor),\r\n clampToGround: false,\r\n arcType: C.ArcType.NONE,\r\n },\r\n properties: { _type: 'frustum-vertical-line' },\r\n } as any);\r\n }\r\n }\r\n\r\n /**\r\n * 静态更新:在给定姿态一次性计算并更新几何\r\n * - 适合低频率更新或仅渲染一次的场景\r\n */\r\n showAt(\r\n apex: Cesium.Cartesian3,\r\n headingDeg: number,\r\n pitchDeg: number = 0,\r\n rollDeg: number = 0,\r\n fovDeg?: number,\r\n lengthOverride?: number,\r\n ) {\r\n if (this.destroyed) return;\r\n const C: any = this.CesiumNS as any;\r\n const length = Math.max(1, lengthOverride ?? this.opts.length ?? 500);\r\n\r\n const lakeEdge: Cesium.Color =\r\n (this.opts.color as any) ?? (C.Color.fromCssColorString('#1e90ff') as any);\r\n const alpha = this.opts.fillAlpha ?? 0.25;\r\n const lakeFill: Cesium.Color = (\r\n (this.opts.fillColor as any) ?? (C.Color.fromCssColorString('#1e90ff') as any)\r\n ).withAlpha(alpha);\r\n const width = this.opts.width ?? 3;\r\n\r\n this.ensureEntities(lakeEdge, width, lakeFill);\r\n\r\n // 计算并日志输出半视场角(如启用)\r\n const effectiveFov = Math.max(1, Math.min(120, fovDeg ?? this.opts.fov ?? 50));\r\n const aspectRatio = this.opts.aspectRatio ?? 4 / 3;\r\n this.logAnglesIfChanged(effectiveFov, aspectRatio, headingDeg, pitchDeg);\r\n\r\n // 使用集中计算函数获取方锥体几何\r\n const { apex: apexPos, corners, baseCenter } = this.computeFrustumGeometry(\r\n apex,\r\n headingDeg,\r\n pitchDeg,\r\n rollDeg,\r\n effectiveFov,\r\n length,\r\n );\r\n\r\n try {\r\n (this.baseFillEntity as any).polygon.hierarchy = new C.PolygonHierarchy(corners);\r\n (this.baseFillEntity as any).polygon.show = true;\r\n } catch {}\r\n // Update 4 edges\r\n for (let i = 0; i < this.edgeEntities.length; i++) {\r\n try {\r\n (this.edgeEntities[i] as any).polyline.positions = [apexPos, corners[i]];\r\n } catch {}\r\n }\r\n // 更新“垂直箭头线”:从 apex 指向 baseCenter(箭头朝向最后一个点)\r\n if (this.verticalLineEntity) {\r\n try {\r\n // Order matters: arrow points to the last position (baseCenter)\r\n (this.verticalLineEntity as any).polyline.positions = [apexPos, baseCenter];\r\n (this.verticalLineEntity as any).polyline.show = true;\r\n } catch {}\r\n }\r\n // 更新 4 个侧面三角形(apex -> ci -> c(i+1))\r\n for (let i = 0; i < this.faceEntities.length; i++) {\r\n const ci = corners[i];\r\n const cj = corners[(i + 1) % 4];\r\n try {\r\n (this.faceEntities[i] as any).polygon.hierarchy = new C.PolygonHierarchy([apexPos, ci, cj]);\r\n (this.faceEntities[i] as any).polygon.show = true;\r\n } catch {}\r\n }\r\n }\r\n\r\n /**\r\n * 动态更新:通过回调获取实时姿态,由 Cesium 在每帧调用 CallbackProperty 自动评估\r\n * - 适合高频率变化(相机/游标联动)\r\n */\r\n showAtDynamic(\r\n apexCallback: () => Cesium.Cartesian3,\r\n headingDegCallback: () => number,\r\n pitchDegCallback: () => number,\r\n rollDegCallback: () => number,\r\n fovDegCallback: () => number,\r\n lengthCallback: () => number,\r\n ) {\r\n if (this.destroyed) return;\r\n const C: any = this.CesiumNS as any;\r\n\r\n const lakeEdge: Cesium.Color =\r\n (this.opts.color as any) ?? (C.Color.fromCssColorString('#1e90ff') as any);\r\n const alpha = this.opts.fillAlpha ?? 0.25;\r\n const lakeFill: Cesium.Color = (\r\n (this.opts.fillColor as any) ?? (C.Color.fromCssColorString('#1e90ff') as any)\r\n ).withAlpha(alpha);\r\n const width = this.opts.width ?? 3;\r\n\r\n this.ensureEntities(lakeEdge, width, lakeFill);\r\n\r\n // 统一几何计算:回调计算当前 apex/corners/baseCenter,并(可选)打印半视场角变化日志\r\n const computeCorners = () => {\r\n const apex = apexCallback();\r\n const heading = headingDegCallback();\r\n const pitch = pitchDegCallback();\r\n const roll = rollDegCallback();\r\n const fov = Math.max(1, Math.min(120, fovDegCallback()));\r\n const ar = this.opts.aspectRatio ?? 4 / 3;\r\n this.logAnglesIfChanged(fov, ar, heading, pitch);\r\n return this.computeFrustumGeometry(apex, heading, pitch, roll, fov, lengthCallback());\r\n };\r\n\r\n // Update base fill with CallbackProperty\r\n try {\r\n (this.baseFillEntity as any).polygon.hierarchy = new C.CallbackProperty(() => {\r\n const { corners } = computeCorners();\r\n return new C.PolygonHierarchy(corners);\r\n }, false);\r\n (this.baseFillEntity as any).polygon.show = true;\r\n } catch {}\r\n\r\n // 更新 4 条边线(CallbackProperty)\r\n for (let i = 0; i < this.edgeEntities.length; i++) {\r\n try {\r\n (this.edgeEntities[i] as any).polyline.positions = new C.CallbackProperty(() => {\r\n const { apex, corners } = computeCorners();\r\n return [apex, corners[i]];\r\n }, false);\r\n } catch {}\r\n }\r\n\r\n // 更新 4 个侧面三角形(CallbackProperty)\r\n for (let i = 0; i < this.faceEntities.length; i++) {\r\n try {\r\n (this.faceEntities[i] as any).polygon.hierarchy = new C.CallbackProperty(() => {\r\n const { apex, corners } = computeCorners();\r\n const ci = corners[i];\r\n const cj = corners[(i + 1) % 4];\r\n return new C.PolygonHierarchy([apex, ci, cj]);\r\n }, false);\r\n (this.faceEntities[i] as any).polygon.show = true;\r\n } catch {}\r\n }\r\n\r\n // 更新“垂直箭头线”(CallbackProperty)\r\n if (this.verticalLineEntity) {\r\n try {\r\n (this.verticalLineEntity as any).polyline.positions = new C.CallbackProperty(() => {\r\n const { apex, baseCenter } = computeCorners();\r\n return [apex, baseCenter];\r\n }, false);\r\n (this.verticalLineEntity as any).polyline.show = true;\r\n } catch {}\r\n }\r\n }\r\n\r\n /**\r\n * 销毁:移除所有已创建的实体并释放引用\r\n * - 与 clear 的区别:destroy 彻底删除实体;clear 仅隐藏/清空坐标以复用\r\n */\r\n destroy() {\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n try {\r\n if (this.baseFillEntity) (this.layer.entities as any).remove(this.baseFillEntity);\r\n } catch {}\r\n this.baseFillEntity = undefined;\r\n try {\r\n for (const e of this.edgeEntities) (this.layer.entities as any).remove(e);\r\n } catch {}\r\n this.edgeEntities = [];\r\n try {\r\n for (const f of this.faceEntities) (this.layer.entities as any).remove(f);\r\n } catch {}\r\n this.faceEntities = [];\r\n try {\r\n if (this.verticalLineEntity) (this.layer.entities as any).remove(this.verticalLineEntity);\r\n } catch {}\r\n this.verticalLineEntity = undefined;\r\n }\r\n\r\n /**\r\n * 清理:隐藏几何但不销毁实例(保留复用能力)\r\n */\r\n clear() {\r\n if (this.destroyed) return;\r\n try {\r\n if (this.baseFillEntity) (this.baseFillEntity as any).polygon.show = false;\r\n } catch {}\r\n try {\r\n for (const f of this.faceEntities) (f as any).polygon.show = false;\r\n } catch {}\r\n try {\r\n for (const e of this.edgeEntities) (e as any).polyline.positions = [];\r\n } catch {}\r\n try {\r\n if (this.verticalLineEntity) (this.verticalLineEntity as any).polyline.positions = [];\r\n } catch {}\r\n }\r\n}\r\n","/**\r\n * 轻量级“飞机/无人机”游标(键盘控制)\r\n * - 维护当前位置与姿态(heading/pitch/roll),并通过回调通知宿主\r\n * - 支持按住按键连续移动/旋转(基于 requestAnimationFrame 的更新循环)\r\n * - 提供一个由三角面组成的可视化“金字塔箭头”与视锥体、海拔标记\r\n * - 与全局相机事件总线同步 FOV(视场角),动态更新视锥体\r\n */\r\nimport type * as Cesium from 'cesium';\r\nimport { FrustumPyramid } from './FrustumPyramid';\r\nimport { HeightMarker } from './HeightMarker';\r\nimport { globalCameraEventBus } from '../../utils/events';\r\nimport droneModel from '../../assets/wurenji.glb';\r\n\r\nexport interface AirplaneCursorOptions {\r\n /**\r\n * 姿态(位置 + 朝向)变化时的回调\r\n * - 建议在此回调中更新外部 UI、路径点预览、或记录轨迹\r\n */\r\n onPose?: (pose: {\r\n position: Cesium.Cartesian3;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n }) => void;\r\n /**\r\n * 请求宿主在当前姿态插入一个顶点(按下 Enter 触发)\r\n * - insertAt: 顶点插入位置,当前固定为 -1(末尾/默认规则交由宿主处理)\r\n */\r\n onAddVertex?: (pose: {\r\n position: Cesium.Cartesian3;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n insertAt: number;\r\n }) => void;\r\n /** 键盘位移步长(单位:米) */\r\n stepMeters?: number;\r\n /** 航向/俯仰/横滚的角度增量(单位:度,常速) */\r\n angleStepDeg?: number;\r\n /** 按住 Shift 时的加速倍率(位移与角度均受影响) */\r\n fastFactor?: number;\r\n /** 游标可视化颜色(部分用于视锥体) */\r\n color?: Cesium.Color;\r\n /** 视锥体 FOV(度) */\r\n fovDeg?: number;\r\n}\r\n\r\n/** Lightweight airplane (UAV) cursor controlled by keyboard; notifies host of pose + add-vertex intent. */\r\nexport class AirplaneCursor {\r\n /** 是否已销毁,避免重复操作 */\r\n private destroyed = false;\r\n /** 主实体引用(为兼容右键交互而保留,实际显示由多个三角面实体组成) */\r\n private entity?: Cesium.Entity;\r\n /** 键盘按下事件监听器 */\r\n private keyListener?: (e: KeyboardEvent) => void;\r\n /** 键盘抬起事件监听器 */\r\n private keyupListener?: (e: KeyboardEvent) => void;\r\n /** 当前姿态:位置 + 航向/俯仰/横滚(单位:度) */\r\n private pose: { position: Cesium.Cartesian3; heading: number; pitch: number; roll: number };\r\n /** 位移步长(米) */\r\n private step: number;\r\n /** 角度步长(度) */\r\n private angleStep: number;\r\n /** 加速倍率(按住 Shift 生效) */\r\n private fastFactor: number;\r\n /** 外部传入的行为配置与回调 */\r\n private opts: AirplaneCursorOptions;\r\n // 使用内联的 _FrustumPyramid\r\n private frustum?: FrustumPyramid;\r\n /** 海拔标记(显示当前高度) */\r\n private heightMarker?: HeightMarker;\r\n // 记录当前被按下且尚未释放的按键(用于连续更新)\r\n private keysPressed = new Set<string>();\r\n private updateLoopRunning = false;\r\n // 当前 FOV 值(来自外部相机事件总线),用于动态更新视锥体\r\n private currentFOV: number;\r\n // 无人机模型实体\r\n private modelEntity?: Cesium.Entity;\r\n // 存储金字塔的所有面实体,便于拾取/删除\r\n private pyramidEntities: any[] = [];\r\n // 临时数据源,用于存储金字塔实体(避免污染宿主图层)\r\n private pyramidLayer?: any;\r\n // 缓存的缩放因子,仅在相机变化时更新\r\n private cachedScaleFactor = 1;\r\n // 相机变化事件监听器\r\n private cameraChangedListener?: Cesium.Event.RemoveCallback;\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Cesium.Viewer,\r\n startPosition: Cesium.Cartesian3,\r\n opts: AirplaneCursorOptions = {},\r\n ) {\r\n /**\r\n * 构造参数说明:\r\n * - CesiumNS: 运行时传入的 Cesium 命名空间(避免直接依赖全局)\r\n * - viewer: Cesium.Viewer 实例,用于添加数据源与请求渲染\r\n * - startPosition: 初始位置(Cartesian3)\r\n * - opts: 选项与回调(见 AirplaneCursorOptions)\r\n */\r\n const C: any = this.CesiumNS as any;\r\n this.opts = opts;\r\n this.pose = { position: startPosition, heading: 0, pitch: -10, roll: 0 };\r\n this.step = opts.stepMeters ?? 2;\r\n this.angleStep = opts.angleStepDeg ?? 1;\r\n this.fastFactor = opts.fastFactor ?? 5;\r\n this.currentFOV = opts.fovDeg ?? 50; // 初始化当前 FOV\r\n this.ensureEntity(opts.color ?? C.Color.CYAN.withAlpha(0.9));\r\n // frustum 初始化延迟到第一次 updateFrustum\r\n this.attachKeyboard(opts);\r\n // 监听全局 FOV 变化事件\r\n this.setupFOVListener();\r\n }\r\n\r\n private ensureEntity(color: any) {\r\n // 确保构建用于表示游标的实体集合(仅初始化一次)\r\n if (this.entity) return;\r\n const C: any = this.CesiumNS as any;\r\n \r\n // Create a temporary layer for model entity if not exists\r\n if (!this.pyramidLayer) {\r\n this.pyramidLayer = new C.CustomDataSource('AirplaneCursorModel');\r\n this.viewer.dataSources.add(this.pyramidLayer);\r\n }\r\n \r\n // 模型参数\r\n const modelHeadingOffset = 270; // 模型初始朝向偏移(度),根据模型调整\r\n const baseVerticalOffset = 10; // 基础垂直偏移(米)\r\n const baseForwardOffset = 5; // 基础前向偏移(米)\r\n const baseRightOffset = -9; // 基础右向偏移(米)\r\n \r\n // 缩放参数\r\n const baseScale = 0.15; // 基础缩放(初始大小)\r\n const minScale = 0.025; // 最小缩放\r\n const maxScale = 1.5; // 最大缩放\r\n const referenceDistance = 800; // 参考距离(米),在此距离时使用基础缩放\r\n \r\n // 计算缩放比例(基于相机距离)\r\n const computeScaleFactor = () => {\r\n try {\r\n const cameraPos = this.viewer.camera.positionWC;\r\n const modelPos = this.pose.position;\r\n const distance = C.Cartesian3.distance(cameraPos, modelPos);\r\n // 距离近时缩小,距离远时放大\r\n const rawScale = baseScale * (distance / referenceDistance);\r\n const clampedScale = Math.max(minScale, Math.min(maxScale, rawScale));\r\n return clampedScale / baseScale;\r\n } catch {\r\n return 1;\r\n }\r\n };\r\n \r\n // 初始化缩放因子\r\n this.cachedScaleFactor = computeScaleFactor();\r\n \r\n // 监听相机变化事件,更新缩放因子\r\n this.cameraChangedListener = this.viewer.camera.changed.addEventListener(() => {\r\n this.cachedScaleFactor = computeScaleFactor();\r\n this.viewer.scene?.requestRender?.();\r\n });\r\n \r\n // 使用无人机 glTF 模型\r\n this.modelEntity = this.pyramidLayer.entities.add({\r\n position: new C.CallbackProperty(() => {\r\n // 应用偏移,让模型中心与指示点对齐\r\n // 偏移量需要考虑 heading 和 pitch,并随缩放同步变化\r\n const pos = this.pose.position;\r\n const headingRad = C.Math.toRadians(this.pose.heading);\r\n const pitchRad = C.Math.toRadians(this.pose.pitch);\r\n const scaleFactor = this.cachedScaleFactor;\r\n \r\n // 偏移量随缩放同步变化\r\n const modelVerticalOffset = baseVerticalOffset * scaleFactor;\r\n const modelForwardOffset = baseForwardOffset * scaleFactor;\r\n const modelRightOffset = baseRightOffset * scaleFactor;\r\n \r\n // 计算 ENU 坐标系\r\n const enu = C.Transforms.eastNorthUpToFixedFrame(pos);\r\n const east = C.Cartesian3.fromCartesian4(C.Matrix4.getColumn(enu, 0, new C.Cartesian4()));\r\n const north = C.Cartesian3.fromCartesian4(C.Matrix4.getColumn(enu, 1, new C.Cartesian4()));\r\n const up = C.Cartesian3.fromCartesian4(C.Matrix4.getColumn(enu, 2, new C.Cartesian4()));\r\n \r\n // 根据 heading 计算水平方向\r\n const horizForward = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(east, Math.sin(headingRad), new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(north, Math.cos(headingRad), new C.Cartesian3()),\r\n new C.Cartesian3()\r\n );\r\n const right = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(east, Math.cos(headingRad), new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(north, -Math.sin(headingRad), new C.Cartesian3()),\r\n new C.Cartesian3()\r\n );\r\n \r\n // 根据 pitch 调整前向和上向(让偏移随 pitch 旋转)\r\n const forward = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(horizForward, Math.cos(pitchRad), new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(up, Math.sin(pitchRad), new C.Cartesian3()),\r\n new C.Cartesian3()\r\n );\r\n const upRotated = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(horizForward, -Math.sin(pitchRad), new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(up, Math.cos(pitchRad), new C.Cartesian3()),\r\n new C.Cartesian3()\r\n );\r\n \r\n // 应用偏移(随 heading、pitch 和缩放一起变化)\r\n let result = C.Cartesian3.clone(pos);\r\n result = C.Cartesian3.add(result, C.Cartesian3.multiplyByScalar(forward, modelForwardOffset, new C.Cartesian3()), result);\r\n result = C.Cartesian3.add(result, C.Cartesian3.multiplyByScalar(right, modelRightOffset, new C.Cartesian3()), result);\r\n result = C.Cartesian3.add(result, C.Cartesian3.multiplyByScalar(upRotated, modelVerticalOffset, new C.Cartesian3()), result);\r\n \r\n return result;\r\n }, false),\r\n orientation: new C.CallbackProperty(() => {\r\n // 计算基于 heading/pitch/roll 的方向四元数,加上模型朝向偏移\r\n const hpr = new C.HeadingPitchRoll(\r\n C.Math.toRadians(this.pose.heading + modelHeadingOffset),\r\n C.Math.toRadians(this.pose.pitch),\r\n C.Math.toRadians(this.pose.roll)\r\n );\r\n return C.Transforms.headingPitchRollQuaternion(this.pose.position, hpr);\r\n }, false),\r\n model: {\r\n uri: droneModel,\r\n scale: new C.CallbackProperty(() => {\r\n return baseScale * this.cachedScaleFactor;\r\n }, false),\r\n minimumPixelSize: 24,\r\n silhouetteColor: C.Color.CYAN,\r\n silhouetteSize: 1.0,\r\n },\r\n properties: { _type: 'airplane-cursor' },\r\n } as any);\r\n \r\n // Store reference for compatibility\r\n this.entity = this.modelEntity;\r\n this.pyramidEntities = [this.modelEntity];\r\n }\r\n\r\n // private computeHeadingLine(): Cesium.Cartesian3[] {\r\n // const C: any = this.CesiumNS as any;\r\n // const len = 15;\r\n // try {\r\n // const { position, heading } = this.pose;\r\n // const enu = C.Transforms.eastNorthUpToFixedFrame(position);\r\n // const east = C.Matrix4.getColumn(enu, 0, new C.Cartesian4());\r\n // const north = C.Matrix4.getColumn(enu, 1, new C.Cartesian4());\r\n // const e3 = new C.Cartesian3(east.x, east.y, east.z);\r\n // const n3 = new C.Cartesian3(north.x, north.y, north.z);\r\n // const hr = C.Math.toRadians(heading);\r\n // const dir = C.Cartesian3.add(\r\n // C.Cartesian3.multiplyByScalar(e3, Math.sin(hr) * len, new C.Cartesian3()),\r\n // C.Cartesian3.multiplyByScalar(n3, Math.cos(hr) * len, new C.Cartesian3()),\r\n // new C.Cartesian3(),\r\n // );\r\n // const end = C.Cartesian3.add(position, dir, new C.Cartesian3());\r\n // return [position, end];\r\n // } catch {\r\n // return [this.pose.position, this.pose.position];\r\n // }\r\n // }\r\n\r\n // billboard icon removed; 3D arrow polygon used instead\r\n\r\n /**\r\n * 注册键盘控制:\r\n * - 移动:W/S(前/后)、A/D(左/右)、Z/C(上/下)\r\n * - 旋转:Q/E(航向左/右)、I/K(俯仰上/下)、U/O(横滚左/右)\r\n * - 添加:Enter(请求宿主添加顶点)\r\n * - 加速:按住 Shift(位移与角度步长乘以 fastFactor)\r\n *\r\n * 设计要点:按键按下只记录到集合,真正更新在 RAF 循环中完成,避免频繁处理 keydown 事件。\r\n */\r\n private attachKeyboard(opts: AirplaneCursorOptions) {\r\n const keyHandler = (ev: KeyboardEvent) => {\r\n if (this.destroyed) return;\r\n const key = ev.key.toLowerCase();\r\n \r\n // Handle Enter key immediately (single action)\r\n if (key === 'enter') {\r\n ev.preventDefault();\r\n this.opts?.onAddVertex?.({ ...this.pose, insertAt: -1 });\r\n return;\r\n }\r\n \r\n // For movement/rotation keys, just track pressed state\r\n // const movementKeys = ['w', 's', 'a', 'd', 'z', 'c', 'q', 'e', 'i', 'k', 'u', 'o'];\r\n const movementKeys = ['w', 's', 'a', 'd', 'z', 'c', 'q', 'e', 'i', 'k'];\r\n if (movementKeys.includes(key)) {\r\n ev.preventDefault();\r\n const wasEmpty = this.keysPressed.size === 0;\r\n this.keysPressed.add(key);\r\n \r\n // Start update loop if not already running\r\n if (wasEmpty && !this.updateLoopRunning) {\r\n this.startUpdateLoop();\r\n }\r\n }\r\n };\r\n \r\n const keyupHandler = (ev: KeyboardEvent) => {\r\n if (this.destroyed) return;\r\n const key = ev.key.toLowerCase();\r\n this.keysPressed.delete(key);\r\n };\r\n \r\n window.addEventListener('keydown', keyHandler, { passive: false } as any);\r\n window.addEventListener('keyup', keyupHandler, { passive: false } as any);\r\n this.keyListener = keyHandler;\r\n this.keyupListener = keyupHandler;\r\n }\r\n\r\n /**\r\n * 监听全局 FOV 变化事件,同步更新视锥体\r\n */\r\n private setupFOVListener() {\r\n // 订阅全局 FOV 变化事件,更新本地 currentFOV;视锥体通过动态回调实时读取\r\n globalCameraEventBus.onFOVChange.on((event) => {\r\n // 更新当前 FOV 值,showAtDynamic 的回调会自动使用新值\r\n this.currentFOV = event.fov;\r\n });\r\n }\r\n \r\n private startUpdateLoop() {\r\n // 启动基于 requestAnimationFrame 的更新循环,仅在存在被按下的按键时运行\r\n if (this.updateLoopRunning || this.destroyed) return;\r\n this.updateLoopRunning = true;\r\n \r\n const update = () => {\r\n if (this.destroyed || this.keysPressed.size === 0) {\r\n this.updateLoopRunning = false;\r\n return;\r\n }\r\n \r\n // Process all currently pressed keys\r\n const C: any = this.CesiumNS as any;\r\n const fast = this.keysPressed.has('shift') ? this.fastFactor : 1;\r\n let moved = false;\r\n const step = this.step * fast;\r\n const ang = this.angleStep * fast;\r\n const pose = this.pose;\r\n // 将当前位置构建 ENU(东-北-天)局部坐标系,便于做方向向量计算\r\n const enu = C.Transforms.eastNorthUpToFixedFrame(pose.position);\r\n const east = C.Matrix4.getColumn(enu, 0, new C.Cartesian4());\r\n const north = C.Matrix4.getColumn(enu, 1, new C.Cartesian4());\r\n const up = C.Matrix4.getColumn(enu, 2, new C.Cartesian4());\r\n const e3 = new C.Cartesian3(east.x, east.y, east.z);\r\n const n3 = new C.Cartesian3(north.x, north.y, north.z);\r\n const u3 = new C.Cartesian3(up.x, up.y, up.z);\r\n const addVec = (src: any, v: any) => C.Cartesian3.add(src, v, new C.Cartesian3());\r\n const setPos = (p: any) => (pose.position = p);\r\n\r\n if (this.keysPressed.has('w')) {\r\n // forward in heading plane\r\n const hr = C.Math.toRadians(pose.heading);\r\n const dir = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(e3, Math.sin(hr) * step, new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(n3, Math.cos(hr) * step, new C.Cartesian3()),\r\n new C.Cartesian3(),\r\n );\r\n setPos(addVec(pose.position, dir));\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('s')) {\r\n // backward\r\n const hr = C.Math.toRadians(pose.heading);\r\n const dir = C.Cartesian3.add(\r\n C.Cartesian3.multiplyByScalar(e3, -Math.sin(hr) * step, new C.Cartesian3()),\r\n C.Cartesian3.multiplyByScalar(n3, -Math.cos(hr) * step, new C.Cartesian3()),\r\n new C.Cartesian3(),\r\n );\r\n setPos(addVec(pose.position, dir));\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('a')) {\r\n // left\r\n setPos(addVec(pose.position, C.Cartesian3.multiplyByScalar(e3, -step, new C.Cartesian3())));\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('d')) {\r\n // right\r\n setPos(addVec(pose.position, C.Cartesian3.multiplyByScalar(e3, step, new C.Cartesian3())));\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('c')) {\r\n // up\r\n setPos(addVec(pose.position, C.Cartesian3.multiplyByScalar(u3, step, new C.Cartesian3())));\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('z')) {\r\n // down - 不再限制最小高度,允许用户自由调整\r\n const newPos = addVec(pose.position, C.Cartesian3.multiplyByScalar(u3, -step, new C.Cartesian3()));\r\n setPos(newPos);\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('q')) {\r\n // heading left\r\n pose.heading = clampDeg(pose.heading - ang);\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('e')) {\r\n // heading right\r\n pose.heading = clampDeg(pose.heading + ang);\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('i')) {\r\n // pitch up\r\n pose.pitch = clampRange(pose.pitch + ang, -90, 70);\r\n moved = true;\r\n }\r\n if (this.keysPressed.has('k')) {\r\n // pitch down\r\n pose.pitch = clampRange(pose.pitch - ang, -90, 70);\r\n moved = true;\r\n }\r\n // if (this.keysPressed.has('u')) {\r\n // // roll left\r\n // pose.roll = clampRange(pose.roll - ang, -90, 90);\r\n // moved = true;\r\n // }\r\n // if (this.keysPressed.has('o')) {\r\n // // roll right\r\n // pose.roll = clampRange(pose.roll + ang, -90, 90);\r\n // moved = true;\r\n // }\r\n\r\n if (moved) {\r\n // 姿态变化:通知宿主、请求渲染、并确保视锥体/可视化同步\r\n this.opts?.onPose?.({ ...pose });\r\n this.viewer.scene?.requestRender?.();\r\n this.updateFrustum();\r\n // 广播游标姿态变化事件\r\n this.broadcastPoseChange();\r\n // Pyramid updates automatically via CallbackProperty - no manual update needed\r\n }\r\n \r\n // Continue loop\r\n requestAnimationFrame(update);\r\n };\r\n \r\n requestAnimationFrame(update);\r\n }\r\n // Future: add method to update options if required\r\n /**\r\n * 更新配置(非破坏式合并)。\r\n * 注意:不会立即改变现有实体样式,更多用于动态调整回调与步长参数。\r\n */\r\n updateOptions(partial: AirplaneCursorOptions) {\r\n this.opts = { ...this.opts, ...partial };\r\n }\r\n\r\n /** 同步当前路径数据供插入计算使用 */\r\n // syncPath 与自动插入计算已删除;保留空占位可在未来扩展(例如路径辅助显示)\r\n\r\n /**\r\n * 延迟创建并维护视锥体与海拔标记:\r\n * - 首次调用时创建 FrustumPyramid 与 HeightMarker,并绑定动态回调\r\n * - 后续只依赖回调读取 pose 与 currentFOV 即可自动更新\r\n */\r\n private updateFrustum() {\r\n try {\r\n if (!this.frustum) {\r\n // 选取已有 datasource; 没有则创建一个临时的\r\n let layer = (this.viewer.dataSources as any)?._dataSources?.[0];\r\n const C: any = this.CesiumNS as any;\r\n if (!layer) {\r\n layer = new C.CustomDataSource('FrustumLayer');\r\n this.viewer.dataSources.add(layer);\r\n }\r\n \r\n this.frustum = new FrustumPyramid(this.CesiumNS, layer, {\r\n fov: this.opts.fovDeg ?? 40,\r\n length: 80,\r\n color: this.opts.color as any,\r\n fillAlpha: 0.25,\r\n width: 2,\r\n // 启用角度变化日志(输出到浏览器控制台),并设置节流间隔\r\n logAngles: false,\r\n logThrottleMs: 300,\r\n });\r\n \r\n // 视锥体视觉缩放系数(将外部传入的 FOV 和深度按比例缩小,便于观察)\r\n const frustumFovScale = 0.6; // FOV 缩放系数\r\n const frustumLengthScale = 0.1; // 深度缩放系数\r\n \r\n // 使用 showAtDynamic 方法,传入回调函数持续读取姿态\r\n this.frustum.showAtDynamic(\r\n () => this.pose.position,\r\n () => this.pose.heading,\r\n () => this.pose.pitch,\r\n () => this.pose.roll,\r\n () => this.currentFOV * frustumFovScale, // 缩小 FOV\r\n () => 1000 * frustumLengthScale // 缩小深度(1000 -> 100)\r\n );\r\n \r\n // Initialize height marker in the same layer to avoid clutter\r\n try {\r\n this.heightMarker = new HeightMarker(this.CesiumNS, this.viewer, layer);\r\n // 使用 showAtDynamic 方法,传入回调函数持续读取位置\r\n this.heightMarker.showAtDynamic(() => this.pose.position);\r\n } catch {}\r\n }\r\n } catch {}\r\n }\r\n\r\n /** 获取当前姿态(包含高度信息) */\r\n getPose() {\r\n const C: any = this.CesiumNS as any;\r\n const cartographic = C.Cartographic.fromCartesian(this.pose.position);\r\n const altitude = cartographic ? cartographic.height : 0;\r\n return {\r\n ...this.pose,\r\n altitude,\r\n };\r\n }\r\n\r\n /** 获取内部实体(用于拾取识别) */\r\n getEntity() {\r\n return this.entity;\r\n }\r\n\r\n /** 检查给定实体是否属于此游标(包括所有金字塔各个面实体) */\r\n containsEntity(entity: Cesium.Entity | undefined): boolean {\r\n if (!entity) return false;\r\n\r\n const C: any = this.CesiumNS as any;\r\n const now =\r\n this.viewer?.clock?.currentTime ??\r\n (typeof C?.JulianDate?.now === 'function' ? C.JulianDate.now() : undefined);\r\n\r\n const getPropertyValue = (properties: any, key: string) => {\r\n if (!properties) return undefined;\r\n const prop = properties[key];\r\n if (!prop) return undefined;\r\n if (typeof prop.getValue === 'function') {\r\n try {\r\n return prop.getValue(now);\r\n } catch {\r\n try {\r\n return prop.getValue(undefined);\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n }\r\n return prop;\r\n };\r\n\r\n const targetId = (entity as any).id;\r\n const targetProps = (entity as any).properties;\r\n const targetType = getPropertyValue(targetProps, '_type');\r\n const targetPart = getPropertyValue(targetProps, '_pyramidPart');\r\n\r\n return this.pyramidEntities.some((pyramidEntity) => {\r\n if (!pyramidEntity) return false;\r\n if (pyramidEntity === entity) return true;\r\n\r\n if (targetId && pyramidEntity.id === targetId) {\r\n return true;\r\n }\r\n\r\n if (targetType) {\r\n const pyramidType = getPropertyValue((pyramidEntity as any).properties, '_type');\r\n if (pyramidType === targetType) {\r\n if (!targetPart) return true;\r\n const pyramidPart = getPropertyValue((pyramidEntity as any).properties, '_pyramidPart');\r\n if (pyramidPart === targetPart) return true;\r\n }\r\n }\r\n\r\n return false;\r\n });\r\n }\r\n\r\n /** 外部设置姿态(用于选中顶点后同步游标) */\r\n setPose(position: Cesium.Cartesian3, heading: number, pitch: number, roll: number) {\r\n this.pose.position = position;\r\n this.pose.heading = clampDeg(heading);\r\n this.pose.pitch = clampRange(pitch, -90, 70);\r\n this.pose.roll = clampRange(roll, -90, 90);\r\n try {\r\n this.opts?.onPose?.({ ...this.pose });\r\n } catch {}\r\n this.updateFrustum();\r\n this.broadcastPoseChange();\r\n this.viewer.scene?.requestRender?.();\r\n }\r\n\r\n /**\r\n * 广播游标姿态变化事件到全局事件总线\r\n */\r\n private broadcastPoseChange() {\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const cartographic = C.Cartographic.fromCartesian(this.pose.position);\r\n const altitude = cartographic ? cartographic.height : 0;\r\n \r\n console.log('[AirplaneCursor] 📡 广播姿态变化:', {\r\n heading: this.pose.heading,\r\n pitch: this.pose.pitch,\r\n altitude,\r\n });\r\n \r\n globalCameraEventBus.onCursorPoseChange.emit({\r\n position: this.pose.position,\r\n heading: this.pose.heading,\r\n pitch: this.pose.pitch,\r\n roll: this.pose.roll,\r\n altitude,\r\n source: 'cursor',\r\n });\r\n } catch (e) {\r\n // 忽略广播错误\r\n }\r\n }\r\n\r\n /**\r\n * 模拟按键按下(用于虚拟控制器)\r\n * @param key 按键名称 (w/a/s/d/q/e/c/z)\r\n * @param duration 按键持续时间(毫秒),默认 100ms\r\n */\r\n simulateKeyPress(key: string, duration: number = 100) {\r\n const lowerKey = key.toLowerCase();\r\n // 映射 C/Z 到实际的高度控制键\r\n const keyMap: Record<string, string> = {\r\n 'c': 'c', // 上升\r\n 'z': 'z', // 下降\r\n };\r\n const mappedKey = keyMap[lowerKey] || lowerKey;\r\n \r\n console.log('[AirplaneCursor] 🎮 simulateKeyPress:', mappedKey, 'duration:', duration);\r\n console.log('[AirplaneCursor] 🎮 updateLoopRunning:', this.updateLoopRunning);\r\n \r\n this.keysPressed.add(mappedKey);\r\n if (!this.updateLoopRunning) {\r\n console.log('[AirplaneCursor] 🎮 启动 updateLoop');\r\n this.startUpdateLoop();\r\n }\r\n \r\n // 自动释放按键\r\n setTimeout(() => {\r\n this.keysPressed.delete(mappedKey);\r\n }, duration);\r\n }\r\n\r\n destroy() {\r\n // 释放事件与图形资源,防止内存泄漏;重复调用将被忽略\r\n if (this.destroyed) return;\r\n this.destroyed = true;\r\n this.keysPressed.clear();\r\n this.updateLoopRunning = false;\r\n try {\r\n if (this.entity) this.viewer.entities.remove(this.entity);\r\n } catch {}\r\n this.entity = undefined;\r\n \r\n // Clean up pyramid entities\r\n try {\r\n this.pyramidEntities.forEach(entity => {\r\n try {\r\n this.pyramidLayer?.entities.remove(entity);\r\n } catch {}\r\n });\r\n this.pyramidEntities = [];\r\n } catch {}\r\n \r\n // Remove pyramid layer\r\n try {\r\n if (this.pyramidLayer) {\r\n this.viewer.dataSources.remove(this.pyramidLayer);\r\n }\r\n } catch {}\r\n this.pyramidLayer = undefined;\r\n \r\n // 移除相机变化事件监听器\r\n try {\r\n this.cameraChangedListener?.();\r\n } catch {}\r\n this.cameraChangedListener = undefined;\r\n \r\n try {\r\n this.frustum?.destroy();\r\n } catch {}\r\n this.frustum = undefined;\r\n try {\r\n this.heightMarker?.destroy();\r\n } catch {}\r\n this.heightMarker = undefined;\r\n try {\r\n if (this.keyListener) window.removeEventListener('keydown', this.keyListener as any);\r\n if (this.keyupListener) window.removeEventListener('keyup', this.keyupListener as any);\r\n } catch {}\r\n }\r\n}\r\n\r\n/**\r\n * 将角度标准化到 [0, 360) 区间\r\n */\r\nfunction clampDeg(v: number) {\r\n return ((v % 360) + 360) % 360;\r\n}\r\n/**\r\n * 将数值限制在指定闭区间 [min, max] 内\r\n */\r\nfunction clampRange(v: number, min: number, max: number) {\r\n return Math.max(min, Math.min(max, v));\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\n/**\r\n * 顶点标签配置选项\r\n */\r\nexport interface VertexLabelOptions {\r\n /** 标签大小(像素) */\r\n size?: number;\r\n /** 普通状态颜色 */\r\n normalColor?: string;\r\n /** 编辑状态颜色 */\r\n editedColor?: string;\r\n /** 选中状态颜色 */\r\n selectedColor?: string;\r\n /** 第一个航点颜色 */\r\n startColor?: string;\r\n /** 选中时边框颜色 */\r\n outlineColor?: string;\r\n /** 文字颜色 */\r\n textColor?: string;\r\n /** 垂直偏移量 */\r\n pixelOffsetY?: number;\r\n}\r\n\r\n/**\r\n * 顶点标签状态\r\n */\r\nexport type VertexLabelState = 'normal' | 'edited' | 'selected';\r\n\r\n/**\r\n * 顶点标签管理器\r\n * 负责创建、更新和销毁路径编辑中的顶点标签(倒三角形+序号)\r\n */\r\nexport class VertexLabelManager {\r\n private CesiumNS: typeof Cesium;\r\n private layer: Cesium.CustomDataSource;\r\n private ownerId: string;\r\n private labels: Array<Cesium.Entity | undefined> = [];\r\n private options: Required<VertexLabelOptions>;\r\n private hiddenClimbIndex?: number;\r\n\r\n constructor(\r\n CesiumNS: typeof Cesium,\r\n layer: Cesium.CustomDataSource,\r\n ownerId: string,\r\n hiddenClimbIndex?: number,\r\n options?: VertexLabelOptions,\r\n ) {\r\n this.CesiumNS = CesiumNS;\r\n this.layer = layer;\r\n this.ownerId = ownerId;\r\n this.hiddenClimbIndex = hiddenClimbIndex;\r\n this.options = {\r\n size: options?.size ?? 48,\r\n normalColor: options?.normalColor ?? '#00FF00',\r\n editedColor: options?.editedColor ?? '#9370DB',\r\n selectedColor: options?.selectedColor ?? '#1E90FF',\r\n startColor: options?.startColor ?? '#FF6B6B',\r\n outlineColor: options?.outlineColor ?? '#FFFFFF',\r\n textColor: options?.textColor ?? '#FFFFFF',\r\n pixelOffsetY: options?.pixelOffsetY ?? -10,\r\n };\r\n }\r\n\r\n /**\r\n * 创建顶点标签\r\n * @param position 顶点位置\r\n * @param index 顶点索引\r\n * @param state 标签状态\r\n * @returns 创建的标签实体,如果跳过则返回 undefined\r\n */\r\n createLabel(\r\n position: Cesium.Cartesian3,\r\n index: number,\r\n state: VertexLabelState = 'normal',\r\n ): Cesium.Entity | undefined {\r\n try {\r\n // 跳过隐藏爬升点\r\n if (this.hiddenClimbIndex !== undefined && index === this.hiddenClimbIndex) {\r\n return undefined;\r\n }\r\n\r\n // 判断是否为第一个航点(显示 \"S\")\r\n const isFirstWaypoint =\r\n (this.hiddenClimbIndex === 1 && index === 2) ||\r\n (this.hiddenClimbIndex === undefined && index === 0);\r\n\r\n if (isFirstWaypoint) {\r\n // 第一个航点使用特殊标记 \"S\"\r\n return this.createStartLabel(position, state === 'selected');\r\n }\r\n\r\n // 跳过起始点(index 0)- 只有当有 takeOffRefPoint 时才跳过\r\n if (index === 0 && this.hiddenClimbIndex === 1) {\r\n return undefined;\r\n }\r\n\r\n // 生成倒三角形 SVG 图标,带序号\r\n const svg = this.generateTriangleSVG(index, state, false);\r\n const blob = new Blob([svg], { type: 'image/svg+xml' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const C = this.CesiumNS as any;\r\n return this.layer.entities.add({\r\n position: position,\r\n billboard: {\r\n image: url,\r\n width: this.options.size,\r\n height: this.options.size,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n horizontalOrigin: C.HorizontalOrigin.CENTER,\r\n pixelOffset: new C.Cartesian2(0, this.options.pixelOffsetY),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: {\r\n _type: 'vertex-label',\r\n _ownerId: this.ownerId,\r\n _vertexIndex: index,\r\n },\r\n } as any);\r\n } catch (e) {\r\n console.error('Failed to create vertex label:', e);\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 创建第一个航点标签(显示 \"S\")\r\n */\r\n private createStartLabel(position: Cesium.Cartesian3, isSelected: boolean): Cesium.Entity | undefined {\r\n try {\r\n const svg = this.generateTriangleSVG(0, isSelected ? 'selected' : 'normal', true);\r\n const blob = new Blob([svg], { type: 'image/svg+xml' });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const C = this.CesiumNS as any;\r\n // 根据是否有隐藏爬升点确定第一个航点的 index\r\n const firstWaypointIndex = this.hiddenClimbIndex === 1 ? 2 : 1;\r\n\r\n return this.layer.entities.add({\r\n position: position,\r\n billboard: {\r\n image: url,\r\n width: this.options.size,\r\n height: this.options.size,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n horizontalOrigin: C.HorizontalOrigin.CENTER,\r\n pixelOffset: new C.Cartesian2(0, this.options.pixelOffsetY),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: {\r\n _type: 'vertex-label',\r\n _ownerId: this.ownerId,\r\n _vertexIndex: firstWaypointIndex,\r\n },\r\n } as any);\r\n } catch (e) {\r\n console.error('Failed to create start label:', e);\r\n return undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 生成倒三角形 SVG\r\n */\r\n private generateTriangleSVG(index: number, state: VertexLabelState, isStart: boolean): string {\r\n const size = this.options.size;\r\n let triangleColor: string;\r\n let outlineColor: string;\r\n let outlineWidth: number;\r\n\r\n if (state === 'selected') {\r\n triangleColor = isStart ? this.options.startColor : this.options.selectedColor;\r\n outlineColor = this.options.outlineColor;\r\n outlineWidth = 2;\r\n } else if (isStart) {\r\n triangleColor = this.options.startColor;\r\n outlineColor = 'none';\r\n outlineWidth = 0;\r\n } else if (state === 'edited') {\r\n triangleColor = this.options.editedColor;\r\n outlineColor = 'none';\r\n outlineWidth = 0;\r\n } else {\r\n triangleColor = this.options.normalColor;\r\n outlineColor = 'none';\r\n outlineWidth = 0;\r\n }\r\n\r\n const textColor = this.options.textColor;\r\n\r\n // 计算显示内容\r\n let displayText: string;\r\n if (isStart) {\r\n displayText = 'S';\r\n } else {\r\n // 计算显示序号:无论什么情况,标签都是 \"S\", \"2\", \"3\", \"4\", \"5\"...\r\n let displayNumber: number;\r\n if (this.hiddenClimbIndex === 1) {\r\n // 有隐藏爬升点:index 2 显示为 S,index 3 显示为 2,index 4 显示为 3...\r\n displayNumber = index - 1; // index 3 -> 2, index 4 -> 3, index 5 -> 4...\r\n } else {\r\n // 无隐藏爬升点:index 0 显示为 S,index 1 显示为 2,index 2 显示为 3...\r\n displayNumber = index + 1; // index 1 -> 2, index 2 -> 3, index 3 -> 4...\r\n }\r\n displayText = displayNumber.toString();\r\n }\r\n\r\n const fontSize = isStart ? 20 : 18;\r\n\r\n return `\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 ${size} ${size}\">\r\n <polygon points=\"${size / 2},${size - 6} 6,10 ${size - 6},10\" \r\n fill=\"${triangleColor}\" \r\n stroke=\"${outlineColor}\" \r\n stroke-width=\"${outlineWidth}\"/>\r\n <text x=\"${size / 2}\" y=\"22\" \r\n font-family=\"Arial, sans-serif\" \r\n font-size=\"${fontSize}\" \r\n font-weight=\"bold\" \r\n fill=\"${textColor}\" \r\n text-anchor=\"middle\" \r\n dominant-baseline=\"middle\">${displayText}</text>\r\n </svg>\r\n `;\r\n }\r\n\r\n /**\r\n * 初始化所有顶点的标签\r\n */\r\n initializeLabels(positions: Cesium.Cartesian3[]): void {\r\n this.labels = [];\r\n for (let i = 0; i < positions.length; i++) {\r\n this.labels[i] = this.createLabel(positions[i], i, 'normal');\r\n }\r\n }\r\n\r\n /**\r\n * 更新指定索引的标签\r\n */\r\n updateLabel(index: number, position: Cesium.Cartesian3, state: VertexLabelState = 'normal'): void {\r\n try {\r\n // 跳过隐藏爬升点\r\n if (this.hiddenClimbIndex !== undefined && index === this.hiddenClimbIndex) {\r\n return;\r\n }\r\n\r\n // 移除旧标签\r\n if (this.labels[index]) {\r\n (this.layer.entities as any).remove(this.labels[index]);\r\n }\r\n\r\n // 创建新标签\r\n this.labels[index] = this.createLabel(position, index, state);\r\n } catch (e) {\r\n console.error('Failed to update vertex label:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 仅更新标签位置(不重建标签,用于拖动时的流畅更新)\r\n * @param index 顶点索引\r\n * @param position 新位置\r\n */\r\n updateLabelPosition(index: number, position: Cesium.Cartesian3): void {\r\n try {\r\n // 跳过隐藏爬升点\r\n if (this.hiddenClimbIndex !== undefined && index === this.hiddenClimbIndex) {\r\n return;\r\n }\r\n\r\n const label = this.labels[index];\r\n if (label && label.position) {\r\n (label.position as any).setValue(position);\r\n }\r\n } catch (e) {\r\n console.error('Failed to update vertex label position:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 插入新标签(在指定索引处)\r\n */\r\n insertLabel(insertAt: number, position: Cesium.Cartesian3, state: VertexLabelState = 'normal'): void {\r\n try {\r\n // 插入新标签\r\n const newLabel = this.createLabel(position, insertAt, state);\r\n this.labels.splice(insertAt, 0, newLabel);\r\n\r\n // 重新创建所有标签以更新序号\r\n this.recreateAllLabels();\r\n } catch (e) {\r\n console.error('Failed to insert vertex label:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 删除指定索引的标签\r\n * 注意:此方法只删除标签实体和更新内部数组,不会重新创建标签。\r\n * 调用方需要在删除数据后手动调用 recreateAllLabels(positions, editedIndices, selectedIndex) 来重建所有标签。\r\n */\r\n removeLabel(index: number): void {\r\n try {\r\n if (this.labels[index]) {\r\n (this.layer.entities as any).remove(this.labels[index]);\r\n this.labels.splice(index, 1);\r\n }\r\n } catch (e) {\r\n console.error('Failed to remove vertex label:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 重新创建所有标签(用于序号更新)\r\n */\r\n recreateAllLabels(positions?: Cesium.Cartesian3[], editedIndices?: Set<number>, selectedIndex?: number): void {\r\n try {\r\n // 清除所有现有标签\r\n for (let i = 0; i < this.labels.length; i++) {\r\n if (this.labels[i] && i !== this.hiddenClimbIndex) {\r\n (this.layer.entities as any).remove(this.labels[i]);\r\n }\r\n }\r\n\r\n // 重新创建标签\r\n if (positions) {\r\n for (let i = 0; i < positions.length; i++) {\r\n const isEdited = editedIndices?.has(i) ?? false;\r\n const isSelected = i === selectedIndex;\r\n const state: VertexLabelState = isSelected ? 'selected' : isEdited ? 'edited' : 'normal';\r\n this.labels[i] = this.createLabel(positions[i], i, state);\r\n }\r\n }\r\n } catch (e) {\r\n console.error('Failed to recreate all labels:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 获取指定索引的标签\r\n */\r\n getLabel(index: number): Cesium.Entity | undefined {\r\n return this.labels[index];\r\n }\r\n\r\n /**\r\n * 销毁所有标签\r\n */\r\n destroy(): void {\r\n try {\r\n this.labels.forEach((label) => {\r\n if (label) {\r\n (this.layer.entities as any).remove(label);\r\n }\r\n });\r\n this.labels = [];\r\n } catch (e) {\r\n console.error('Failed to destroy vertex labels:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 更新隐藏爬升点索引\r\n */\r\n setHiddenClimbIndex(index: number | undefined): void {\r\n this.hiddenClimbIndex = index;\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\n/**\r\n * 路径编辑工具函数集合\r\n */\r\n\r\n/**\r\n * 计算从原点到目标点的航向角(度数)\r\n * @param CesiumNS Cesium 命名空间\r\n * @param origin 原点位置(Cartesian3)\r\n * @param target 目标点位置(Cartesian3)\r\n * @returns 航向角(度数,0-360)\r\n */\r\nexport function computeHeadingDegFromTo(\r\n CesiumNS: typeof Cesium,\r\n origin: Cesium.Cartesian3,\r\n target: Cesium.Cartesian3,\r\n): number {\r\n try {\r\n const C = CesiumNS as any;\r\n const dir = C.Cartesian3.normalize(\r\n C.Cartesian3.subtract(target, origin, new C.Cartesian3()),\r\n new C.Cartesian3(),\r\n );\r\n const enu = C.Transforms.eastNorthUpToFixedFrame(origin);\r\n const inv = C.Matrix4.inverse(enu, new C.Matrix4());\r\n const local = C.Matrix4.multiplyByPointAsVector(inv, dir, new C.Cartesian3());\r\n const heading = Math.atan2(local.x, local.y); // east, north\r\n const deg = C.Math.toDegrees(heading);\r\n return (deg + 360) % 360;\r\n } catch {\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * 从屏幕位置拾取顶点索引\r\n * @param viewer Cesium Viewer 实例\r\n * @param screenPosition 屏幕位置\r\n * @param hiddenClimbIndex 隐藏爬升点索引(需要跳过)\r\n * @returns 顶点索引,如果没有拾取到或拾取到隐藏点则返回 undefined\r\n */\r\nexport function pickVertexIndex(\r\n viewer: Cesium.Viewer,\r\n screenPosition: { x: number; y: number },\r\n hiddenClimbIndex?: number,\r\n): number | undefined {\r\n try {\r\n const picked = (viewer.scene as any).pick?.(screenPosition);\r\n const eid = picked?.id as any;\r\n const idx = eid?.properties?._vertexIndex?.getValue?.() ?? eid?.properties?._vertexIndex;\r\n \r\n // 保护隐藏爬升点\r\n if (typeof idx === 'number' && hiddenClimbIndex === idx) {\r\n return undefined;\r\n }\r\n \r\n return typeof idx === 'number' ? idx : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n\r\n/**\r\n * 确保实体所在的图层存在,如果不存在则创建新图层\r\n * @param viewer Cesium Viewer 实例\r\n * @param entity 实体对象\r\n * @param CesiumNS Cesium 命名空间\r\n * @returns 实体所在的数据源(图层)\r\n */\r\nexport function ensureLayerForEntity(\r\n viewer: Cesium.Viewer,\r\n entity: Cesium.Entity,\r\n CesiumNS: typeof Cesium,\r\n): Cesium.CustomDataSource {\r\n const ds: any = (entity as any)?.entityCollection?._owner;\r\n if (ds) return ds;\r\n \r\n const C: any = CesiumNS as any;\r\n const fallback = new C.CustomDataSource('Paths');\r\n viewer.dataSources.add(fallback);\r\n \r\n try {\r\n (viewer.entities as any).remove(entity);\r\n } catch {}\r\n \r\n try {\r\n fallback.entities.add(entity);\r\n } catch {}\r\n \r\n return fallback;\r\n}\r\n\r\n/**\r\n * 计算航线距离(不包含起始点和隐藏转折点)\r\n * \r\n * 计算从起始点(或隐藏转折点后的第一个点)到指定索引点的累计距离。\r\n * 距离计算会跳过起始点(index 0)和隐藏转折点(index 1,如果存在)。\r\n * \r\n * @param CesiumNS Cesium 命名空间\r\n * @param positions 所有顶点位置数组\r\n * @param targetIndex 目标顶点索引(计算到此点的累计距离)\r\n * @param hiddenClimbIndex 隐藏转折点索引(通常为 1,如果不存在则为 undefined)\r\n * @returns 累计距离(米),如果无法计算则返回 0\r\n * \r\n * @example\r\n * ```typescript\r\n * // 计算到第 3 个点的距离(假设有隐藏转折点在 index 1)\r\n * const distance = calculatePathDistance(Cesium, positions, 3, 1);\r\n * // 这会计算从 index 2 到 index 3 的距离(跳过 index 0 和 1)\r\n * ```\r\n */\r\nexport function calculatePathDistance(\r\n CesiumNS: typeof Cesium,\r\n positions: Cesium.Cartesian3[],\r\n targetIndex: number,\r\n hiddenClimbIndex?: number,\r\n): number {\r\n if (!positions || positions.length < 2) return 0;\r\n if (targetIndex < 0 || targetIndex >= positions.length) return 0;\r\n \r\n const C = CesiumNS as any;\r\n let totalDistance = 0;\r\n \r\n // 确定起始索引:跳过起始点(0)和隐藏转折点(1,如果存在)\r\n const startIndex = hiddenClimbIndex === 1 ? 2 : 1;\r\n \r\n // 如果目标索引小于等于起始索引,返回 0\r\n if (targetIndex <= startIndex) return 0;\r\n \r\n // 从起始索引开始,累计到目标索引的距离\r\n for (let i = startIndex; i <= targetIndex; i++) {\r\n try {\r\n const prevPos = positions[i - 1];\r\n const currPos = positions[i];\r\n if (prevPos && currPos) {\r\n const segmentDistance = C.Cartesian3.distance(prevPos, currPos) || 0;\r\n totalDistance += segmentDistance;\r\n }\r\n } catch {\r\n // 忽略计算错误,继续下一个段\r\n }\r\n }\r\n \r\n return totalDistance;\r\n}","import type * as Cesium from 'cesium';\r\nimport { VertexLabelManager } from './VertexLabelManager';\r\nimport { HeightMarker } from '../HeightMarker';\r\nimport { computeHeadingDegFromTo } from './PathEditingUtils';\r\nimport type { AirplaneCursor } from '../AirplaneCursor';\r\n\r\n\r\n/**\r\n * 顶点插入配置选项\r\n */\r\nexport interface VertexInsertionOptions {\r\n /** Cesium 命名空间 */\r\n CesiumNS: typeof Cesium;\r\n /** 图层(数据源) */\r\n layer: Cesium.CustomDataSource;\r\n /** 实体 ID */\r\n ownerId: string;\r\n /** 隐藏爬升点索引 */\r\n hiddenClimbIndex?: number;\r\n}\r\n\r\n/**\r\n * 顶点姿态信息\r\n */\r\nexport interface VertexPose {\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n}\r\n\r\n/**\r\n * 顶点插入处理器\r\n * 负责处理路径编辑中的顶点插入逻辑\r\n */\r\nexport class VertexInsertionHandler {\r\n private CesiumNS: typeof Cesium;\r\n private layer: Cesium.CustomDataSource;\r\n private ownerId: string;\r\n private hiddenClimbIndex?: number;\r\n\r\n constructor(options: VertexInsertionOptions) {\r\n this.CesiumNS = options.CesiumNS;\r\n this.layer = options.layer;\r\n this.ownerId = options.ownerId;\r\n this.hiddenClimbIndex = options.hiddenClimbIndex;\r\n }\r\n\r\n /**\r\n * 插入新顶点\r\n * @param insertAt 插入位置索引\r\n * @param position 顶点位置\r\n * @param positions 所有顶点位置数组(引用)\r\n * @param handles 所有顶点句柄数组(引用)\r\n * @param headings 所有航向角数组(引用)\r\n * @param pitches 所有俯仰角数组(引用)\r\n * @param rolls 所有横滚角数组(引用)\r\n * @param fovs 所有视场角数组(引用)\r\n * @param editedIndices 已编辑顶点索引集合(引用)\r\n * @param vertexLabelManager 顶点标签管理器\r\n * @param heightMarkers 高度标记数组(引用)\r\n * @param airplaneCursor 飞机游标(可选)\r\n * @param poseOrient 顶点姿态(可选)\r\n * @param useGlobalHeightFlags 🆕 是否使用全局高度标志数组(引用,可选)\r\n * @param altitudeModeOptions 🆕 高度模式选项(可选)\r\n * @returns 实际插入的索引\r\n */\r\n insertVertex(\r\n insertAt: number,\r\n position: Cesium.Cartesian3,\r\n positions: Cesium.Cartesian3[],\r\n handles: Cesium.Entity[],\r\n headings: number[],\r\n pitches: number[],\r\n rolls: number[],\r\n fovs: number[],\r\n editedIndices: Set<number>,\r\n vertexLabelManager: VertexLabelManager,\r\n heightMarkers: Array<HeightMarker | undefined>,\r\n airplaneCursor?: AirplaneCursor,\r\n poseOrient?: VertexPose,\r\n useGlobalHeightFlags?: boolean[],\r\n ): number {\r\n const C = this.CesiumNS as any;\r\n\r\n // 防止插入到隐藏爬升点之前\r\n if (this.hiddenClimbIndex === 1 && insertAt <= 1) {\r\n insertAt = 2;\r\n }\r\n\r\n // 🆕 直接使用传入的 position(高度计算由调用方负责)\r\n // - 快速编辑模式:PathEditingEventHandler.calculatePositionByAltitudeMode() 已计算好高度\r\n // - 自由编辑模式:使用飞机游标当前位置的高度(用户已调整)\r\n // 插入位置\r\n positions.splice(insertAt, 0, position);\r\n\r\n // 创建顶点句柄\r\n const handle = this.layer.entities.add({\r\n position: position,\r\n point: {\r\n pixelSize: 10,\r\n color: C.Color.YELLOW,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n },\r\n properties: {\r\n _type: 'path-vertex',\r\n _ownerId: this.ownerId,\r\n _vertexIndex: insertAt,\r\n },\r\n } as any);\r\n handles.splice(insertAt, 0, handle);\r\n\r\n // 重新索引所有句柄\r\n this.reindexHandles(handles);\r\n\r\n // 更新已编辑索引集合\r\n this.updateEditedIndices(editedIndices, insertAt);\r\n\r\n // 使用 VertexLabelManager 插入新标签并重新创建所有标签以更新序号\r\n vertexLabelManager.insertLabel(insertAt, position, 'selected');\r\n vertexLabelManager.recreateAllLabels(positions, editedIndices, insertAt);\r\n\r\n // 初始化顶点姿态\r\n const pose = this.initializeVertexPose(\r\n insertAt,\r\n positions,\r\n airplaneCursor,\r\n poseOrient,\r\n );\r\n\r\n headings.splice(insertAt, 0, pose.heading);\r\n pitches.splice(insertAt, 0, pose.pitch);\r\n rolls.splice(insertAt, 0, pose.roll);\r\n fovs.splice(insertAt, 0, 50);\r\n\r\n // 🆕 新插入的航点使用全局高度(useGlobalHeight = true)\r\n if (useGlobalHeightFlags) {\r\n // 先移动后续索引的标志\r\n for (let i = useGlobalHeightFlags.length - 1; i >= insertAt; i--) {\r\n useGlobalHeightFlags[i + 1] = useGlobalHeightFlags[i];\r\n }\r\n // 新航点设置为 true\r\n useGlobalHeightFlags[insertAt] = true;\r\n }\r\n\r\n // 返回实际插入的索引\r\n return insertAt;\r\n }\r\n\r\n /**\r\n * 重新索引所有顶点句柄\r\n */\r\n private reindexHandles(handles: Cesium.Entity[]): void {\r\n handles.forEach((handle, index) => {\r\n try {\r\n if (!handle) return;\r\n const props: any = (handle as any).properties || {};\r\n const type = props?._type?.getValue?.() ?? props?._type ?? 'path-vertex';\r\n const ownerId = props?._ownerId?.getValue?.() ?? props?._ownerId ?? this.ownerId;\r\n (handle as any).properties = {\r\n _type: type,\r\n _ownerId: ownerId,\r\n _vertexIndex: index,\r\n } as any;\r\n } catch {}\r\n });\r\n }\r\n\r\n /**\r\n * 更新已编辑顶点索引集合\r\n */\r\n private updateEditedIndices(editedIndices: Set<number>, insertAt: number): void {\r\n const shifted = new Set<number>();\r\n editedIndices.forEach((i) => shifted.add(i >= insertAt ? i + 1 : i));\r\n shifted.add(insertAt);\r\n editedIndices.clear();\r\n shifted.forEach((i) => editedIndices.add(i));\r\n }\r\n\r\n /**\r\n * 初始化顶点姿态\r\n */\r\n private initializeVertexPose(\r\n insertAt: number,\r\n positions: Cesium.Cartesian3[],\r\n airplaneCursor?: AirplaneCursor,\r\n poseOrient?: VertexPose,\r\n ): VertexPose {\r\n let heading = 0;\r\n let pitch = -10;\r\n let roll = 0;\r\n\r\n if (poseOrient) {\r\n // 优先使用提供的姿态\r\n heading = poseOrient.heading;\r\n pitch = poseOrient.pitch;\r\n roll = poseOrient.roll;\r\n } else if (airplaneCursor) {\r\n // 使用飞机游标当前姿态\r\n try {\r\n const currentPose = airplaneCursor.getPose();\r\n heading = currentPose.heading;\r\n pitch = currentPose.pitch;\r\n roll = currentPose.roll;\r\n } catch {}\r\n\r\n // 如果航向为 0 且有下一个点,计算朝向下一个点\r\n if (heading === 0 && insertAt < positions.length - 1) {\r\n heading = computeHeadingDegFromTo(\r\n this.CesiumNS,\r\n positions[insertAt],\r\n positions[insertAt + 1],\r\n );\r\n }\r\n } else if (insertAt < positions.length - 1) {\r\n // 回退:计算朝向下一个点\r\n heading = computeHeadingDegFromTo(\r\n this.CesiumNS,\r\n positions[insertAt],\r\n positions[insertAt + 1],\r\n );\r\n }\r\n\r\n return { heading, pitch, roll };\r\n }\r\n\r\n /**\r\n * 调整插入索引(确保不插入到隐藏爬升点之前)\r\n */\r\n adjustInsertIndex(insertAt: number): number {\r\n if (this.hiddenClimbIndex === 1 && insertAt <= 1) {\r\n return 2;\r\n }\r\n return insertAt;\r\n }\r\n}\r\n","/**\r\n * 上下文菜单配置选项\r\n */\r\nexport interface ContextMenuOptions {\r\n /** 菜单背景颜色 */\r\n backgroundColor?: string;\r\n /** 文字颜色 */\r\n textColor?: string;\r\n /** 内边距 */\r\n padding?: string;\r\n /** 边框 */\r\n border?: string;\r\n /** 字体大小 */\r\n fontSize?: string;\r\n /** 圆角 */\r\n borderRadius?: string;\r\n /** 背景模糊 */\r\n backdropFilter?: string;\r\n /** 阴影 */\r\n boxShadow?: string;\r\n /** z-index */\r\n zIndex?: string;\r\n /** 菜单项悬停背景色 */\r\n itemHoverBackground?: string;\r\n /** 菜单项内边距 */\r\n itemPadding?: string;\r\n}\r\n\r\n/**\r\n * 菜单项配置\r\n */\r\nexport interface MenuItem {\r\n /** 菜单项文本 */\r\n label: string;\r\n /** 点击回调 */\r\n action: () => void;\r\n /** 是否禁用 */\r\n disabled?: boolean;\r\n}\r\n\r\n/**\r\n * 屏幕位置\r\n */\r\nexport interface ScreenPosition {\r\n x: number;\r\n y: number;\r\n}\r\n\r\n/**\r\n * 右键上下文菜单管理器\r\n * 负责创建、显示和销毁路径编辑中的右键菜单\r\n */\r\nexport class ContextMenuManager {\r\n private menuElement?: HTMLDivElement;\r\n private options: Required<ContextMenuOptions>;\r\n private clickAwayListener?: (event: MouseEvent) => void;\r\n\r\n constructor(options?: ContextMenuOptions) {\r\n this.options = {\r\n backgroundColor: options?.backgroundColor ?? 'rgba(30,30,30,0.9)',\r\n textColor: options?.textColor ?? '#fff',\r\n padding: options?.padding ?? '6px 8px',\r\n border: options?.border ?? '1px solid #444',\r\n fontSize: options?.fontSize ?? '12px',\r\n borderRadius: options?.borderRadius ?? '4px',\r\n backdropFilter: options?.backdropFilter ?? 'blur(4px)',\r\n boxShadow: options?.boxShadow ?? '0 2px 6px rgba(0,0,0,0.4)',\r\n zIndex: options?.zIndex ?? '9999',\r\n itemHoverBackground: options?.itemHoverBackground ?? 'rgba(255,255,255,0.12)',\r\n itemPadding: options?.itemPadding ?? '4px 6px',\r\n };\r\n }\r\n\r\n /**\r\n * 显示上下文菜单\r\n * @param position 屏幕位置\r\n * @param items 菜单项列表\r\n */\r\n show(position: ScreenPosition, items: MenuItem[]): void {\r\n // 移除旧菜单\r\n this.hide();\r\n\r\n // 创建菜单元素\r\n this.menuElement = document.createElement('div');\r\n this.applyMenuStyles(position);\r\n\r\n // 添加菜单项\r\n items.forEach((item) => {\r\n this.addMenuItem(item);\r\n });\r\n\r\n // 添加到 DOM\r\n document.body.appendChild(this.menuElement);\r\n\r\n // 设置点击外部关闭\r\n this.setupClickAwayListener();\r\n }\r\n\r\n /**\r\n * 隐藏/移除菜单\r\n */\r\n hide(): void {\r\n if (this.menuElement?.parentElement) {\r\n this.menuElement.parentElement.removeChild(this.menuElement);\r\n }\r\n this.menuElement = undefined;\r\n\r\n // 移除点击外部监听器\r\n if (this.clickAwayListener) {\r\n window.removeEventListener('mousedown', this.clickAwayListener);\r\n this.clickAwayListener = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 检查菜单是否可见\r\n */\r\n isVisible(): boolean {\r\n return this.menuElement !== undefined;\r\n }\r\n\r\n /**\r\n * 应用菜单样式\r\n */\r\n private applyMenuStyles(position: ScreenPosition): void {\r\n if (!this.menuElement) return;\r\n\r\n const styles = this.menuElement.style;\r\n styles.position = 'absolute';\r\n styles.zIndex = this.options.zIndex;\r\n styles.background = this.options.backgroundColor;\r\n styles.color = this.options.textColor;\r\n styles.padding = this.options.padding;\r\n styles.border = this.options.border;\r\n styles.fontSize = this.options.fontSize;\r\n styles.borderRadius = this.options.borderRadius;\r\n styles.backdropFilter = this.options.backdropFilter;\r\n styles.userSelect = 'none';\r\n styles.cursor = 'default';\r\n styles.boxShadow = this.options.boxShadow;\r\n styles.left = `${position.x}px`;\r\n styles.top = `${position.y}px`;\r\n }\r\n\r\n /**\r\n * 添加菜单项\r\n */\r\n private addMenuItem(item: MenuItem): void {\r\n if (!this.menuElement) return;\r\n\r\n const itemElement = document.createElement('div');\r\n itemElement.textContent = item.label;\r\n itemElement.style.padding = this.options.itemPadding;\r\n itemElement.style.whiteSpace = 'nowrap';\r\n\r\n // 禁用状态\r\n if (item.disabled) {\r\n itemElement.style.opacity = '0.5';\r\n itemElement.style.cursor = 'not-allowed';\r\n } else {\r\n // 悬停效果\r\n itemElement.onmouseenter = () => {\r\n itemElement.style.background = this.options.itemHoverBackground;\r\n };\r\n itemElement.onmouseleave = () => {\r\n itemElement.style.background = 'transparent';\r\n };\r\n\r\n // 点击事件\r\n itemElement.onclick = () => {\r\n item.action();\r\n this.hide();\r\n };\r\n }\r\n\r\n this.menuElement.appendChild(itemElement);\r\n }\r\n\r\n /**\r\n * 设置点击外部关闭监听器\r\n */\r\n private setupClickAwayListener(): void {\r\n this.clickAwayListener = (event: MouseEvent) => {\r\n if (!this.menuElement) return;\r\n if (!this.menuElement.contains(event.target as Node)) {\r\n this.hide();\r\n }\r\n };\r\n\r\n // 使用 setTimeout 避免立即触发\r\n setTimeout(() => {\r\n if (this.clickAwayListener) {\r\n window.addEventListener('mousedown', this.clickAwayListener, { once: true });\r\n }\r\n }, 0);\r\n }\r\n\r\n /**\r\n * 销毁菜单管理器\r\n */\r\n destroy(): void {\r\n this.hide();\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\n/**\r\n * 拖动状态\r\n */\r\ninterface DragState {\r\n /** 是否正在拖动 */\r\n isDragging: boolean;\r\n /** 被拖动的顶点索引 */\r\n draggedVertexIndex: number;\r\n /** 是否按下 Alt 键(垂直拖动模式) */\r\n isAltPressed: boolean;\r\n /** 拖动开始时的顶点位置 */\r\n startPosition: Cesium.Cartesian3;\r\n /** 拖动开始时的屏幕坐标 */\r\n startScreenPosition: { x: number; y: number };\r\n /** 拖动开始时的高度 */\r\n startHeight: number;\r\n /** 拖动开始时的经纬度 */\r\n startLonLat: { lon: number; lat: number };\r\n}\r\n\r\n/**\r\n * 顶点拖动处理器配置选项\r\n */\r\nexport interface VertexDragHandlerOptions {\r\n /** Cesium 命名空间 */\r\n CesiumNS: typeof Cesium;\r\n /** Cesium Viewer 实例 */\r\n viewer: Cesium.Viewer;\r\n /** 隐藏爬升点索引 */\r\n hiddenClimbIndex?: number;\r\n}\r\n\r\n/**\r\n * 顶点拖动回调函数\r\n */\r\nexport interface VertexDragCallbacks {\r\n /** 拖动开始回调 */\r\n onDragStart?: (index: number) => void;\r\n /** 拖动中回调(实时更新位置) */\r\n onDragMove?: (index: number, newPosition: Cesium.Cartesian3) => void;\r\n /** 拖动结束回调 */\r\n onDragEnd?: (index: number, finalPosition: Cesium.Cartesian3) => void;\r\n /** 获取所有位置 */\r\n getPositions?: () => Cesium.Cartesian3[];\r\n}\r\n\r\n/**\r\n * 顶点拖动处理器\r\n * 负责处理顶点标签的拖动操作\r\n * - 普通拖动(左键):水平移动顶点(保持高度不变)\r\n * - Alt + 拖动(Alt + 左键):垂直移动顶点(保持水平位置不变)\r\n */\r\nexport class VertexDragHandler {\r\n private CesiumNS: typeof Cesium;\r\n private viewer: Cesium.Viewer;\r\n private hiddenClimbIndex?: number;\r\n private callbacks: VertexDragCallbacks;\r\n private dragState: DragState | null = null;\r\n private canvas: HTMLCanvasElement;\r\n private keydownHandler?: (e: KeyboardEvent) => void;\r\n private keyupHandler?: (e: KeyboardEvent) => void;\r\n\r\n constructor(options: VertexDragHandlerOptions, callbacks: VertexDragCallbacks) {\r\n this.CesiumNS = options.CesiumNS;\r\n this.viewer = options.viewer;\r\n this.hiddenClimbIndex = options.hiddenClimbIndex;\r\n this.callbacks = callbacks;\r\n this.canvas = (this.viewer.scene as any).canvas;\r\n\r\n this.setupKeyboardListeners();\r\n }\r\n\r\n /**\r\n * 设置键盘监听器(Alt 键)\r\n */\r\n private setupKeyboardListeners(): void {\r\n this.keydownHandler = (e: KeyboardEvent) => {\r\n if (e.key === 'Alt' && this.dragState) {\r\n this.dragState.isAltPressed = true;\r\n this.updateCursor();\r\n }\r\n };\r\n\r\n this.keyupHandler = (e: KeyboardEvent) => {\r\n if (e.key === 'Alt' && this.dragState) {\r\n this.dragState.isAltPressed = false;\r\n this.updateCursor();\r\n }\r\n // ESC 键取消拖动\r\n if (e.key === 'Escape' && this.dragState) {\r\n this.cancelDrag();\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', this.keydownHandler);\r\n window.addEventListener('keyup', this.keyupHandler);\r\n }\r\n\r\n /**\r\n * 更新光标样式\r\n */\r\n private updateCursor(): void {\r\n if (!this.dragState) {\r\n this.canvas.style.cursor = '';\r\n return;\r\n }\r\n\r\n if (this.dragState.isDragging) {\r\n this.canvas.style.cursor = this.dragState.isAltPressed ? 'ns-resize' : 'grabbing';\r\n } else {\r\n // 准备拖动状态,显示 grab 光标\r\n this.canvas.style.cursor = 'grab';\r\n }\r\n }\r\n\r\n /**\r\n * 禁用相机控制器(防止与地图拖动冲突)\r\n */\r\n private disableCameraController(): void {\r\n try {\r\n const controller = (this.viewer.scene as any).screenSpaceCameraController;\r\n if (controller) {\r\n controller.enableInputs = false;\r\n }\r\n } catch (error) {\r\n console.warn('Failed to disable camera controller:', error);\r\n }\r\n }\r\n\r\n /**\r\n * 恢复相机控制器\r\n */\r\n private enableCameraController(): void {\r\n try {\r\n const controller = (this.viewer.scene as any).screenSpaceCameraController;\r\n if (controller) {\r\n controller.enableInputs = true;\r\n }\r\n } catch (error) {\r\n console.warn('Failed to enable camera controller:', error);\r\n }\r\n }\r\n\r\n /**\r\n * 检查顶点是否可以拖动\r\n */\r\n private canDragVertex(index: number): boolean {\r\n // 不允许拖动起点\r\n if (index === 0) {\r\n return false;\r\n }\r\n\r\n // 不允许拖动隐藏爬升点\r\n if (this.hiddenClimbIndex !== undefined && index === this.hiddenClimbIndex) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * 开始拖动\r\n * @param vertexIndex 顶点索引\r\n * @param screenPosition 屏幕坐标\r\n * @returns 是否成功开始拖动\r\n */\r\n startDrag(vertexIndex: number, screenPosition: { x: number; y: number }): boolean {\r\n // 检查是否可以拖动\r\n if (!this.canDragVertex(vertexIndex)) {\r\n return false;\r\n }\r\n\r\n const positions = this.callbacks.getPositions?.() || [];\r\n const position = positions[vertexIndex];\r\n if (!position) {\r\n return false;\r\n }\r\n\r\n try {\r\n const C = this.CesiumNS as any;\r\n const cartographic = C.Cartographic.fromCartesian(position);\r\n \r\n // 创建拖动状态并立即开始拖动\r\n this.dragState = {\r\n isDragging: true,\r\n draggedVertexIndex: vertexIndex,\r\n isAltPressed: false,\r\n startPosition: position.clone(),\r\n startScreenPosition: { x: screenPosition.x, y: screenPosition.y },\r\n startHeight: cartographic.height,\r\n startLonLat: {\r\n lon: C.Math.toDegrees(cartographic.longitude),\r\n lat: C.Math.toDegrees(cartographic.latitude),\r\n },\r\n };\r\n\r\n // 禁用相机控制器\r\n this.disableCameraController();\r\n\r\n this.updateCursor();\r\n\r\n if (this.callbacks.onDragStart) {\r\n this.callbacks.onDragStart(vertexIndex);\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n console.error('Error starting vertex drag:', error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * 处理拖动移动\r\n * @param screenPosition 当前屏幕坐标\r\n */\r\n handleMove(screenPosition: { x: number; y: number }): void {\r\n if (!this.dragState || !this.dragState.isDragging) {\r\n return;\r\n }\r\n\r\n try {\r\n const newPosition = this.dragState.isAltPressed\r\n ? this.computeVerticalMove(screenPosition)\r\n : this.computeHorizontalMove(screenPosition);\r\n\r\n if (newPosition && this.callbacks.onDragMove) {\r\n this.callbacks.onDragMove(this.dragState.draggedVertexIndex, newPosition);\r\n }\r\n } catch (error) {\r\n console.error('Error handling vertex drag move:', error);\r\n }\r\n }\r\n\r\n /**\r\n * 计算水平移动(保持高度不变)\r\n */\r\n private computeHorizontalMove(screenPosition: { x: number; y: number }): Cesium.Cartesian3 | null {\r\n if (!this.dragState) return null;\r\n\r\n try {\r\n const C = this.CesiumNS as any;\r\n const scene = this.viewer.scene as any;\r\n const camera = this.viewer.camera as any;\r\n\r\n // 获取射线\r\n const ray = camera.getPickRay(screenPosition);\r\n if (!ray) return null;\r\n\r\n // 创建固定高度的平面(以地球中心为原点,法向量为起始位置的方向)\r\n const height = this.dragState.startHeight;\r\n \r\n // 使用地球表面射线交点方法\r\n const globe = scene.globe;\r\n if (!globe) return null;\r\n\r\n // 先获取射线与地球表面的交点\r\n const surfacePosition = globe.pick(ray, scene);\r\n if (!surfacePosition) return null;\r\n\r\n // 转换为经纬高\r\n const surfaceCartographic = C.Cartographic.fromCartesian(surfacePosition);\r\n \r\n // 保持原高度,使用新的经纬度\r\n const newPosition = C.Cartesian3.fromRadians(\r\n surfaceCartographic.longitude,\r\n surfaceCartographic.latitude,\r\n height\r\n );\r\n\r\n return newPosition;\r\n } catch (error) {\r\n console.error('Error computing horizontal move:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 计算垂直移动(保持经纬度不变)\r\n */\r\n private computeVerticalMove(screenPosition: { x: number; y: number }): Cesium.Cartesian3 | null {\r\n if (!this.dragState) return null;\r\n\r\n try {\r\n const C = this.CesiumNS as any;\r\n\r\n // 计算屏幕垂直方向的移动距离\r\n const deltaY = screenPosition.y - this.dragState.startScreenPosition.y;\r\n\r\n // 转换为高度变化(负数因为屏幕 Y 轴向下,高度向上)\r\n // 比例因子:根据相机距离调整灵敏度\r\n const cameraHeight = (this.viewer.camera as any).positionCartographic.height;\r\n const scaleFactor = Math.max(cameraHeight / 1000, 0.5); // 动态调整灵敏度\r\n const heightDelta = -deltaY * scaleFactor;\r\n\r\n // 计算新高度(不再限制最小高度,允许用户自由调整)\r\n const newHeight = this.dragState.startHeight + heightDelta;\r\n\r\n // 使用原经纬度和新高度创建新位置\r\n const newPosition = C.Cartesian3.fromDegrees(\r\n this.dragState.startLonLat.lon,\r\n this.dragState.startLonLat.lat,\r\n newHeight\r\n );\r\n\r\n return newPosition;\r\n } catch (error) {\r\n console.error('Error computing vertical move:', error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 结束拖动\r\n */\r\n endDrag(): void {\r\n if (!this.dragState) {\r\n return;\r\n }\r\n\r\n try {\r\n const positions = this.callbacks.getPositions?.() || [];\r\n const finalPosition = positions[this.dragState.draggedVertexIndex];\r\n\r\n if (finalPosition && this.callbacks.onDragEnd) {\r\n this.callbacks.onDragEnd(this.dragState.draggedVertexIndex, finalPosition);\r\n }\r\n } catch (error) {\r\n console.error('Error ending vertex drag:', error);\r\n } finally {\r\n // 恢复相机控制器\r\n this.enableCameraController();\r\n \r\n this.dragState = null;\r\n this.updateCursor();\r\n }\r\n }\r\n\r\n /**\r\n * 取消拖动(恢复原位置)\r\n */\r\n cancelDrag(): void {\r\n if (!this.dragState) {\r\n return;\r\n }\r\n\r\n try {\r\n if (this.callbacks.onDragMove && this.dragState.startPosition) {\r\n this.callbacks.onDragMove(\r\n this.dragState.draggedVertexIndex,\r\n this.dragState.startPosition\r\n );\r\n }\r\n } catch (error) {\r\n console.error('Error canceling vertex drag:', error);\r\n } finally {\r\n // 恢复相机控制器\r\n this.enableCameraController();\r\n \r\n this.dragState = null;\r\n this.updateCursor();\r\n }\r\n }\r\n\r\n /**\r\n * 检查是否正在拖动\r\n */\r\n isDragging(): boolean {\r\n return this.dragState !== null && this.dragState.isDragging;\r\n }\r\n\r\n /**\r\n * 获取当前拖动的顶点索引\r\n */\r\n getDraggedVertexIndex(): number | undefined {\r\n return this.dragState?.draggedVertexIndex;\r\n }\r\n\r\n /**\r\n * 销毁处理器\r\n */\r\n destroy(): void {\r\n // 如果正在拖动,恢复相机控制器\r\n if (this.dragState?.isDragging) {\r\n this.enableCameraController();\r\n }\r\n\r\n // 移除键盘监听器\r\n if (this.keydownHandler) {\r\n window.removeEventListener('keydown', this.keydownHandler);\r\n }\r\n if (this.keyupHandler) {\r\n window.removeEventListener('keyup', this.keyupHandler);\r\n }\r\n\r\n // 恢复光标\r\n this.canvas.style.cursor = '';\r\n\r\n // 清除拖动状态\r\n this.dragState = null;\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\n/**\r\n * 地形高度查询工具\r\n * 提供异步批量查询和同步回退两种方式\r\n */\r\n\r\n/**\r\n * 异步批量查询地形高度\r\n * 使用 sampleTerrainMostDetailed 进行精确的地形高度查询\r\n * @param CesiumNS Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param positions 需要查询的位置数组(Cartesian3)\r\n * @returns 每个位置对应的地形高度数组\r\n */\r\nexport async function queryTerrainHeights(\r\n CesiumNS: typeof Cesium,\r\n viewer: Cesium.Viewer,\r\n positions: Cesium.Cartesian3[]\r\n): Promise<number[]> {\r\n const C = CesiumNS as any;\r\n \r\n if (!positions || positions.length === 0) {\r\n return [];\r\n }\r\n\r\n // 转换为 Cartographic 数组\r\n const cartographics: Cesium.Cartographic[] = positions.map((pos) => {\r\n try {\r\n return C.Cartographic.fromCartesian(pos);\r\n } catch {\r\n return new C.Cartographic(0, 0, 0);\r\n }\r\n });\r\n\r\n // 获取地形提供者\r\n const terrainProvider = viewer.terrainProvider;\r\n \r\n // 检查是否有有效的地形提供者\r\n if (!terrainProvider || !C.sampleTerrainMostDetailed) {\r\n console.warn('[TerrainHeightQuery] 无可用地形提供者,使用同步回退方案');\r\n return positions.map((pos) => queryTerrainHeightSync(CesiumNS, viewer, pos));\r\n }\r\n\r\n try {\r\n // 使用 sampleTerrainMostDetailed 异步查询\r\n const sampledPositions = await C.sampleTerrainMostDetailed(\r\n terrainProvider,\r\n cartographics\r\n );\r\n\r\n // 提取高度值\r\n return sampledPositions.map((carto: Cesium.Cartographic) => {\r\n const height = carto?.height;\r\n return typeof height === 'number' && !isNaN(height) ? height : 0;\r\n });\r\n } catch (error) {\r\n console.warn('[TerrainHeightQuery] 异步查询失败,使用同步回退:', error);\r\n return positions.map((pos) => queryTerrainHeightSync(CesiumNS, viewer, pos));\r\n }\r\n}\r\n\r\n/**\r\n * 同步查询单个位置的地形高度\r\n * 使用 globe.getHeight 作为回退方案\r\n * @param CesiumNS Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param position 需要查询的位置(Cartesian3)\r\n * @returns 地形高度(无法获取时返回 0)\r\n */\r\nexport function queryTerrainHeightSync(\r\n CesiumNS: typeof Cesium,\r\n viewer: Cesium.Viewer,\r\n position: Cesium.Cartesian3\r\n): number {\r\n const C = CesiumNS as any;\r\n \r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(position);\r\n const globe = (viewer.scene as any).globe;\r\n \r\n if (globe && typeof globe.getHeight === 'function') {\r\n const height = globe.getHeight(cartographic);\r\n if (typeof height === 'number' && !isNaN(height)) {\r\n return height;\r\n }\r\n }\r\n } catch (error) {\r\n console.warn('[TerrainHeightQuery] 同步查询失败:', error);\r\n }\r\n \r\n return 0;\r\n}\r\n\r\n/**\r\n * 查询单个位置的地形高度(异步)\r\n * @param CesiumNS Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param position 需要查询的位置(Cartesian3)\r\n * @returns 地形高度\r\n */\r\nexport async function queryTerrainHeightAsync(\r\n CesiumNS: typeof Cesium,\r\n viewer: Cesium.Viewer,\r\n position: Cesium.Cartesian3\r\n): Promise<number> {\r\n const heights = await queryTerrainHeights(CesiumNS, viewer, [position]);\r\n return heights[0] ?? 0;\r\n}\r\n\r\n/**\r\n * 根据高度模式计算航点的绝对高度\r\n * @param CesiumNS Cesium 命名空间\r\n * @param altitudeMode 高度模式\r\n * @param defaultAltitude 默认高度(相对高度值)\r\n * @param startPointAltitude 起飞点高度(用于 relativeToStart 模式)\r\n * @param terrainHeight 地形高度(用于 relativeToGround 模式)\r\n * @returns 计算后的绝对高度\r\n */\r\nexport function calculateAbsoluteHeight(\r\n altitudeMode: 'absolute' | 'relativeToGround' | 'relativeToStart',\r\n defaultAltitude: number,\r\n startPointAltitude: number,\r\n terrainHeight: number\r\n): number {\r\n switch (altitudeMode) {\r\n case 'absolute':\r\n // 海平面高度:直接使用 defaultAltitude 作为绝对高度\r\n return defaultAltitude;\r\n \r\n case 'relativeToStart':\r\n // 相对起飞点:起飞点高度 + 相对高度\r\n return startPointAltitude + defaultAltitude;\r\n \r\n case 'relativeToGround':\r\n // 相对地形:地形高度 + 相对高度\r\n return terrainHeight + defaultAltitude;\r\n \r\n default:\r\n return defaultAltitude;\r\n }\r\n}\r\n\r\n/**\r\n * 根据高度模式计算航点的相对高度\r\n * @param altitudeMode 高度模式\r\n * @param absoluteHeight 绝对高度\r\n * @param startPointAltitude 起飞点高度\r\n * @param terrainHeight 地形高度\r\n * @returns 相对高度\r\n */\r\nexport function calculateRelativeHeight(\r\n altitudeMode: 'absolute' | 'relativeToGround' | 'relativeToStart',\r\n absoluteHeight: number,\r\n startPointAltitude: number,\r\n terrainHeight: number\r\n): number {\r\n switch (altitudeMode) {\r\n case 'absolute':\r\n // 海平面模式:相对高度等于绝对高度\r\n return absoluteHeight;\r\n \r\n case 'relativeToStart':\r\n // 相对起飞点:绝对高度 - 起飞点高度\r\n return absoluteHeight - startPointAltitude;\r\n \r\n case 'relativeToGround':\r\n // 相对地形:绝对高度 - 地形高度\r\n return absoluteHeight - terrainHeight;\r\n \r\n default:\r\n return absoluteHeight;\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { ContextMenuManager } from './ContextMenuManager';\r\nimport type { MenuItem } from './ContextMenuManager';\r\nimport { pickVertexIndex } from './PathEditingUtils';\r\nimport type { AirplaneCursor } from '../AirplaneCursor.ts';\r\nimport { VertexDragHandler } from './VertexDragHandler';\r\nimport type { VertexDetailInfo, VertexOperationInfo } from './VertexDetailInfo';\r\nimport { queryTerrainHeightSync } from '../utils/TerrainHeightQuery';\r\n\r\n/**\r\n * 事件处理器配置选项\r\n */\r\nexport interface PathEditingEventHandlerOptions {\r\n /** Cesium 命名空间 */\r\n CesiumNS: typeof Cesium;\r\n /** Cesium Viewer 实例 */\r\n viewer: Cesium.Viewer;\r\n /** 隐藏爬升点索引 */\r\n hiddenClimbIndex?: number;\r\n}\r\n\r\n/**\r\n * 事件回调函数\r\n */\r\nexport interface PathEditingEventCallbacks {\r\n /** 顶点选择回调 */\r\n onVertexSelect?: (index: number) => void;\r\n /** 顶点选中详细信息回调 */\r\n onVertexSelectDetail?: (info: VertexDetailInfo) => void;\r\n /** 插入顶点回调 */\r\n onInsertVertex?: (\r\n insertAt: number,\r\n position: Cesium.Cartesian3,\r\n pose: { heading: number; pitch: number; roll: number },\r\n ) => void;\r\n /** 顶点插入完成详细信息回调 */\r\n onVertexInsertDetail?: (info: VertexOperationInfo) => void;\r\n /** 删除顶点回调 */\r\n onDeleteVertex?: (index: number) => void;\r\n /** 顶点删除完成详细信息回调 */\r\n onVertexDeleteDetail?: (info: VertexOperationInfo) => void;\r\n /** 顶点拖动开始回调 */\r\n onVertexDragStart?: (index: number) => void;\r\n /** 顶点拖动中回调(实时更新位置) */\r\n onVertexDragMove?: (index: number, newPosition: Cesium.Cartesian3) => void;\r\n /** 顶点拖动结束回调 */\r\n onVertexDragEnd?: (index: number, finalPosition: Cesium.Cartesian3) => void;\r\n /** 顶点拖动完成详细信息回调 */\r\n onVertexDragCompleteDetail?: (info: VertexOperationInfo) => void;\r\n /** 获取当前选中索引 */\r\n getActiveIndex?: () => number | undefined;\r\n /** 获取所有位置 */\r\n getPositions?: () => Cesium.Cartesian3[];\r\n /** 获取飞机游标 */\r\n getAirplaneCursor?: () => AirplaneCursor | undefined;\r\n /** 获取姿态数据 */\r\n getPoseData?: () => {\r\n headings: number[];\r\n pitches: number[];\r\n rolls: number[];\r\n fovs: number[];\r\n };\r\n /** 获取实体引用 */\r\n getEntity?: () => Cesium.Entity | undefined;\r\n /** 🆕 获取快速编辑是否启用 */\r\n getQuickEditEnabled?: () => boolean;\r\n /** 🆕 获取快速编辑选项 */\r\n getQuickEditOptions?: () => {\r\n climbHeight: number;\r\n defaultAltitude: number;\r\n altitudeMode: string;\r\n };\r\n /** 模拟按键控制飞机游标(用于虚拟控制器) */\r\n simulateKeyPress?: (key: string, duration?: number) => void;\r\n /** 获取游标当前姿态(包含高度) */\r\n getCursorPose?: () => { position: any; heading: number; pitch: number; roll: number; altitude: number } | undefined;\r\n /** 🆕 获取起飞点高度(用于 relativeToStart 模式) */\r\n getStartPointAltitude?: () => number;\r\n /** 🆕 获取默认高度 */\r\n getDefaultAltitude?: () => number;\r\n /** 🆕 获取 useGlobalHeightFlags 数组 */\r\n getUseGlobalHeightFlags?: () => boolean[];\r\n /** 🆕 设置指定索引的 useGlobalHeight 标志 */\r\n setUseGlobalHeightFlag?: (index: number, value: boolean) => void;\r\n}\r\n\r\n/**\r\n * 路径编辑事件处理器\r\n * 负责处理用户交互事件(左键点击、右键菜单等)\r\n */\r\nexport class PathEditingEventHandler {\r\n private CesiumNS: typeof Cesium;\r\n private viewer: Cesium.Viewer;\r\n private hiddenClimbIndex?: number;\r\n private handler: any;\r\n private contextMenuManager: ContextMenuManager;\r\n private vertexDragHandler: VertexDragHandler;\r\n private callbacks: PathEditingEventCallbacks;\r\n private keydownListener?: (e: KeyboardEvent) => void;\r\n\r\n constructor(options: PathEditingEventHandlerOptions, callbacks: PathEditingEventCallbacks) {\r\n this.CesiumNS = options.CesiumNS;\r\n this.viewer = options.viewer;\r\n this.hiddenClimbIndex = options.hiddenClimbIndex;\r\n this.callbacks = callbacks;\r\n\r\n const C = this.CesiumNS as any;\r\n this.handler = new C.ScreenSpaceEventHandler((this.viewer.scene as any).canvas);\r\n this.contextMenuManager = new ContextMenuManager();\r\n\r\n // 创建顶点拖动处理器\r\n this.vertexDragHandler = new VertexDragHandler(\r\n {\r\n CesiumNS: this.CesiumNS,\r\n viewer: this.viewer,\r\n hiddenClimbIndex: this.hiddenClimbIndex,\r\n },\r\n {\r\n onDragStart: (index) => {\r\n if (this.callbacks.onVertexDragStart) {\r\n this.callbacks.onVertexDragStart(index);\r\n }\r\n },\r\n onDragMove: (index, newPosition) => {\r\n if (this.callbacks.onVertexDragMove) {\r\n this.callbacks.onVertexDragMove(index, newPosition);\r\n }\r\n },\r\n onDragEnd: (index, finalPosition) => {\r\n if (this.callbacks.onVertexDragEnd) {\r\n this.callbacks.onVertexDragEnd(index, finalPosition);\r\n }\r\n },\r\n getPositions: () => this.callbacks.getPositions?.() || [],\r\n },\r\n );\r\n\r\n this.setupEventHandlers();\r\n }\r\n\r\n /**\r\n * 设置所有事件处理器\r\n */\r\n private setupEventHandlers(): void {\r\n const C = this.CesiumNS as any;\r\n\r\n // LEFT_DOWN: 检测拖动或选择顶点\r\n this.handler.setInputAction((movement: any) => {\r\n const scene = this.viewer.scene as any;\r\n const picked = scene.pick?.(movement.position);\r\n const entity = picked?.id as any;\r\n const currentActiveIndex = this.callbacks.getActiveIndex?.();\r\n\r\n // 优先检查是否点击了顶点标签\r\n if (entity?.properties?._type?.getValue?.() === 'vertex-label') {\r\n const index = entity.properties._vertexIndex?.getValue?.();\r\n if (typeof index === 'number') {\r\n // 判断是否点击的是已选中的顶点\r\n if (currentActiveIndex === index) {\r\n // 点击已选中的顶点 → 开始拖动\r\n this.vertexDragHandler.startDrag(index, movement.position);\r\n } else {\r\n // 点击未选中的顶点 → 仅选中该顶点(标签变蓝)\r\n if (this.callbacks.onVertexSelect) {\r\n this.callbacks.onVertexSelect(index);\r\n }\r\n // 触发详细信息回调\r\n console.log('[PathEditingEventHandler] 顶点被点击,索引:', index, '回调存在:', !!this.callbacks.onVertexSelectDetail);\r\n if (this.callbacks.onVertexSelectDetail) {\r\n try {\r\n const detailInfo = this.buildVertexDetailInfo(index);\r\n console.log('[PathEditingEventHandler] 调用 onVertexSelectDetail 回调');\r\n this.callbacks.onVertexSelectDetail(detailInfo);\r\n } catch (error) {\r\n console.error('[PathEditingEventHandler] Error building vertex detail info:', error);\r\n }\r\n }\r\n }\r\n return;\r\n }\r\n }\r\n\r\n // 检查是否点击了顶点句柄(选择顶点)\r\n const idx = pickVertexIndex(this.viewer, movement.position, this.hiddenClimbIndex);\r\n if (typeof idx === 'number') {\r\n if (this.callbacks.onVertexSelect) {\r\n this.callbacks.onVertexSelect(idx);\r\n }\r\n // 触发详细信息回调\r\n if (this.callbacks.onVertexSelectDetail) {\r\n try {\r\n const detailInfo = this.buildVertexDetailInfo(idx);\r\n this.callbacks.onVertexSelectDetail(detailInfo);\r\n } catch (error) {\r\n console.error('Error building vertex detail info:', error);\r\n }\r\n }\r\n }\r\n }, C.ScreenSpaceEventType.LEFT_DOWN);\r\n\r\n // MOUSE_MOVE: 处理拖动\r\n this.handler.setInputAction((movement: any) => {\r\n if (this.vertexDragHandler.isDragging()) {\r\n this.vertexDragHandler.handleMove(movement.endPosition);\r\n }\r\n }, C.ScreenSpaceEventType.MOUSE_MOVE);\r\n\r\n // LEFT_UP: 结束拖动\r\n this.handler.setInputAction(() => {\r\n if (this.vertexDragHandler.isDragging()) {\r\n this.vertexDragHandler.endDrag();\r\n }\r\n }, C.ScreenSpaceEventType.LEFT_UP);\r\n\r\n // LEFT_CLICK: 选择顶点或快速编辑添加顶点\r\n this.handler.setInputAction((movement: any) => {\r\n // 如果刚刚结束拖动,不触发选择\r\n if (this.vertexDragHandler.isDragging()) {\r\n return;\r\n }\r\n\r\n // 1. 优先检查是否点击了顶点\r\n const idx = pickVertexIndex(this.viewer, movement.position, this.hiddenClimbIndex);\r\n if (typeof idx === 'number') {\r\n // 点击了顶点,执行选择逻辑\r\n if (this.callbacks.onVertexSelect) {\r\n this.callbacks.onVertexSelect(idx);\r\n }\r\n // 触发详细信息回调\r\n if (this.callbacks.onVertexSelectDetail) {\r\n try {\r\n const detailInfo = this.buildVertexDetailInfo(idx);\r\n this.callbacks.onVertexSelectDetail(detailInfo);\r\n } catch (error) {\r\n console.error('Error building vertex detail info:', error);\r\n }\r\n }\r\n return; // 💡 重要:点击了顶点就返回,不执行快速编辑\r\n }\r\n\r\n // 2. 🆕 检查快速编辑模式\r\n const quickEditEnabled = this.callbacks.getQuickEditEnabled?.();\r\n if (quickEditEnabled) {\r\n // 快速编辑模式:点击地图添加顶点\r\n this.handleQuickEditClick(movement);\r\n return;\r\n }\r\n\r\n // 3. 默认:不做任何操作\r\n }, C.ScreenSpaceEventType.LEFT_CLICK);\r\n\r\n // RIGHT_CLICK: 显示上下文菜单或取消拖动\r\n this.handler.setInputAction((movement: any) => {\r\n // 如果正在拖动,取消拖动\r\n if (this.vertexDragHandler.isDragging()) {\r\n this.vertexDragHandler.cancelDrag();\r\n return;\r\n }\r\n\r\n this.handleRightClick(movement);\r\n }, C.ScreenSpaceEventType.RIGHT_CLICK);\r\n\r\n // SPACE: 快捷键在飞机游标位置添加航点到末尾\r\n this.keydownListener = (e: KeyboardEvent) => {\r\n // 仅处理空格键\r\n if (e.code !== 'Space') return;\r\n \r\n // 防止与输入框冲突\r\n const target = e.target as HTMLElement;\r\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\r\n return;\r\n }\r\n \r\n // 正在拖动时忽略\r\n if (this.vertexDragHandler.isDragging()) return;\r\n \r\n // 阻止默认行为(页面滚动)\r\n e.preventDefault();\r\n \r\n // 执行快捷插入\r\n this.handleSpaceKeyInsert();\r\n };\r\n \r\n document.addEventListener('keydown', this.keydownListener);\r\n }\r\n\r\n /**\r\n * 处理空格键快捷插入航点\r\n * 在飞机游标当前位置,将航点添加到所有航点末尾\r\n */\r\n private handleSpaceKeyInsert(): void {\r\n // 获取飞机游标\r\n const airplaneCursor = this.callbacks.getAirplaneCursor?.();\r\n if (!airplaneCursor) {\r\n console.warn('[PathEditingEventHandler] 空格键插入:飞机游标不存在');\r\n return;\r\n }\r\n\r\n // 获取当前姿态\r\n const pose = airplaneCursor.getPose();\r\n if (!pose || !pose.position) {\r\n console.warn('[PathEditingEventHandler] 空格键插入:无法获取游标姿态');\r\n return;\r\n }\r\n\r\n // 计算插入位置(末尾)\r\n const positions = this.callbacks.getPositions?.() || [];\r\n const insertAt = positions.length;\r\n\r\n console.log('[PathEditingEventHandler] 空格键快捷插入航点,位置索引:', insertAt);\r\n\r\n // 调用插入方法\r\n this.handleInsertVertex(insertAt, pose, 'after');\r\n }\r\n\r\n /**\r\n * 处理右键点击事件\r\n * 判断点击目标是飞机游标还是顶点\r\n * 如果是飞机游标,显示插入菜单:添加第一个航点、插入到选中点前/后\r\n * 如果是顶点,显示菜单:删除航点(顶点)\r\n */\r\n private handleRightClick(movement: any): void {\r\n this.contextMenuManager.hide();\r\n\r\n try {\r\n const picked = (this.viewer.scene as any).pick?.(movement.position);\r\n const entity = picked?.id as any;\r\n const airplaneCursor = this.callbacks.getAirplaneCursor?.();\r\n\r\n // 检查是否点击了顶点\r\n const vertexIndex = pickVertexIndex(this.viewer, movement.position, this.hiddenClimbIndex);\r\n\r\n // 将 canvas 坐标转换为视口坐标\r\n const viewportPosition = this.canvasToViewportPosition(movement.position);\r\n\r\n if (typeof vertexIndex === 'number') {\r\n // 点击了顶点,显示删除菜单\r\n const menuItems = this.buildVertexContextMenuItems(vertexIndex);\r\n this.contextMenuManager.show(viewportPosition, menuItems);\r\n } else if (airplaneCursor && airplaneCursor.containsEntity(entity)) {\r\n // 检查是否点击了飞机游标,显示插入菜单\r\n const menuItems = this.buildAirplaneCursorContextMenuItems();\r\n this.contextMenuManager.show(viewportPosition, menuItems);\r\n }\r\n } catch (error) {\r\n console.error('Error handling right click:', error);\r\n }\r\n }\r\n\r\n /**\r\n * 构建飞机游标的上下文菜单项(插入航点)\r\n */\r\n private buildAirplaneCursorContextMenuItems(): MenuItem[] {\r\n const menuItems: MenuItem[] = [];\r\n const activeIndex = this.callbacks.getActiveIndex?.();\r\n const airplaneCursor = this.callbacks.getAirplaneCursor?.();\r\n const positions = this.callbacks.getPositions?.() || [];\r\n\r\n if (!airplaneCursor) {\r\n return [\r\n {\r\n label: '未选择顶点',\r\n action: () => {},\r\n disabled: true,\r\n },\r\n ];\r\n }\r\n\r\n const pose = airplaneCursor.getPose();\r\n const visibleVertexCount = positions.length - (this.hiddenClimbIndex === 1 ? 1 : 0);\r\n\r\n if (activeIndex !== undefined && pose) {\r\n // 已选中顶点,显示插入选项\r\n menuItems.push({\r\n label: '插入到选中点前',\r\n action: () => {\r\n this.handleInsertVertex(activeIndex, pose, 'before');\r\n },\r\n });\r\n\r\n menuItems.push({\r\n label: '插入到选中点后',\r\n action: () => {\r\n this.handleInsertVertex(activeIndex + 1, pose, 'after');\r\n },\r\n });\r\n } else if (pose && visibleVertexCount <= 1) {\r\n // 仅有起始点,允许添加第一个航点\r\n menuItems.push({\r\n label: '添加第一个航点',\r\n action: () => {\r\n let insertAt = positions.length;\r\n if (this.hiddenClimbIndex === 1) {\r\n insertAt = 2;\r\n } else {\r\n insertAt = 1;\r\n }\r\n if (insertAt > positions.length) {\r\n insertAt = positions.length;\r\n }\r\n this.handleInsertVertex(insertAt, pose, 'first');\r\n },\r\n });\r\n } else {\r\n menuItems.push({\r\n label: '未选择顶点',\r\n action: () => {},\r\n disabled: true,\r\n });\r\n }\r\n\r\n return menuItems;\r\n }\r\n\r\n /**\r\n * 构建顶点的上下文菜单项(删除航点)\r\n */\r\n private buildVertexContextMenuItems(vertexIndex: number): MenuItem[] {\r\n const menuItems: MenuItem[] = [];\r\n const positions = this.callbacks.getPositions?.() || [];\r\n\r\n // 🆕 任意航点可删除,仅保护最后一个航点\r\n const canDelete = positions.length > 1;\r\n\r\n if (canDelete) {\r\n menuItems.push({\r\n label: `删除航点 ${this.getVertexDisplayNumber(vertexIndex)}`,\r\n action: () => {\r\n this.handleDeleteVertex(vertexIndex);\r\n },\r\n });\r\n } else {\r\n menuItems.push({\r\n label: '至少保留一个航点',\r\n action: () => {},\r\n disabled: true,\r\n });\r\n }\r\n\r\n return menuItems;\r\n }\r\n\r\n /**\r\n * 获取顶点的显示编号\r\n * 🆕 不再跳过隐藏爬升点,直接返回索引\r\n */\r\n private getVertexDisplayNumber(index: number): number {\r\n return index;\r\n }\r\n\r\n /**\r\n * 构建顶点详细信息\r\n */\r\n private buildVertexDetailInfo(index: number): VertexDetailInfo {\r\n const positions = this.callbacks.getPositions?.() || [];\r\n const poseData = this.callbacks.getPoseData?.();\r\n const entity = this.callbacks.getEntity?.();\r\n \r\n const position = positions[index];\r\n const C = this.CesiumNS as any;\r\n \r\n // 转换为经纬度高度\r\n let coordinates = { longitude: 0, latitude: 0, height: 0 };\r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(position);\r\n coordinates = {\r\n longitude: C.Math.toDegrees(cartographic.longitude),\r\n latitude: C.Math.toDegrees(cartographic.latitude),\r\n height: cartographic.height,\r\n };\r\n } catch {}\r\n \r\n // 姿态信息\r\n let pose: VertexDetailInfo['pose'] | undefined;\r\n if (poseData) {\r\n pose = {\r\n heading: poseData.headings[index] ?? 0,\r\n pitch: poseData.pitches[index] ?? 0,\r\n roll: poseData.rolls[index] ?? 0,\r\n fov: poseData.fovs[index] ?? 50,\r\n };\r\n }\r\n \r\n // 🆕 所有航点都是可见的\r\n const totalVertices = positions.length;\r\n const totalVisibleVertices = totalVertices;\r\n \r\n // 🆕 不再有起点和隐藏爬升点的概念\r\n const isStartPoint = false;\r\n const isHiddenClimb = false;\r\n \r\n // 🆕 任意航点可删除,仅保护最后一个航点\r\n const canDelete = totalVertices > 1;\r\n \r\n // 提取路径属性\r\n let pathProperties: VertexDetailInfo['pathProperties'] | undefined;\r\n if (entity) {\r\n try {\r\n const props: any = (entity as any).properties;\r\n pathProperties = {\r\n altitudeMode: props?._altitudeMode?.getValue?.() ?? props?._altitudeMode,\r\n climbHeight: props?._climbHeight?.getValue?.() ?? props?._climbHeight,\r\n };\r\n } catch {}\r\n }\r\n \r\n return {\r\n index,\r\n displayNumber: this.getVertexDisplayNumber(index),\r\n position,\r\n coordinates,\r\n pose,\r\n isStartPoint,\r\n isHiddenClimb,\r\n canDelete,\r\n totalVisibleVertices,\r\n totalVertices,\r\n entity,\r\n pathProperties,\r\n };\r\n }\r\n\r\n /**\r\n * 构建顶点操作信息\r\n */\r\n private buildVertexOperationInfo(\r\n type: 'insert' | 'delete' | 'move' | 'select',\r\n index: number,\r\n options?: {\r\n totalBefore?: number;\r\n totalAfter?: number;\r\n newVertex?: VertexDetailInfo;\r\n newPosition?: Cesium.Cartesian3;\r\n },\r\n ): VertexOperationInfo {\r\n const positions = this.callbacks.getPositions?.() || [];\r\n const totalVertices = positions.length;\r\n \r\n return {\r\n type,\r\n index,\r\n displayNumber: this.getVertexDisplayNumber(index),\r\n totalVerticesBefore: options?.totalBefore ?? totalVertices,\r\n totalVerticesAfter: options?.totalAfter ?? totalVertices,\r\n newVertex: options?.newVertex,\r\n newPosition: options?.newPosition,\r\n timestamp: new Date(),\r\n };\r\n }\r\n\r\n /**\r\n * 处理插入顶点\r\n * 🆕 不再跳过隐藏爬升点\r\n */\r\n private handleInsertVertex(\r\n insertAt: number,\r\n pose: { position: Cesium.Cartesian3; heading: number; pitch: number; roll: number },\r\n type: 'before' | 'after' | 'first',\r\n ): void {\r\n if (this.callbacks.onInsertVertex) {\r\n this.callbacks.onInsertVertex(insertAt, pose.position, {\r\n heading: pose.heading,\r\n pitch: pose.pitch,\r\n roll: pose.roll,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 处理删除顶点\r\n */\r\n private handleDeleteVertex(index: number): void {\r\n if (this.callbacks.onDeleteVertex) {\r\n this.callbacks.onDeleteVertex(index);\r\n }\r\n }\r\n\r\n /**\r\n * 更新回调函数\r\n */\r\n updateCallbacks(callbacks: Partial<PathEditingEventCallbacks>): void {\r\n this.callbacks = { ...this.callbacks, ...callbacks };\r\n }\r\n\r\n /**\r\n * 隐藏上下文菜单\r\n */\r\n hideContextMenu(): void {\r\n this.contextMenuManager.hide();\r\n }\r\n\r\n /**\r\n * 🆕 处理快速编辑模式的点击\r\n * 根据 altitudeMode 计算航点高度:\r\n * - absolute: 航点高度 = defaultAltitude\r\n * - relativeToGround: 航点高度 = 地形高度 + defaultAltitude\r\n * - relativeToStart: 航点高度 = 起飞点高度 + defaultAltitude\r\n */\r\n private handleQuickEditClick(movement: any): void {\r\n // 1. 获取点击位置\r\n const position = this.getPositionFromMouse(movement);\r\n if (!position) {\r\n console.warn('[QuickEdit] 无法获取点击位置');\r\n return;\r\n }\r\n\r\n // 2. 获取快速编辑选项\r\n const quickEditOptions = this.callbacks.getQuickEditOptions?.();\r\n if (!quickEditOptions) return;\r\n\r\n const { defaultAltitude, altitudeMode } = quickEditOptions;\r\n\r\n // 3. 🆕 根据高度模式计算新顶点位置\r\n const newPosition = this.calculatePositionByAltitudeMode(position, defaultAltitude, altitudeMode);\r\n\r\n // 🐛 调试:显示计算后的高度\r\n const C = this.CesiumNS as any;\r\n const newCarto = C.Cartographic.fromCartesian(newPosition);\r\n const newHeight = newCarto.height;\r\n\r\n // 4. 获取当前位置数组\r\n const positions = this.callbacks.getPositions?.() || [];\r\n const insertAt = positions.length; // 插入到末尾\r\n\r\n // 5. 计算航向角(从上一个点指向新点)\r\n let heading = 0;\r\n if (positions.length > 0) {\r\n const lastPosition = positions[positions.length - 1];\r\n heading = this.calculateHeading(lastPosition, newPosition);\r\n }\r\n\r\n // 6. 调用插入顶点回调\r\n if (this.callbacks.onInsertVertex) {\r\n console.log('[QuickEdit] 添加新顶点:', {\r\n insertAt,\r\n heading: heading.toFixed(2),\r\n altitudeMode,\r\n defaultAltitude,\r\n finalHeight: newHeight.toFixed(2),\r\n });\r\n\r\n this.callbacks.onInsertVertex(insertAt, newPosition, {\r\n heading,\r\n pitch: -10, // 默认俯仰角\r\n roll: 0,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * 🆕 根据高度模式计算航点位置\r\n * - absolute: 航点高度 = defaultAltitude\r\n * - relativeToGround: 航点高度 = 地形高度 + defaultAltitude\r\n * - relativeToStart: 航点高度 = 起飞点高度 + defaultAltitude\r\n */\r\n private calculatePositionByAltitudeMode(\r\n position: Cesium.Cartesian3,\r\n defaultAltitude: number,\r\n altitudeMode: string\r\n ): Cesium.Cartesian3 {\r\n const C = this.CesiumNS as any;\r\n\r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(position);\r\n const lon = C.Math.toDegrees(cartographic.longitude);\r\n const lat = C.Math.toDegrees(cartographic.latitude);\r\n \r\n let finalHeight: number;\r\n \r\n if (altitudeMode === 'absolute') {\r\n // 海拔高度模式:航点高度 = defaultAltitude\r\n finalHeight = defaultAltitude;\r\n } else if (altitudeMode === 'relativeToGround') {\r\n // 相对地形模式:航点高度 = 地形高度 + defaultAltitude\r\n const terrainHeight = queryTerrainHeightSync(this.CesiumNS, this.viewer, position);\r\n finalHeight = terrainHeight + defaultAltitude;\r\n } else if (altitudeMode === 'relativeToStart') {\r\n // 相对起飞点模式:航点高度 = 起飞点高度 + defaultAltitude\r\n const startPointAltitude = this.callbacks.getStartPointAltitude?.() ?? 0;\r\n finalHeight = startPointAltitude + defaultAltitude;\r\n } else {\r\n // 默认使用 absolute 模式\r\n finalHeight = defaultAltitude;\r\n }\r\n\r\n console.log('[QuickEdit] 高度计算:', {\r\n altitudeMode,\r\n defaultAltitude,\r\n finalHeight,\r\n });\r\n\r\n return C.Cartesian3.fromDegrees(lon, lat, finalHeight);\r\n } catch (error) {\r\n console.error('[QuickEdit] 高度计算失败:', error);\r\n return position;\r\n }\r\n }\r\n\r\n /**\r\n * 🆕 计算航向角\r\n */\r\n private calculateHeading(from: Cesium.Cartesian3, to: Cesium.Cartesian3): number {\r\n const C = this.CesiumNS as any;\r\n\r\n try {\r\n const fromCarto = C.Cartographic.fromCartesian(from);\r\n const toCarto = C.Cartographic.fromCartesian(to);\r\n\r\n const deltaLon = toCarto.longitude - fromCarto.longitude;\r\n\r\n let heading = Math.atan2(\r\n Math.sin(deltaLon) * Math.cos(toCarto.latitude),\r\n Math.cos(fromCarto.latitude) * Math.sin(toCarto.latitude) -\r\n Math.sin(fromCarto.latitude) * Math.cos(toCarto.latitude) * Math.cos(deltaLon)\r\n );\r\n\r\n heading = C.Math.toDegrees(heading);\r\n\r\n // 归一化到 [-180, 180]\r\n if (heading > 180) heading -= 360;\r\n if (heading < -180) heading += 360;\r\n\r\n return heading;\r\n } catch (error) {\r\n console.error('[QuickEdit] 航向角计算失败:', error);\r\n return 0;\r\n }\r\n }\r\n\r\n /**\r\n * 将 canvas 坐标转换为视口坐标\r\n * Cesium 事件返回的坐标是相对于 canvas 的,而菜单需要相对于视口的坐标\r\n */\r\n private canvasToViewportPosition(canvasPosition: { x: number; y: number }): { x: number; y: number } {\r\n const canvas = (this.viewer.scene as any).canvas as HTMLCanvasElement;\r\n const rect = canvas.getBoundingClientRect();\r\n return {\r\n x: canvasPosition.x + rect.left,\r\n y: canvasPosition.y + rect.top,\r\n };\r\n }\r\n\r\n /**\r\n * 🆕 从鼠标事件获取位置\r\n */\r\n private getPositionFromMouse(movement: any): Cesium.Cartesian3 | undefined {\r\n const scene = this.viewer.scene as any;\r\n const winPos = movement?.position;\r\n if (!winPos) return undefined;\r\n\r\n let cart: any | undefined;\r\n try {\r\n // 优先使用 pickPosition(深度缓冲)\r\n cart = scene.pickPosition?.(winPos);\r\n } catch {}\r\n\r\n if (!cart) {\r\n // 回退到 globe.pick\r\n try {\r\n const ray = this.viewer.camera.getPickRay?.(winPos);\r\n cart = ray ? scene.globe?.pick?.(ray, scene) : undefined;\r\n } catch {}\r\n }\r\n\r\n return cart;\r\n }\r\n\r\n /**\r\n * 销毁事件处理器\r\n */\r\n destroy(): void {\r\n // 移除键盘事件监听器\r\n if (this.keydownListener) {\r\n document.removeEventListener('keydown', this.keydownListener);\r\n this.keydownListener = undefined;\r\n }\r\n\r\n try {\r\n this.vertexDragHandler.destroy();\r\n } catch {}\r\n\r\n try {\r\n this.contextMenuManager.destroy();\r\n } catch {}\r\n\r\n try {\r\n this.handler?.destroy();\r\n } catch {}\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\n/**\r\n * 顶点句柄样式配置\r\n */\r\nexport interface VertexHandleStyle {\r\n pixelSize: number;\r\n color: Cesium.Color;\r\n outlineColor: Cesium.Color;\r\n outlineWidth: number;\r\n}\r\n\r\n/**\r\n * 顶点句柄样式选项\r\n */\r\nexport interface VertexHandleStyleOptions {\r\n /** 普通状态样式 */\r\n normal?: Partial<VertexHandleStyle>;\r\n /** 编辑状态样式 */\r\n edited?: Partial<VertexHandleStyle>;\r\n /** 选中状态样式 */\r\n selected?: Partial<VertexHandleStyle>;\r\n}\r\n\r\n/**\r\n * 顶点句柄状态\r\n */\r\nexport type VertexHandleState = 'normal' | 'edited' | 'selected';\r\n\r\n/**\r\n * 顶点句柄样式管理器\r\n * 负责管理路径编辑中顶点句柄的样式(普通、编辑、选中)\r\n */\r\nexport class VertexHandleStyleManager {\r\n private normalStyle: VertexHandleStyle;\r\n private editedStyle: VertexHandleStyle;\r\n private selectedStyle: VertexHandleStyle;\r\n\r\n constructor(CesiumNS: typeof Cesium, options?: VertexHandleStyleOptions) {\r\n const C = CesiumNS as any;\r\n\r\n // 默认样式配置\r\n this.normalStyle = {\r\n pixelSize: options?.normal?.pixelSize ?? 6,\r\n color: options?.normal?.color ?? C.Color.YELLOW,\r\n outlineColor: options?.normal?.outlineColor ?? C.Color.BLACK,\r\n outlineWidth: options?.normal?.outlineWidth ?? 1,\r\n };\r\n\r\n this.editedStyle = {\r\n pixelSize: options?.edited?.pixelSize ?? 6,\r\n color: options?.edited?.color ?? C.Color.CYAN,\r\n outlineColor: options?.edited?.outlineColor ?? C.Color.BLACK,\r\n outlineWidth: options?.edited?.outlineWidth ?? 1,\r\n };\r\n\r\n this.selectedStyle = {\r\n pixelSize: options?.selected?.pixelSize ?? 8,\r\n color: options?.selected?.color ?? C.Color.ORANGE,\r\n outlineColor: options?.selected?.outlineColor ?? C.Color.BLACK,\r\n outlineWidth: options?.selected?.outlineWidth ?? 2,\r\n };\r\n }\r\n\r\n /**\r\n * 应用样式到顶点句柄\r\n * @param handle 顶点句柄实体\r\n * @param state 状态类型\r\n */\r\n applyStyle(handle: Cesium.Entity, state: VertexHandleState): void {\r\n const style = this.getStyleByState(state);\r\n this.applyHandleStyle(handle, style);\r\n }\r\n\r\n /**\r\n * 根据状态获取样式\r\n */\r\n private getStyleByState(state: VertexHandleState): VertexHandleStyle {\r\n switch (state) {\r\n case 'normal':\r\n return this.normalStyle;\r\n case 'edited':\r\n return this.editedStyle;\r\n case 'selected':\r\n return this.selectedStyle;\r\n default:\r\n return this.normalStyle;\r\n }\r\n }\r\n\r\n /**\r\n * 应用样式到句柄\r\n */\r\n private applyHandleStyle(handle: Cesium.Entity, style: VertexHandleStyle): void {\r\n try {\r\n const point = (handle as any).point;\r\n if (!point) return;\r\n\r\n if (style.pixelSize !== undefined) {\r\n point.pixelSize = style.pixelSize;\r\n }\r\n if (style.color !== undefined) {\r\n point.color = style.color;\r\n }\r\n if (style.outlineColor !== undefined) {\r\n point.outlineColor = style.outlineColor;\r\n }\r\n if (style.outlineWidth !== undefined) {\r\n point.outlineWidth = style.outlineWidth;\r\n }\r\n } catch (error) {\r\n console.error('Failed to apply handle style:', error);\r\n }\r\n }\r\n\r\n /**\r\n * 根据编辑状态获取句柄状态\r\n * @param isEdited 是否已编辑\r\n * @param isSelected 是否选中\r\n */\r\n getHandleState(isEdited: boolean, isSelected: boolean): VertexHandleState {\r\n if (isSelected) return 'selected';\r\n if (isEdited) return 'edited';\r\n return 'normal';\r\n }\r\n\r\n /**\r\n * 更新样式配置\r\n */\r\n updateStyles(options: VertexHandleStyleOptions): void {\r\n if (options.normal) {\r\n this.normalStyle = {\r\n ...this.normalStyle,\r\n ...options.normal,\r\n };\r\n }\r\n\r\n if (options.edited) {\r\n this.editedStyle = {\r\n ...this.editedStyle,\r\n ...options.edited,\r\n };\r\n }\r\n\r\n if (options.selected) {\r\n this.selectedStyle = {\r\n ...this.selectedStyle,\r\n ...options.selected,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 获取普通样式\r\n */\r\n getNormalStyle(): VertexHandleStyle {\r\n return { ...this.normalStyle };\r\n }\r\n\r\n /**\r\n * 获取编辑样式\r\n */\r\n getEditedStyle(): VertexHandleStyle {\r\n return { ...this.editedStyle };\r\n }\r\n\r\n /**\r\n * 获取选中样式\r\n */\r\n getSelectedStyle(): VertexHandleStyle {\r\n return { ...this.selectedStyle };\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport type { HeightMarker } from '../HeightMarker';\r\n\r\n/**\r\n * 路径状态管理器\r\n * 负责保存、恢复和持久化路径编辑状态\r\n */\r\nexport class PathStateManager {\r\n private entity: Cesium.Entity;\r\n \r\n // 原始状态(用于回滚)\r\n private originalPositions: Cesium.Cartesian3[];\r\n private originalHeadings: number[];\r\n private originalPitches: number[];\r\n private originalRolls: number[];\r\n private originalFovs: number[];\r\n\r\n constructor(\r\n entity: Cesium.Entity,\r\n positions: Cesium.Cartesian3[],\r\n headings: number[],\r\n pitches: number[],\r\n rolls: number[],\r\n fovs: number[],\r\n ) {\r\n this.entity = entity;\r\n \r\n // 保存原始状态\r\n this.originalPositions = positions.slice();\r\n this.originalHeadings = headings.slice();\r\n this.originalPitches = pitches.slice();\r\n this.originalRolls = rolls.slice();\r\n this.originalFovs = fovs.slice();\r\n }\r\n\r\n /**\r\n * 将当前状态持久化到实体\r\n * @param positions 当前位置数组\r\n * @param headings 当前航向数组\r\n * @param pitches 当前俯仰数组\r\n * @param rolls 当前翻滚数组\r\n * @param fovs 当前视场角数组\r\n */\r\n persistToEntity(\r\n positions: Cesium.Cartesian3[],\r\n headings: number[],\r\n pitches: number[],\r\n rolls: number[],\r\n fovs: number[],\r\n ): void {\r\n try {\r\n (this.entity as any).polyline.positions = positions.slice();\r\n } catch (err) {\r\n console.warn('Failed to persist positions to entity:', err);\r\n }\r\n \r\n try {\r\n (this.entity as any).properties = {\r\n ...(this.entity as any).properties,\r\n _vertexHeadings: headings.slice(),\r\n _vertexPitch: pitches.slice(),\r\n _vertexRoll: rolls.slice(),\r\n _vertexFov: fovs.slice(),\r\n };\r\n } catch (err) {\r\n console.warn('Failed to persist properties to entity:', err);\r\n }\r\n }\r\n\r\n /**\r\n * 恢复到原始状态\r\n * @param positions 位置数组(会被修改)\r\n * @param headings 航向数组(会被修改)\r\n * @param pitches 俯仰数组(会被修改)\r\n * @param rolls 翻滚数组(会被修改)\r\n * @param fovs 视场角数组(会被修改)\r\n * @param handles 顶点句柄数组\r\n * @param heightMarkers 高度标记数组\r\n * @param createOrUpdateMarkerForIndex 创建或更新高度标记的回调函数\r\n */\r\n revertToOriginal(\r\n positions: Cesium.Cartesian3[],\r\n headings: number[],\r\n pitches: number[],\r\n rolls: number[],\r\n fovs: number[],\r\n handles: any[],\r\n heightMarkers: (HeightMarker | undefined)[],\r\n createOrUpdateMarkerForIndex: (index: number) => void,\r\n ): void {\r\n // 清空并恢复位置\r\n positions.length = 0;\r\n this.originalPositions.forEach((p) => positions.push(p));\r\n \r\n // 清空并恢复航向\r\n headings.length = 0;\r\n this.originalHeadings.forEach((v) => headings.push(v));\r\n \r\n // 清空并恢复俯仰\r\n pitches.length = 0;\r\n this.originalPitches.forEach((v) => pitches.push(v));\r\n \r\n // 清空并恢复翻滚\r\n rolls.length = 0;\r\n this.originalRolls.forEach((v) => rolls.push(v));\r\n \r\n // 清空并恢复视场角\r\n fovs.length = 0;\r\n this.originalFovs.forEach((v) => fovs.push(v));\r\n \r\n // 更新句柄位置\r\n handles.forEach((h, i) => {\r\n try {\r\n if (positions[i]) (h as any).position = positions[i];\r\n } catch (err) {\r\n console.warn(`Failed to update handle position at index ${i}:`, err);\r\n }\r\n });\r\n \r\n // 更新高度标记以匹配恢复的位置\r\n for (let i = 0; i < positions.length; i++) {\r\n try {\r\n createOrUpdateMarkerForIndex(i);\r\n } catch (err) {\r\n console.warn(`Failed to update height marker at index ${i}:`, err);\r\n }\r\n }\r\n \r\n // 持久化恢复后的状态到实体\r\n this.persistToEntity(positions, headings, pitches, rolls, fovs);\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { HeightMarker } from './HeightMarker';\r\nimport { PathPreview } from './PathPreview';\r\nimport { AirplaneCursor } from './AirplaneCursor';\r\nimport { VertexLabelManager } from './editing/VertexLabelManager';\r\nimport { computeHeadingDegFromTo, ensureLayerForEntity, calculatePathDistance } from './editing/PathEditingUtils';\r\nimport { VertexInsertionHandler } from './editing/VertexInsertionHandler';\r\nimport { PathEditingEventHandler } from './editing/PathEditingEventHandler';\r\nimport { VertexHandleStyleManager } from './editing/VertexHandleStyleManager';\r\nimport { PathStateManager } from './editing/PathStateManager';\r\nimport { globalCameraEventBus } from '../../utils/events';\r\nimport type { VertexDetailInfo, VertexOperationInfo, VertexDragMoveInfo, WaypointUpdateData, WaypointBatchUpdate } from './editing/VertexDetailInfo';\r\nimport { queryTerrainHeights, queryTerrainHeightSync, calculateAbsoluteHeight, calculateRelativeHeight } from './utils/TerrainHeightQuery';\r\n\r\n/**\r\n * 高度计算模式类型\r\n * - absolute: 海平面高度(绝对高度)\r\n * - relativeToGround: 相对地形高度\r\n * - relativeToStart: 相对起飞点高度\r\n */\r\nexport type AltitudeMode = 'absolute' | 'relativeToGround' | 'relativeToStart';\r\n\r\n/**\r\n * 🆕 快速编辑模式配置选项\r\n */\r\nexport interface QuickEditOptions {\r\n /** 是否启用(默认 false) */\r\n enabled?: boolean;\r\n /** 新顶点的默认爬升高度(米) */\r\n climbHeight?: number;\r\n /** 高度模式 */\r\n altitudeMode?: 'absolute' | 'relativeToStart' | 'relativeToGround';\r\n}\r\n\r\n/**\r\n * 飞航路线编辑模式的入口函数。\r\n * 允许选择已有顶点,移动顶点(键盘),插入新顶点(鼠标点击或键盘)。\r\n * 需要提供已有的 polyline 实体(entityOrId)。\r\n * @param CesiumNS Cesium 命名空间\r\n * @param viewer viewer 实例\r\n * @param entityOrId polyline id 或实体对象\r\n * @param options \r\n * @returns \r\n */\r\nexport function startPathEditing(\r\n CesiumNS: typeof Cesium,\r\n viewer: Cesium.Viewer,\r\n entityOrId: Cesium.Entity | string,\r\n options?: {\r\n layer?: Cesium.CustomDataSource;\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n preview?: {\r\n enabled?: boolean;\r\n container?: HTMLElement;\r\n showFootprint?: boolean;\r\n fov?: number; // degrees\r\n pitch?: number; // degrees\r\n roll?: number; // degrees\r\n lengthFactor?: number; // multiplier for frustum length relative to camera distance (default 0.3)\r\n };\r\n /** 顶点选中详细信息回调 */\r\n onVertexSelectDetail?: (info: VertexDetailInfo) => void;\r\n /** 顶点拖动完成详细信息回调 */\r\n onVertexDragCompleteDetail?: (info: VertexOperationInfo) => void;\r\n /** 顶点插入完成详细信息回调 */\r\n onVertexInsertDetail?: (info: VertexOperationInfo) => void;\r\n /** 顶点删除完成详细信息回调 */\r\n onVertexDeleteDetail?: (info: VertexOperationInfo) => void;\r\n /** 🆕 顶点拖动中实时回调(用于 UI 实时同步) */\r\n onVertexDragMoveDetail?: (info: VertexDragMoveInfo) => void;\r\n /** 🆕 快速编辑模式配置 */\r\n quickEdit?: boolean | QuickEditOptions;\r\n /** 🆕 航线默认高度(米),默认 100,新增航点时使用此高度值 */\r\n defaultAltitude?: number;\r\n /** 🆕 高度计算模式 */\r\n altitudeMode?: AltitudeMode;\r\n },\r\n): {\r\n saveAndStop: () => {\r\n entity: Cesium.Entity;\r\n positions: Cesium.Cartesian3[];\r\n climbHeight?: number;\r\n waypointData: Array<{\r\n position: Cesium.Cartesian3;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n fov: number;\r\n index: number;\r\n distance: number;\r\n /** 椭球高度(WGS84 椭球面以上的高度) */\r\n ellipsoidHeight: number;\r\n /** 相对高度(根据 altitudeMode 计算:海拔高度或相对地形高度) */\r\n relativeHeight: number;\r\n /** 🆕 是否使用全局默认高度(true: 高度=defaultAltitude, false: 高度=实际计算值) */\r\n useGlobalHeight?: boolean;\r\n }>;\r\n altitudeMode?: string;\r\n /** 航线默认高度(米) */\r\n defaultAltitude?: number;\r\n };\r\n stop: () => void;\r\n /** 获取当前选中顶点的详细信息 */\r\n getSelectedVertex: () => VertexDetailInfo | null;\r\n /** 获取所有顶点的详细信息 */\r\n getAllVertices: () => VertexDetailInfo[];\r\n /** 获取指定索引顶点的详细信息 */\r\n getVertexByIndex: (index: number) => VertexDetailInfo | null;\r\n /** 🆕 启用快速编辑模式 */\r\n enableQuickEdit: (opts?: QuickEditOptions) => void;\r\n /** 🆕 禁用快速编辑模式 */\r\n disableQuickEdit: () => void;\r\n /** 🆕 检查快速编辑模式是否启用 */\r\n isQuickEditEnabled: () => boolean;\r\n /** 🆕 程序化更新指定航点 */\r\n updateWaypoint: (index: number, updates: Partial<WaypointUpdateData>) => boolean;\r\n /** 🆕 更新航点位置 */\r\n updateWaypointPosition: (index: number, position: Cesium.Cartesian3) => boolean;\r\n /** 🆕 更新航点高度 */\r\n updateWaypointAltitude: (index: number, altitude: number) => boolean;\r\n /** 🆕 更新航点偏航角 */\r\n updateWaypointHeading: (index: number, heading: number) => boolean;\r\n /** 🆕 更新航点俯仰角 */\r\n updateWaypointPitch: (index: number, pitch: number) => boolean;\r\n /** 🆕 更新航点视野角 */\r\n updateWaypointFov: (index: number, fov: number) => boolean;\r\n /** 🆕 批量更新航点 */\r\n batchUpdateWaypoints: (updates: WaypointBatchUpdate[]) => boolean;\r\n /** 🆕 程序化选中指定航点(移动飞机游标到该航点) */\r\n selectVertex: (index: number) => boolean;\r\n /** 🆕 模拟按键控制飞机游标(用于虚拟控制器) */\r\n simulateKeyPress: (key: string, duration?: number) => void;\r\n /** 🆕 获取游标当前姿态(包含高度) */\r\n getCursorPose: () => { position: any; heading: number; pitch: number; roll: number; altitude: number } | undefined;\r\n /** 🆕 动态更新爬升高度(安全飞行高度) */\r\n updateClimbHeight: (climbHeight: number) => boolean;\r\n /** 🆕 获取起飞点信息 */\r\n getStartPoint: () => { position: any; latitude: number; longitude: number; altitude: number } | null;\r\n /** 🆕 获取当前高度模式 */\r\n getAltitudeMode: () => AltitudeMode;\r\n /** 🆕 获取当前默认高度 */\r\n getDefaultAltitude: () => number;\r\n /** 🆕 更新默认高度 */\r\n updateDefaultAltitude: (altitude: number) => void;\r\n /** 🆕 切换高度计算模式(异步,会重算所有航点高度) */\r\n changeAltitudeMode: (\r\n newMode: AltitudeMode,\r\n newDefaultAltitude?: number,\r\n options?: {\r\n terrainProvider?: Cesium.TerrainProvider;\r\n onProgress?: (status: 'loading' | 'done' | 'error') => void;\r\n }\r\n ) => Promise<{ success: boolean; error?: string }>;\r\n} | undefined {\r\n const entity =\r\n typeof entityOrId === 'string'\r\n ? (viewer.entities.getById(entityOrId) as any)\r\n : (entityOrId as any);\r\n\r\n if (!entity || !entity.polyline) return undefined;\r\n\r\n const C: any = CesiumNS as any;\r\n // Ensure editing layer\r\n const layer: any = options?.layer ?? ensureLayerForEntity(viewer, entity, CesiumNS);\r\n\r\n // Preview will be created after AirplaneCursor is initialized\r\n let preview: PathPreview | undefined = undefined;\r\n\r\n const headings: number[] = [];\r\n const pitches: number[] = [];\r\n const rolls: number[] = [];\r\n const fovs: number[] = [];\r\n\r\n // Extract current positions\r\n const now = C.JulianDate.now();\r\n const polyPos: any = entity.polyline.positions;\r\n let positions: any[] = [];\r\n try {\r\n positions =\r\n typeof polyPos?.getValue === 'function'\r\n ? polyPos.getValue(now).slice()\r\n : (polyPos?.slice?.() ?? []);\r\n } catch {\r\n positions = [];\r\n }\r\n\r\n // 🆕 不再有隐藏爬升点,所有航点都是可见的\r\n const hiddenClimbIndex: number | undefined = undefined;\r\n\r\n // ========================\r\n // 🆕 高度模式状态管理\r\n // ========================\r\n \r\n // 从实体属性或 options 读取当前高度模式\r\n let currentAltitudeMode: AltitudeMode = 'absolute';\r\n let currentDefaultAltitude: number = 100;\r\n \r\n try {\r\n const props: any = (entity as any).properties;\r\n const storedMode = props?._altitudeMode?.getValue?.() ?? props?._altitudeMode;\r\n if (storedMode === 'absolute' || storedMode === 'relativeToGround' || storedMode === 'relativeToStart') {\r\n currentAltitudeMode = storedMode;\r\n }\r\n const storedDefaultAlt = props?._defaultAltitude?.getValue?.() ?? props?._defaultAltitude;\r\n if (typeof storedDefaultAlt === 'number') {\r\n currentDefaultAltitude = storedDefaultAlt;\r\n }\r\n } catch {}\r\n \r\n // options 中的配置优先级更高\r\n if (options?.altitudeMode) {\r\n currentAltitudeMode = options.altitudeMode;\r\n }\r\n if (options?.defaultAltitude !== undefined) {\r\n currentDefaultAltitude = options.defaultAltitude;\r\n }\r\n \r\n // 缓存起飞点高度(从 positions[0] 计算)\r\n let startPointAltitude: number = 0;\r\n try {\r\n if (positions.length > 0) {\r\n const startCarto = C.Cartographic.fromCartesian(positions[0]);\r\n startPointAltitude = startCarto.height ?? 0;\r\n }\r\n } catch {}\r\n \r\n // 地形高度缓存(懒加载,索引 → 地形高度)\r\n const terrainHeightsCache: Map<number, number> = new Map();\r\n\r\n // 🆕 useGlobalHeight 标志数组(是否使用全局默认高度)\r\n // - true: 高度 = defaultAltitude(新建航点默认值)\r\n // - false: 高度 = 实际计算值(用户拖动修改后)\r\n const useGlobalHeightFlags: boolean[] = [];\r\n \r\n // 从实体属性初始化 useGlobalHeightFlags\r\n try {\r\n const props: any = (entity as any).properties;\r\n const storedFlags = props?._useGlobalHeightFlags?.getValue?.() ?? props?._useGlobalHeightFlags;\r\n if (Array.isArray(storedFlags)) {\r\n storedFlags.forEach((flag: boolean, idx: number) => {\r\n useGlobalHeightFlags[idx] = flag;\r\n });\r\n }\r\n } catch {}\r\n \r\n // 确保数组长度与 positions 一致(默认 false 表示已有航点使用实际高度)\r\n while (useGlobalHeightFlags.length < positions.length) {\r\n useGlobalHeightFlags.push(false);\r\n }\r\n\r\n // 🆕 快速编辑状态\r\n let quickEditEnabled = false;\r\n let quickEditOptions: QuickEditOptions = {\r\n enabled: false,\r\n climbHeight: currentDefaultAltitude, // 使用当前默认高度\r\n altitudeMode: currentAltitudeMode, // 使用当前高度模式\r\n };\r\n\r\n // 初始化快速编辑选项\r\n if (options?.quickEdit) {\r\n if (typeof options.quickEdit === 'boolean') {\r\n quickEditEnabled = options.quickEdit;\r\n quickEditOptions.enabled = options.quickEdit;\r\n } else {\r\n quickEditEnabled = options.quickEdit.enabled ?? false;\r\n quickEditOptions = {\r\n ...quickEditOptions,\r\n ...options.quickEdit,\r\n };\r\n }\r\n }\r\n\r\n // Handles (draggable points)\r\n // Reuse existing persistent vertex handles kept from drawing if any\r\n const ownerId: string | undefined = (entity as any).id;\r\n const allEntities: any[] = (layer.entities as any)._entities?._array ?? [];\r\n const existing: Record<number, any> = {};\r\n try {\r\n for (const e of allEntities) {\r\n try {\r\n const props: any = (e as any).properties;\r\n const t = props?._type?.getValue?.() ?? props?._type;\r\n const oid = props?._ownerId?.getValue?.() ?? props?._ownerId;\r\n const vid = props?._vertexIndex?.getValue?.() ?? props?._vertexIndex;\r\n if (t === 'path-vertex' && oid === ownerId && typeof vid === 'number') {\r\n existing[vid] = e;\r\n }\r\n } catch {}\r\n }\r\n } catch {}\r\n // 🆕 所有航点都创建可见的句柄(不再有起飞点和隐藏爬升点的特殊处理)\r\n const handles: any[] = positions.map((p, i) => {\r\n const h = existing[i];\r\n if (h) {\r\n try {\r\n (h as any).position = p;\r\n (h as any).point = (h as any).point ?? { pixelSize: 6 };\r\n (h as any).point.pixelSize = 6;\r\n (h as any).point.color = C.Color.YELLOW;\r\n (h as any).point.outlineColor = C.Color.BLACK;\r\n (h as any).point.outlineWidth = 1;\r\n (h as any).properties = { _type: 'path-vertex', _ownerId: ownerId, _vertexIndex: i } as any;\r\n } catch {}\r\n return h;\r\n }\r\n\r\n return layer.entities.add({\r\n position: p,\r\n point: { pixelSize: 6, color: C.Color.YELLOW, outlineColor: C.Color.BLACK, outlineWidth: 1 },\r\n properties: { _type: 'path-vertex', _ownerId: ownerId, _vertexIndex: i },\r\n } as any);\r\n });\r\n\r\n // 顶点标签管理器\r\n const vertexLabelManager = new VertexLabelManager(\r\n CesiumNS,\r\n layer,\r\n ownerId ?? '',\r\n hiddenClimbIndex,\r\n );\r\n vertexLabelManager.initializeLabels(positions);\r\n\r\n // 🆕 所有航点都显示高度标记(不再跳过起点)\r\n const heightMarkers: Array<HeightMarker | undefined> = [];\r\n const ensureMarkerLayer = (): any => {\r\n return layer;\r\n };\r\n const createOrUpdateMarkerForIndex = (idx: number) => {\r\n try {\r\n const pos = positions[idx];\r\n if (!pos) return;\r\n const markerLayer = ensureMarkerLayer();\r\n if (!heightMarkers[idx]) {\r\n heightMarkers[idx] = new HeightMarker(CesiumNS as any, viewer, markerLayer);\r\n }\r\n heightMarkers[idx]?.showAt(pos);\r\n } catch {}\r\n };\r\n // Initialize markers for existing vertices\r\n for (let i = 0; i < positions.length; i++) createOrUpdateMarkerForIndex(i);\r\n // Initialize headings (default toward next point or 0)\r\n for (let i = 0; i < positions.length; i++) {\r\n let hd = 0;\r\n if (i < positions.length - 1)\r\n hd = computeHeadingDegFromTo(CesiumNS, positions[i], positions[i + 1]);\r\n // Normalize heading to [-180,180]\r\n if (hd > 180) hd -= 360;\r\n headings[i] = hd;\r\n // Initialize pitch/roll/fov from properties or defaults\r\n try {\r\n const props: any = (entity as any).properties ?? {};\r\n const getArr = (k: string): number[] | undefined => {\r\n const v = props[k]?.getValue?.() ?? props[k];\r\n return Array.isArray(v) ? (v as number[]) : undefined;\r\n };\r\n const pArr = getArr('_vertexPitch');\r\n const rArr = getArr('_vertexRoll');\r\n const fArr = getArr('_vertexFov');\r\n (pitches as any)[i] = typeof pArr?.[i] === 'number' ? pArr[i] : -10;\r\n (rolls as any)[i] = typeof rArr?.[i] === 'number' ? rArr[i] : 0;\r\n (fovs as any)[i] = typeof fArr?.[i] === 'number' ? fArr[i] : 50;\r\n } catch {\r\n (pitches as any)[i] = -10;\r\n (rolls as any)[i] = 0;\r\n (fovs as any)[i] = 50;\r\n }\r\n }\r\n\r\n // Keep polyline dynamic while editing; use PathStateManager for state management\r\n entity.polyline.positions = new C.CallbackProperty(() => positions.slice(), false);\r\n\r\n // 状态管理器\r\n const stateManager = new PathStateManager(entity, positions, headings, pitches, rolls, fovs);\r\n\r\n // Events\r\n let activeIndex: number | undefined; // currently selected vertex index\r\n // Track which vertices have been edited during this session\r\n let editedIndices = new Set<number>();\r\n\r\n // 顶点句柄样式管理器\r\n const handleStyleManager = new VertexHandleStyleManager(CesiumNS);\r\n\r\n /**\r\n * Set the active vertex index and update handle styles accordingly.\r\n * @param idx The index of the vertex to set as active.\r\n */\r\n const setActiveIndex = (idx: number | undefined) => {\r\n // reset previous\r\n if (activeIndex !== undefined && handles[activeIndex]) {\r\n // If previously edited, revert to edited style; else normal\r\n const prevState = handleStyleManager.getHandleState(editedIndices.has(activeIndex), false);\r\n handleStyleManager.applyStyle(handles[activeIndex], prevState);\r\n // 更新上一个顶点的标签(恢复为编辑或普通状态)\r\n const prevLabelState = editedIndices.has(activeIndex) ? 'edited' : 'normal';\r\n vertexLabelManager.updateLabel(activeIndex, positions[activeIndex], prevLabelState);\r\n }\r\n activeIndex = idx;\r\n if (activeIndex !== undefined && handles[activeIndex]) {\r\n handleStyleManager.applyStyle(handles[activeIndex], 'selected');\r\n // 更新当前顶点的标签为选中状态\r\n vertexLabelManager.updateLabel(activeIndex, positions[activeIndex], 'selected');\r\n }\r\n // Update preview pose when selection changes\r\n try {\r\n if (preview && activeIndex !== undefined) {\r\n const pos = positions[activeIndex];\r\n if (pos)\r\n preview.setPose(\r\n pos,\r\n headings[activeIndex] ?? 0,\r\n pitches[activeIndex] ?? -10,\r\n 0,\r\n fovs[activeIndex] ?? 50,\r\n );\r\n }\r\n } catch {}\r\n // 将飞机游标移动到选中点并同步其姿态\r\n try {\r\n if (airplaneCursor && activeIndex !== undefined) {\r\n const pos = positions[activeIndex];\r\n if (pos) {\r\n const hd = headings[activeIndex] ?? 0;\r\n const pt = pitches[activeIndex] ?? -10;\r\n const rl = rolls[activeIndex] ?? 0;\r\n airplaneCursor.setPose(pos, hd, pt, rl);\r\n }\r\n }\r\n } catch {}\r\n };\r\n\r\n /**\r\n * 🆕 计算航线总里程(米)\r\n * 从第一个可见航点累计到最后一个航点的距离\r\n */\r\n const getTotalDistance = (): number => {\r\n if (positions.length < 2) return 0;\r\n // 使用工具函数计算到最后一个航点的距离\r\n return calculatePathDistance(CesiumNS, positions, positions.length - 1, hiddenClimbIndex);\r\n };\r\n\r\n // 顶点插入处理器\r\n const vertexInsertionHandler = new VertexInsertionHandler({\r\n CesiumNS,\r\n layer,\r\n ownerId: ownerId ?? '',\r\n hiddenClimbIndex,\r\n });\r\n\r\n // Initialize airplane cursor at last existing visible point, or use camera position for empty path\r\n let cursorStart = positions[positions.length - 1];\r\n if (!cursorStart) cursorStart = positions[0];\r\n \r\n // 🆕 如果航线为空,使用相机当前位置作为游标起始位置\r\n if (!cursorStart) {\r\n try {\r\n // 获取相机当前位置\r\n const cameraPos = viewer.camera.positionCartographic;\r\n if (cameraPos) {\r\n // 🔧 根据高度模式计算正确的初始高度\r\n let initialHeight = currentDefaultAltitude;\r\n \r\n if (currentAltitudeMode === 'relativeToGround') {\r\n // 相对地形模式:需要查询地形高度\r\n const terrainHeight = queryTerrainHeightSync(\r\n CesiumNS,\r\n viewer,\r\n C.Cartesian3.fromRadians(cameraPos.longitude, cameraPos.latitude, 0)\r\n );\r\n initialHeight = terrainHeight + currentDefaultAltitude;\r\n console.log('[PathEditing] relativeToGround 模式,地形高度:', terrainHeight, '初始高度:', initialHeight);\r\n } else if (currentAltitudeMode === 'relativeToStart') {\r\n // 相对起飞点模式:空航线没有起飞点,退化为 absolute 模式\r\n initialHeight = currentDefaultAltitude;\r\n console.log('[PathEditing] relativeToStart 模式(空航线),使用默认高度:', initialHeight);\r\n }\r\n // absolute 模式:直接使用 defaultAltitude\r\n \r\n cursorStart = C.Cartesian3.fromRadians(\r\n cameraPos.longitude,\r\n cameraPos.latitude,\r\n initialHeight\r\n );\r\n console.log('[PathEditing] 空航线,使用相机位置初始化游标:', {\r\n lon: C.Math.toDegrees(cameraPos.longitude),\r\n lat: C.Math.toDegrees(cameraPos.latitude),\r\n height: initialHeight,\r\n altitudeMode: currentAltitudeMode,\r\n });\r\n }\r\n } catch (error) {\r\n console.warn('[PathEditing] 无法获取相机位置:', error);\r\n }\r\n }\r\n \r\n let airplaneCursor: AirplaneCursor | undefined; // kept in scope for lifecycle & future option updates\r\n\r\n const insertVertex = (\r\n insertAt: number,\r\n p3: any,\r\n poseOrient?: { heading: number; pitch: number; roll: number },\r\n ) => {\r\n console.log('[PathEditing] 插入顶点前 positions 长度:', positions.length, 'insertAt:', insertAt);\r\n \r\n const actualIndex = vertexInsertionHandler.insertVertex(\r\n insertAt,\r\n p3,\r\n positions,\r\n handles,\r\n headings,\r\n pitches,\r\n rolls,\r\n fovs,\r\n editedIndices,\r\n vertexLabelManager,\r\n heightMarkers,\r\n airplaneCursor,\r\n poseOrient,\r\n useGlobalHeightFlags, // 🆕 传递 useGlobalHeightFlags\r\n );\r\n\r\n console.log('[PathEditing] 插入顶点后 positions 长度:', positions.length, 'actualIndex:', actualIndex);\r\n\r\n // 🔧 强制刷新 polyline 以确保 Cesium 检测到变化\r\n // 重新设置 CallbackProperty 来触发更新\r\n entity.polyline.positions = new C.CallbackProperty(() => positions.slice(), false);\r\n\r\n // 设置为选中状态\r\n setActiveIndex(actualIndex);\r\n\r\n // Create marker for the new vertex (skipping rules handled inside)\r\n createOrUpdateMarkerForIndex(actualIndex);\r\n };\r\n\r\n /**\r\n * 删除指定索引的顶点\r\n * @param deleteAt 要删除的顶点索引\r\n */\r\n const deleteVertex = (deleteAt: number) => {\r\n try {\r\n // 🆕 保护:至少保留一个航点\r\n if (positions.length <= 1) {\r\n console.warn('Cannot delete last vertex');\r\n return;\r\n }\r\n\r\n // 移除顶点句柄\r\n if (handles[deleteAt]) {\r\n try {\r\n (layer.entities as any).remove(handles[deleteAt]);\r\n } catch {}\r\n }\r\n\r\n // 移除高度标记\r\n if (heightMarkers[deleteAt]) {\r\n try {\r\n heightMarkers[deleteAt]?.destroy();\r\n } catch {}\r\n }\r\n\r\n // 从数组中删除\r\n console.log('[PathEditing] 删除顶点前 positions 长度:', positions.length, 'deleteAt:', deleteAt);\r\n \r\n positions.splice(deleteAt, 1);\r\n handles.splice(deleteAt, 1);\r\n headings.splice(deleteAt, 1);\r\n pitches.splice(deleteAt, 1);\r\n rolls.splice(deleteAt, 1);\r\n fovs.splice(deleteAt, 1);\r\n heightMarkers.splice(deleteAt, 1);\r\n useGlobalHeightFlags.splice(deleteAt, 1); // 🆕 同步删除 useGlobalHeightFlags\r\n \r\n console.log('[PathEditing] 删除顶点后 positions 长度:', positions.length);\r\n \r\n // 🔧 强制刷新 polyline 以确保 Cesium 检测到变化\r\n entity.polyline.positions = new C.CallbackProperty(() => positions.slice(), false);\r\n\r\n // 更新编辑过的索引集合\r\n const newEditedIndices = new Set<number>();\r\n editedIndices.forEach((idx) => {\r\n if (idx < deleteAt) {\r\n newEditedIndices.add(idx);\r\n } else if (idx > deleteAt) {\r\n newEditedIndices.add(idx - 1);\r\n }\r\n // idx === deleteAt 时不添加(已删除)\r\n });\r\n editedIndices = newEditedIndices;\r\n\r\n // 更新所有顶点句柄的 _vertexIndex 属性\r\n for (let i = 0; i < handles.length; i++) {\r\n if (handles[i]) {\r\n try {\r\n (handles[i] as any).properties = {\r\n _type: 'path-vertex',\r\n _ownerId: ownerId,\r\n _vertexIndex: i,\r\n };\r\n } catch {}\r\n }\r\n }\r\n\r\n // 删除标签并重新创建所有标签以更新序号\r\n vertexLabelManager.removeLabel(deleteAt);\r\n\r\n // 更新活动索引\r\n let newActiveIndex: number | undefined = activeIndex;\r\n if (activeIndex !== undefined) {\r\n if (activeIndex === deleteAt) {\r\n // 删除的是当前选中的点,取消选中\r\n newActiveIndex = undefined;\r\n } else if (activeIndex > deleteAt) {\r\n // 当前选中点在删除点之后,索引需要减1\r\n newActiveIndex = activeIndex - 1;\r\n }\r\n // activeIndex < deleteAt 时,索引不变\r\n }\r\n\r\n // 重新创建所有标签(使用更新后的数据)\r\n vertexLabelManager.recreateAllLabels(positions, editedIndices, newActiveIndex);\r\n\r\n // 更新活动索引和样式\r\n if (newActiveIndex !== activeIndex) {\r\n activeIndex = newActiveIndex; // 直接更新索引而不触发 setActiveIndex\r\n // 手动更新句柄样式\r\n if (newActiveIndex !== undefined && handles[newActiveIndex]) {\r\n handleStyleManager.applyStyle(handles[newActiveIndex], 'selected');\r\n }\r\n }\r\n\r\n // 重新创建所有高度标记\r\n for (let i = 0; i < positions.length; i++) {\r\n createOrUpdateMarkerForIndex(i);\r\n }\r\n } catch (error) {\r\n console.error('Error deleting vertex:', error);\r\n }\r\n };\r\n\r\n try {\r\n if (cursorStart) {\r\n // Step 1: Create AirplaneCursor first (without onPose callback initially)\r\n airplaneCursor = new AirplaneCursor(CesiumNS as any, viewer, cursorStart, {\r\n onPose: undefined, // Will be set later after preview is created\r\n onAddVertex: (pose) => {\r\n // 仍允许通过回调直接插入(若 host 通过 Enter 想立即插入,可在 UI 里决定)\r\n if (pose.insertAt >= 0) {\r\n insertVertex(pose.insertAt, pose.position, {\r\n heading: pose.heading,\r\n pitch: pose.pitch,\r\n roll: pose.roll,\r\n });\r\n }\r\n },\r\n // frustumLengthFactor: options?.preview?.lengthFactor ?? 0.3,\r\n fovDeg: options?.preview?.fov ?? 50,\r\n });\r\n\r\n // Create PathPreview based on AirplaneCursor's initial pose\r\n if (options?.preview?.enabled !== false && airplaneCursor) {\r\n preview = new PathPreview(CesiumNS as any, viewer, {\r\n container: options?.preview?.container,\r\n showFootprint: options?.preview?.showFootprint ?? false,\r\n fov: options?.preview?.fov ?? 50,\r\n pitch: options?.preview?.pitch ?? -10,\r\n roll: options?.preview?.roll ?? 0,\r\n });\r\n\r\n // Set initial preview pose from AirplaneCursor\r\n try {\r\n const initialPose = airplaneCursor.getPose();\r\n console.log('Initial airplane cursor pose for preview:', preview, initialPose);\r\n preview.setPose(\r\n initialPose.position,\r\n initialPose.heading,\r\n initialPose.pitch,\r\n initialPose.roll,\r\n options?.preview?.fov ?? 50,\r\n );\r\n } catch {\r\n console.warn('PathEditing: failed to set initial preview pose');\r\n }\r\n\r\n // Now update AirplaneCursor's onPose callback to sync with preview\r\n airplaneCursor.updateOptions({\r\n onPose: (pose) => {\r\n try {\r\n if (preview) {\r\n preview.setPose(pose.position, pose.heading, pose.pitch, pose.roll, 50);\r\n }\r\n } catch {}\r\n },\r\n });\r\n }\r\n }\r\n } catch {}\r\n\r\n // 事件处理器\r\n // 创建事件处理器\r\n console.log('[PathEditing] 创建事件处理器,回调配置:', {\r\n onVertexSelectDetail: !!options?.onVertexSelectDetail,\r\n });\r\n \r\n const eventHandler = new PathEditingEventHandler(\r\n {\r\n CesiumNS,\r\n viewer,\r\n hiddenClimbIndex,\r\n },\r\n {\r\n onVertexSelect: (index) => setActiveIndex(index),\r\n onVertexSelectDetail: options?.onVertexSelectDetail,\r\n onInsertVertex: (insertAt, position, pose) => {\r\n const totalBefore = positions.length;\r\n insertVertex(insertAt, position, pose);\r\n // 触发插入完成回调\r\n if (options?.onVertexInsertDetail) {\r\n try {\r\n const totalAfter = positions.length;\r\n const newVertex = buildVertexDetailInfo(insertAt);\r\n const operationInfo: VertexOperationInfo = {\r\n type: 'insert',\r\n index: insertAt,\r\n displayNumber: newVertex.displayNumber,\r\n totalVerticesBefore: totalBefore,\r\n totalVerticesAfter: totalAfter,\r\n newVertex,\r\n timestamp: new Date(),\r\n totalDistance: getTotalDistance(), // 🆕 航线总里程\r\n };\r\n options.onVertexInsertDetail(operationInfo);\r\n } catch (error) {\r\n console.error('Error in onVertexInsertDetail:', error);\r\n }\r\n }\r\n },\r\n onDeleteVertex: (index) => {\r\n const totalBefore = positions.length;\r\n const displayNumber = index; // 🆕 直接使用索引作为显示编号\r\n deleteVertex(index);\r\n // 触发删除完成回调\r\n if (options?.onVertexDeleteDetail) {\r\n try {\r\n const totalAfter = positions.length;\r\n const operationInfo: VertexOperationInfo = {\r\n type: 'delete',\r\n index,\r\n displayNumber,\r\n totalVerticesBefore: totalBefore,\r\n totalVerticesAfter: totalAfter,\r\n timestamp: new Date(),\r\n totalDistance: getTotalDistance(), // 🆕 航线总里程\r\n };\r\n options.onVertexDeleteDetail(operationInfo);\r\n } catch (error) {\r\n console.error('Error in onVertexDeleteDetail:', error);\r\n }\r\n }\r\n },\r\n onVertexDragStart: (index) => {\r\n // 拖动开始时,顶点已经在 PathEditingEventHandler 中被选中\r\n // 这里不需要再次调用 setActiveIndex,避免标签重建导致闪烁\r\n \r\n // 将高度标记切换到动态模式,以实现流畅跟随\r\n try {\r\n if (heightMarkers[index]) {\r\n heightMarkers[index]?.showAtDynamic(() => positions[index]);\r\n }\r\n } catch {}\r\n },\r\n onVertexDragMove: (index, newPosition) => {\r\n // 实时更新位置数组\r\n positions[index] = newPosition;\r\n\r\n // 更新顶点句柄位置\r\n if (handles[index]) {\r\n try {\r\n (handles[index] as any).position = newPosition;\r\n } catch {}\r\n }\r\n\r\n // 仅更新标签位置(不重建,保持流畅)\r\n try {\r\n vertexLabelManager.updateLabelPosition(index, newPosition);\r\n } catch {}\r\n\r\n // 不需要更新高度标记,因为已经在动态模式下自动跟随\r\n \r\n // 🆕 触发实时拖动回调(用于 UI 实时同步)\r\n if (options?.onVertexDragMoveDetail) {\r\n try {\r\n // 转换为经纬度高度\r\n let coordinates = { longitude: 0, latitude: 0, height: 0 };\r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(newPosition);\r\n coordinates = {\r\n longitude: C.Math.toDegrees(cartographic.longitude),\r\n latitude: C.Math.toDegrees(cartographic.latitude),\r\n height: cartographic.height,\r\n };\r\n } catch {}\r\n \r\n // 🆕 显示编号 = 索引\r\n const displayNumber = index;\r\n \r\n const dragMoveInfo: VertexDragMoveInfo = {\r\n index,\r\n displayNumber,\r\n position: newPosition,\r\n coordinates,\r\n timestamp: new Date(),\r\n };\r\n options.onVertexDragMoveDetail(dragMoveInfo);\r\n } catch (error) {\r\n console.error('Error in onVertexDragMoveDetail:', error);\r\n }\r\n }\r\n },\r\n onVertexDragEnd: (index, finalPosition) => {\r\n // 标记为已编辑\r\n editedIndices.add(index);\r\n\r\n // 更新最终位置\r\n positions[index] = finalPosition;\r\n \r\n // 🆕 用户拖动修改后,设置 useGlobalHeight = false\r\n useGlobalHeightFlags[index] = false;\r\n\r\n // 更新句柄样式为编辑状态\r\n if (handles[index]) {\r\n handleStyleManager.applyStyle(handles[index], 'edited');\r\n }\r\n\r\n // 更新标签状态:如果是当前选中的顶点,保持选中状态(蓝色),否则显示为编辑状态(紫色)\r\n try {\r\n const labelState = activeIndex === index ? 'selected' : 'edited';\r\n vertexLabelManager.updateLabel(index, finalPosition, labelState);\r\n } catch {}\r\n\r\n // 将高度标记切换回静态模式(使用最终位置)\r\n try {\r\n createOrUpdateMarkerForIndex(index);\r\n } catch {}\r\n\r\n // 触发拖动完成详细信息回调\r\n if (options?.onVertexDragCompleteDetail) {\r\n try {\r\n const vertexInfo = buildVertexDetailInfo(index);\r\n const operationInfo: VertexOperationInfo = {\r\n type: 'move',\r\n index,\r\n displayNumber: vertexInfo.displayNumber,\r\n totalVerticesBefore: positions.length,\r\n totalVerticesAfter: positions.length,\r\n newVertex: vertexInfo,\r\n newPosition: finalPosition,\r\n timestamp: new Date(),\r\n totalDistance: getTotalDistance(), // 🆕 航线总里程\r\n };\r\n options.onVertexDragCompleteDetail(operationInfo);\r\n } catch (error) {\r\n console.error('Error in onVertexDragCompleteDetail:', error);\r\n }\r\n }\r\n },\r\n getActiveIndex: () => activeIndex,\r\n getPositions: () => positions,\r\n getAirplaneCursor: () => airplaneCursor,\r\n getPoseData: () => ({ headings, pitches, rolls, fovs }),\r\n getEntity: () => entity,\r\n /** 模拟按键控制飞机游标(用于虚拟控制器) */\r\n simulateKeyPress: (key: string, duration?: number) => {\r\n airplaneCursor?.simulateKeyPress(key, duration);\r\n },\r\n /** 获取游标当前姿态(包含高度) */\r\n getCursorPose: () => airplaneCursor?.getPose(),\r\n // 🆕 快速编辑回调\r\n getQuickEditEnabled: () => quickEditEnabled,\r\n getQuickEditOptions: () => {\r\n // 从实体属性获取 climbHeight\r\n let climbHeight = 0;\r\n try {\r\n const props: any = (entity as any).properties;\r\n climbHeight = props?._climbHeight?.getValue?.() ?? props?._climbHeight ?? 0;\r\n } catch {}\r\n \r\n return {\r\n climbHeight,\r\n defaultAltitude: currentDefaultAltitude,\r\n altitudeMode: currentAltitudeMode,\r\n };\r\n },\r\n // 🆕 高度模式相关回调\r\n getStartPointAltitude: () => startPointAltitude,\r\n getDefaultAltitude: () => currentDefaultAltitude,\r\n // 🆕 useGlobalHeightFlags 相关回调\r\n getUseGlobalHeightFlags: () => useGlobalHeightFlags,\r\n setUseGlobalHeightFlag: (index: number, value: boolean) => {\r\n if (index >= 0 && index < useGlobalHeightFlags.length) {\r\n useGlobalHeightFlags[index] = value;\r\n }\r\n },\r\n },\r\n );\r\n\r\n // Remove default Cesium right-click finishing behavior: no handler set for RIGHT_CLICK now.\r\n\r\n const cleanupSession = () => {\r\n setActiveIndex(undefined);\r\n try {\r\n // preview?.destroy();\r\n } catch {}\r\n // 🔧 清理顶点句柄(handles)\r\n try {\r\n handles.forEach((handle) => {\r\n if (handle) {\r\n try {\r\n layer.entities.remove(handle);\r\n } catch {}\r\n }\r\n });\r\n handles.length = 0; // 清空数组\r\n } catch {}\r\n // Destroy height markers\r\n try {\r\n heightMarkers.forEach((m) => m?.destroy());\r\n } catch {}\r\n // Destroy vertex labels\r\n try {\r\n vertexLabelManager.destroy();\r\n } catch {}\r\n // Destroy event handler (includes context menu)\r\n try {\r\n eventHandler.destroy();\r\n } catch {}\r\n // 无需销毁单独 frustum\r\n try {\r\n // touch airplaneCursor so TS sees it used even if no callbacks triggered yet\r\n if (airplaneCursor) {\r\n // potential place for flushing any pending pose -> vertex sync in future\r\n airplaneCursor.updateOptions({});\r\n airplaneCursor.destroy();\r\n }\r\n } catch {}\r\n };\r\n\r\n // 辅助函数:构建顶点详细信息\r\n const buildVertexDetailInfo = (index: number): VertexDetailInfo => {\r\n const position = positions[index];\r\n \r\n // 转换为经纬度高度\r\n let coordinates = { longitude: 0, latitude: 0, height: 0 };\r\n let ellipsoidHeight = 0;\r\n try {\r\n const cartographic = C.Cartographic.fromCartesian(position);\r\n coordinates = {\r\n longitude: C.Math.toDegrees(cartographic.longitude),\r\n latitude: C.Math.toDegrees(cartographic.latitude),\r\n height: cartographic.height,\r\n };\r\n ellipsoidHeight = cartographic.height ?? 0;\r\n } catch {}\r\n \r\n // 🆕 计算相对高度(根据 altitudeMode)\r\n const terrainHeight = terrainHeightsCache.get(index) ?? 0;\r\n const relativeHeight = calculateRelativeHeight(\r\n currentAltitudeMode,\r\n ellipsoidHeight,\r\n startPointAltitude,\r\n terrainHeight,\r\n );\r\n \r\n // 姿态信息\r\n const pose = {\r\n heading: headings[index] ?? 0,\r\n pitch: pitches[index] ?? 0,\r\n roll: rolls[index] ?? 0,\r\n fov: fovs[index] ?? 50,\r\n };\r\n \r\n // 🆕 所有航点都是可见的\r\n const totalVertices = positions.length;\r\n const totalVisibleVertices = totalVertices;\r\n \r\n // 🆕 不再有起点和隐藏爬升点的概念\r\n const isStartPoint = false;\r\n const isHiddenClimb = false;\r\n \r\n // 🆕 任意航点可删除,仅保护最后一个航点\r\n const canDelete = totalVertices > 1;\r\n \r\n // 🆕 显示编号 = 索引\r\n const displayNumber = index;\r\n \r\n // 提取路径属性\r\n let pathProperties: VertexDetailInfo['pathProperties'] | undefined;\r\n try {\r\n const props: any = (entity as any).properties;\r\n pathProperties = {\r\n altitudeMode: props?._altitudeMode?.getValue?.() ?? props?._altitudeMode,\r\n climbHeight: props?._climbHeight?.getValue?.() ?? props?._climbHeight,\r\n };\r\n } catch {}\r\n \r\n return {\r\n index,\r\n displayNumber,\r\n position,\r\n coordinates,\r\n pose,\r\n isStartPoint,\r\n isHiddenClimb,\r\n canDelete,\r\n totalVisibleVertices,\r\n totalVertices,\r\n entity,\r\n pathProperties,\r\n useGlobalHeight: useGlobalHeightFlags[index] ?? false, // 🆕 添加 useGlobalHeight\r\n ellipsoidHeight, // 🆕 添加椭球高度\r\n relativeHeight, // 🆕 添加相对高度\r\n };\r\n };\r\n\r\n return {\r\n /** 保存并退出编辑模式 */\r\n saveAndStop: () => {\r\n // 保存到实体(包括高度模式和默认高度)\r\n stateManager.persistToEntity(positions, headings, pitches, rolls, fovs);\r\n \r\n // 同时保存高度模式相关属性到实体\r\n try {\r\n (entity as any).properties._altitudeMode = currentAltitudeMode;\r\n (entity as any).properties._defaultAltitude = currentDefaultAltitude;\r\n (entity as any).properties._useGlobalHeightFlags = useGlobalHeightFlags.slice(); // 🆕 保存 useGlobalHeightFlags\r\n } catch {}\r\n\r\n // 提取实体的额外属性\r\n let altitudeMode: string | undefined = currentAltitudeMode;\r\n let climbHeight: number | undefined;\r\n\r\n try {\r\n const props: any = (entity as any).properties;\r\n climbHeight = props?._climbHeight?.getValue?.() ?? props?._climbHeight;\r\n } catch {}\r\n\r\n // 🆕 waypointData 从 index 0 开始(所有航点)\r\n const waypointData = positions.map((position, index) => {\r\n // 计算椭球高度(WGS84)\r\n let ellipsoidHeight = 0;\r\n try {\r\n const carto = C.Cartographic.fromCartesian(position);\r\n ellipsoidHeight = carto.height ?? 0;\r\n } catch {}\r\n\r\n // 获取地形高度(如果已缓存)\r\n const terrainHeight = terrainHeightsCache.get(index) ?? 0;\r\n\r\n // 计算相对高度(根据 altitudeMode)\r\n // - absolute: relativeHeight = 椭球高度(近似海拔)\r\n // - relativeToGround: relativeHeight = 椭球高度 - 地形高度\r\n // - relativeToStart: relativeHeight = 椭球高度 - 起飞点高度\r\n const relativeHeight = calculateRelativeHeight(\r\n currentAltitudeMode,\r\n ellipsoidHeight,\r\n startPointAltitude,\r\n terrainHeight,\r\n );\r\n\r\n return {\r\n position,\r\n heading: headings[index] ?? 0,\r\n pitch: pitches[index] ?? -10,\r\n roll: rolls[index] ?? 0,\r\n fov: fovs[index] ?? 50,\r\n index,\r\n distance: calculatePathDistance(CesiumNS, positions, index, hiddenClimbIndex),\r\n ellipsoidHeight,\r\n relativeHeight,\r\n useGlobalHeight: useGlobalHeightFlags[index] ?? false, // 🆕 添加 useGlobalHeight\r\n };\r\n });\r\n\r\n // 清理编辑会话\r\n cleanupSession();\r\n\r\n // 返回完整数据\r\n return {\r\n entity,\r\n positions: positions.slice(),\r\n climbHeight,\r\n waypointData,\r\n altitudeMode,\r\n defaultAltitude: currentDefaultAltitude,\r\n };\r\n },\r\n /** 不保存退出(回滚到进入编辑时的状态) */\r\n stop: () => {\r\n stateManager.revertToOriginal(\r\n positions,\r\n headings,\r\n pitches,\r\n rolls,\r\n fovs,\r\n handles,\r\n heightMarkers,\r\n createOrUpdateMarkerForIndex,\r\n );\r\n cleanupSession();\r\n },\r\n /** 获取当前选中顶点的详细信息 */\r\n getSelectedVertex: () => {\r\n if (activeIndex === undefined) return null;\r\n try {\r\n return buildVertexDetailInfo(activeIndex);\r\n } catch (error) {\r\n console.error('Error getting selected vertex:', error);\r\n return null;\r\n }\r\n },\r\n /** 获取所有顶点的详细信息 */\r\n getAllVertices: () => {\r\n try {\r\n return positions.map((_, index) => buildVertexDetailInfo(index));\r\n } catch (error) {\r\n console.error('Error getting all vertices:', error);\r\n return [];\r\n }\r\n },\r\n /** 获取指定索引顶点的详细信息 */\r\n getVertexByIndex: (index: number) => {\r\n if (index < 0 || index >= positions.length) return null;\r\n try {\r\n return buildVertexDetailInfo(index);\r\n } catch (error) {\r\n console.error('Error getting vertex by index:', error);\r\n return null;\r\n }\r\n },\r\n /** 🆕 启用快速编辑模式 */\r\n enableQuickEdit: (opts?: QuickEditOptions) => {\r\n quickEditEnabled = true;\r\n if (opts) {\r\n quickEditOptions = {\r\n ...quickEditOptions,\r\n ...opts,\r\n enabled: true,\r\n };\r\n }\r\n console.log('[QuickEdit] ✅ 快速编辑模式已启用');\r\n console.log('[QuickEdit] 💡 左键点击地图添加飞航点');\r\n console.log('[QuickEdit] 配置:', quickEditOptions);\r\n },\r\n /** 🆕 禁用快速编辑模式 */\r\n disableQuickEdit: () => {\r\n quickEditEnabled = false;\r\n quickEditOptions.enabled = false;\r\n console.log('[QuickEdit] ❌ 快速编辑模式已禁用');\r\n },\r\n /** 🆕 检查快速编辑模式是否启用 */\r\n isQuickEditEnabled: () => {\r\n return quickEditEnabled;\r\n },\r\n \r\n // ========================\r\n // 🆕 程序化更新方法\r\n // ========================\r\n \r\n /**\r\n * 🆕 程序化更新指定航点\r\n * @param index 航点索引\r\n * @param updates 需要更新的字段\r\n * @returns 是否更新成功\r\n */\r\n updateWaypoint: (index: number, updates: Partial<WaypointUpdateData>): boolean => {\r\n if (index < 0 || index >= positions.length) {\r\n console.warn(`[updateWaypoint] Invalid index: ${index}, valid range: 0-${positions.length - 1}`);\r\n return false;\r\n }\r\n \r\n try {\r\n let positionUpdated = false;\r\n \r\n // 更新位置(完整 Cartesian3)\r\n if (updates.position) {\r\n positions[index] = updates.position;\r\n positionUpdated = true;\r\n }\r\n \r\n // 更新高度(便捷方法,仅改变高度保持经纬度)\r\n if (updates.altitude !== undefined && !updates.position) {\r\n const currentPos = positions[index];\r\n const cartographic = C.Cartographic.fromCartesian(currentPos);\r\n const newPos = C.Cartesian3.fromRadians(\r\n cartographic.longitude,\r\n cartographic.latitude,\r\n updates.altitude\r\n );\r\n positions[index] = newPos;\r\n positionUpdated = true;\r\n }\r\n \r\n // 如果位置更新了,同步更新相关视觉元素\r\n if (positionUpdated) {\r\n const newPos = positions[index];\r\n \r\n // 更新顶点句柄位置\r\n if (handles[index]) {\r\n try {\r\n (handles[index] as any).position = newPos;\r\n } catch {}\r\n }\r\n \r\n // 更新标签位置\r\n try {\r\n vertexLabelManager.updateLabelPosition(index, newPos);\r\n } catch {}\r\n \r\n // 更新高度标记\r\n try {\r\n createOrUpdateMarkerForIndex(index);\r\n } catch {}\r\n }\r\n \r\n // 更新姿态参数\r\n if (updates.heading !== undefined) headings[index] = updates.heading;\r\n if (updates.pitch !== undefined) pitches[index] = updates.pitch;\r\n if (updates.roll !== undefined) rolls[index] = updates.roll;\r\n if (updates.fov !== undefined) {\r\n fovs[index] = updates.fov;\r\n \r\n // 🆕 如果是当前选中航点,广播 FOV 变化事件到全局事件总线\r\n if (index === activeIndex) {\r\n globalCameraEventBus.onFOVChange.emit({\r\n fov: updates.fov,\r\n focalLength: fovToFocalLength(updates.fov),\r\n source: 'user',\r\n });\r\n }\r\n }\r\n \r\n // 如果是当前选中的航点,更新 AirplaneCursor\r\n if (index === activeIndex && airplaneCursor) {\r\n try {\r\n airplaneCursor.setPose(\r\n positions[index],\r\n headings[index] ?? 0,\r\n pitches[index] ?? -10,\r\n rolls[index] ?? 0,\r\n );\r\n } catch {}\r\n }\r\n \r\n // 持久化到实体\r\n stateManager.persistToEntity(positions, headings, pitches, rolls, fovs);\r\n \r\n return true;\r\n } catch (error) {\r\n console.error('[updateWaypoint] Error:', error);\r\n return false;\r\n }\r\n },\r\n \r\n /**\r\n * 🆕 更新航点位置\r\n */\r\n updateWaypointPosition: function(index: number, position: Cesium.Cartesian3): boolean {\r\n return this.updateWaypoint(index, { position });\r\n },\r\n \r\n /**\r\n * 🆕 更新航点高度(仅垂直方向,保持经纬度不变)\r\n */\r\n updateWaypointAltitude: function(index: number, altitude: number): boolean {\r\n return this.updateWaypoint(index, { altitude });\r\n },\r\n \r\n /**\r\n * 🆕 更新航点偏航角\r\n */\r\n updateWaypointHeading: function(index: number, heading: number): boolean {\r\n return this.updateWaypoint(index, { heading });\r\n },\r\n \r\n /**\r\n * 🆕 更新航点俯仰角\r\n */\r\n updateWaypointPitch: function(index: number, pitch: number): boolean {\r\n return this.updateWaypoint(index, { pitch });\r\n },\r\n \r\n /**\r\n * 🆕 更新航点视野角\r\n */\r\n updateWaypointFov: function(index: number, fov: number): boolean {\r\n return this.updateWaypoint(index, { fov });\r\n },\r\n \r\n /**\r\n * 🆕 批量更新多个航点\r\n */\r\n batchUpdateWaypoints: function(updates: WaypointBatchUpdate[]): boolean {\r\n let allSuccess = true;\r\n for (const { index, data } of updates) {\r\n if (!this.updateWaypoint(index, data)) {\r\n allSuccess = false;\r\n }\r\n }\r\n return allSuccess;\r\n },\r\n \r\n /**\r\n * 🆕 程序化选中指定航点\r\n * 将飞机游标移动到指定航点位置,更新选中状态\r\n * @param index 航点索引\r\n * @returns 是否选中成功\r\n */\r\n selectVertex: (index: number): boolean => {\r\n if (index < 0 || index >= positions.length) {\r\n console.warn(`[selectVertex] Invalid index: ${index}, valid range: 0-${positions.length - 1}`);\r\n return false;\r\n }\r\n \r\n try {\r\n setActiveIndex(index);\r\n return true;\r\n } catch (e) {\r\n console.error('[selectVertex] Failed to select vertex:', e);\r\n return false;\r\n }\r\n },\r\n \r\n /**\r\n * 🆕 模拟按键控制飞机游标(用于虚拟控制器)\r\n * @param key 按键名称 (w/a/s/d/q/e/c/z)\r\n * @param duration 按键持续时间(毫秒)\r\n */\r\n simulateKeyPress: (key: string, duration?: number) => {\r\n airplaneCursor?.simulateKeyPress(key, duration);\r\n },\r\n \r\n /**\r\n * 🆕 获取游标当前姿态(包含高度)\r\n */\r\n getCursorPose: () => airplaneCursor?.getPose(),\r\n \r\n /**\r\n * 🆕 更新爬升高度(climbHeight)\r\n * 更新实体属性中的 _climbHeight 值\r\n * @param newClimbHeight 新的爬升高度(米)\r\n * @returns 是否更新成功\r\n */\r\n updateClimbHeight: function(newClimbHeight: number): boolean {\r\n try {\r\n (entity as any).properties._climbHeight = newClimbHeight;\r\n console.log('[updateClimbHeight] ✅ 爬升高度已更新:', newClimbHeight, '米');\r\n return true;\r\n } catch (error) {\r\n console.error('[updateClimbHeight] Error:', error);\r\n return false;\r\n }\r\n },\r\n \r\n /**\r\n * 🆕 获取第一个航点信息\r\n * @returns 第一个航点的经纬度和高度\r\n */\r\n getStartPoint: () => {\r\n if (positions.length < 1) return null;\r\n try {\r\n const firstPos = positions[0];\r\n const carto = C.Cartographic.fromCartesian(firstPos);\r\n return {\r\n position: firstPos,\r\n latitude: C.Math.toDegrees(carto.latitude),\r\n longitude: C.Math.toDegrees(carto.longitude),\r\n altitude: carto.height,\r\n };\r\n } catch {\r\n return null;\r\n }\r\n },\r\n \r\n /**\r\n * 🆕 获取当前高度模式\r\n */\r\n getAltitudeMode: () => currentAltitudeMode,\r\n \r\n /**\r\n * 🆕 获取当前默认高度\r\n */\r\n getDefaultAltitude: () => currentDefaultAltitude,\r\n \r\n /**\r\n * 🆕 更新默认高度\r\n */\r\n updateDefaultAltitude: (altitude: number) => {\r\n currentDefaultAltitude = altitude;\r\n // 同步更新快速编辑选项\r\n quickEditOptions.climbHeight = altitude;\r\n // 更新实体属性\r\n try {\r\n (entity as any).properties._defaultAltitude = altitude;\r\n } catch {}\r\n console.log('[updateDefaultAltitude] ✅ 默认高度已更新:', altitude, '米');\r\n },\r\n \r\n /**\r\n * 🆕 切换高度计算模式(异步,会重算所有航点高度)\r\n * @param newMode 新的高度模式\r\n * @param newDefaultAltitude 新的默认高度(可选)\r\n * @param options 选项(terrainProvider, onProgress)\r\n * @returns 切换结果 { success: boolean; error?: string }\r\n */\r\n changeAltitudeMode: async (\r\n newMode: AltitudeMode,\r\n newDefaultAltitude?: number,\r\n options?: {\r\n terrainProvider?: Cesium.TerrainProvider;\r\n onProgress?: (status: 'loading' | 'done' | 'error') => void;\r\n }\r\n ): Promise<{ success: boolean; error?: string }> => {\r\n try {\r\n const onProgress = options?.onProgress;\r\n \r\n // 🆕 如果切换到 relativeToGround 模式,校验 terrain 图层\r\n if (newMode === 'relativeToGround') {\r\n const terrainProvider = options?.terrainProvider ?? viewer.terrainProvider;\r\n const C_any = C as any;\r\n \r\n // 检查是否有有效的地形提供者(不是 EllipsoidTerrainProvider)\r\n if (!terrainProvider || \r\n (C_any.EllipsoidTerrainProvider && terrainProvider instanceof C_any.EllipsoidTerrainProvider)) {\r\n console.error('[changeAltitudeMode] ❌ relativeToGround 模式需要有效的 terrain 图层');\r\n onProgress?.('error');\r\n return { \r\n success: false, \r\n error: 'Terrain provider required for relativeToGround mode' \r\n };\r\n }\r\n }\r\n \r\n // 开始加载\r\n onProgress?.('loading');\r\n \r\n const oldMode = currentAltitudeMode;\r\n \r\n // 更新默认高度(如果提供)\r\n if (newDefaultAltitude !== undefined) {\r\n currentDefaultAltitude = newDefaultAltitude;\r\n quickEditOptions.climbHeight = newDefaultAltitude;\r\n }\r\n \r\n // 🔧 如果涉及 relativeToGround 模式(无论是切换到还是从该模式切换出),都需要查询地形高度\r\n // - 切换到 relativeToGround:需要地形高度来计算新的绝对高度\r\n // - 从 relativeToGround 切换出:需要地形高度来计算当前的相对高度\r\n if (newMode === 'relativeToGround' || oldMode === 'relativeToGround') {\r\n const terrainHeights = await queryTerrainHeights(CesiumNS, viewer, positions);\r\n terrainHeights.forEach((height, index) => {\r\n terrainHeightsCache.set(index, height);\r\n });\r\n console.log('[changeAltitudeMode] 已查询地形高度:', terrainHeights);\r\n }\r\n \r\n // 如果模式发生变化,需要重算所有航点高度\r\n if (newMode !== oldMode) {\r\n console.log('[changeAltitudeMode] 切换高度模式:', oldMode, '->', newMode);\r\n \r\n // 🆕 遍历所有航点(从 index 0 开始)\r\n for (let i = 0; i < positions.length; i++) {\r\n const currentPos = positions[i];\r\n const carto = C.Cartographic.fromCartesian(currentPos);\r\n const currentAbsoluteHeight = carto.height ?? 0;\r\n \r\n // 计算当前模式下的相对高度\r\n const oldTerrainHeight = terrainHeightsCache.get(i) ?? 0;\r\n const relativeHeight = calculateRelativeHeight(\r\n oldMode,\r\n currentAbsoluteHeight,\r\n startPointAltitude,\r\n oldTerrainHeight\r\n );\r\n \r\n // 根据新模式计算新的绝对高度\r\n const newTerrainHeight = terrainHeightsCache.get(i) ?? 0;\r\n const newAbsoluteHeight = calculateAbsoluteHeight(\r\n newMode,\r\n relativeHeight,\r\n startPointAltitude,\r\n newTerrainHeight\r\n );\r\n \r\n // 更新航点位置(保持经纬度,更新高度)\r\n const newPosition = C.Cartesian3.fromRadians(\r\n carto.longitude,\r\n carto.latitude,\r\n newAbsoluteHeight\r\n );\r\n positions[i] = newPosition;\r\n \r\n // 更新顶点句柄位置\r\n if (handles[i]) {\r\n try {\r\n (handles[i] as any).position = newPosition;\r\n } catch {}\r\n }\r\n \r\n // 更新标签位置\r\n try {\r\n vertexLabelManager.updateLabelPosition(i, newPosition);\r\n } catch {}\r\n \r\n // 更新高度标记\r\n try {\r\n createOrUpdateMarkerForIndex(i);\r\n } catch {}\r\n }\r\n \r\n // 更新当前模式\r\n currentAltitudeMode = newMode;\r\n quickEditOptions.altitudeMode = newMode;\r\n \r\n // 更新实体属性\r\n try {\r\n (entity as any).properties._altitudeMode = newMode;\r\n (entity as any).properties._defaultAltitude = currentDefaultAltitude;\r\n } catch {}\r\n \r\n // 强制刷新 polyline\r\n entity.polyline.positions = new C.CallbackProperty(() => positions.slice(), false);\r\n }\r\n \r\n console.log('[changeAltitudeMode] ✅ 高度模式切换完成:', {\r\n mode: newMode,\r\n defaultAltitude: currentDefaultAltitude,\r\n });\r\n \r\n // 完成\r\n onProgress?.('done');\r\n return { success: true };\r\n } catch (error) {\r\n console.error('[changeAltitudeMode] Error:', error);\r\n options?.onProgress?.('error');\r\n return { success: false, error: String(error) };\r\n }\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * FOV 转等效焦距(基于传感器宽度 36mm,与 CameraFOVController 一致)\r\n * @param fovDeg 视场角(度)\r\n * @returns 等效焦距(mm)\r\n */\r\nfunction fovToFocalLength(fovDeg: number): number {\r\n const sensorWidth = 36; // 与 CameraFOVController 保持一致\r\n const fovRad = (fovDeg * Math.PI) / 180;\r\n return sensorWidth / (2 * Math.tan(fovRad / 2));\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { startPathEditing as startPathEditingImpl } from './pathEditing';\r\nimport type { AltitudeMode } from './pathEditing';\r\nimport type { VertexDetailInfo } from './editing/VertexDetailInfo';\r\n\r\nexport function startPathDrawing(\r\n CesiumNS: typeof Cesium,\r\n viewer: Cesium.Viewer,\r\n options?: {\r\n layer?: Cesium.CustomDataSource;\r\n idPrefix?: string;\r\n /**\r\n * 默认用于相对高度模式的高度偏移(例如相对地形时的离地高度)\r\n * 对于 absolute 模式不强制添加该偏移(保持点击的原始海拔),保持向后兼容可选。\r\n * @deprecated 请使用 defaultAltitude 代替\r\n */\r\n defaultHeight?: number;\r\n /** 🆕 航线默认高度(米),默认 100,新增航点时使用此高度值 */\r\n defaultAltitude?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n /** 航点高度模式 (海拔高度 / 相对起飞点 / 相对地形) */\r\n altitudeMode?: AltitudeMode;\r\n /** 爬升高度(基础高度偏移,与 defaultAltitude 一起叠加到点击位置) */\r\n climbHeight?: number;\r\n /** 创建第一个航点后是否自动进入编辑模式 (可传 true 或提供 { preview: {...} } ) */\r\n autoStartEditing?:\r\n | boolean\r\n | {\r\n preview?: {\r\n enabled?: boolean;\r\n showFootprint?: boolean;\r\n fov?: number;\r\n pitch?: number;\r\n roll?: number;\r\n lengthFactor?: number;\r\n container?: HTMLElement;\r\n };\r\n };\r\n /** 当自动进入编辑模式后,通过此回调获取编辑会话 */\r\n onEditingStarted?: (editSession: {\r\n saveAndStop: () => {\r\n entity: any;\r\n positions: any[];\r\n climbHeight?: number;\r\n waypointData: Array<{\r\n position: any;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n fov: number;\r\n index: number;\r\n distance: number;\r\n /** 椭球高度(WGS84 椭球面以上的高度) */\r\n ellipsoidHeight: number;\r\n /** 相对高度(根据 altitudeMode 计算:海拔高度或相对地形高度) */\r\n relativeHeight: number;\r\n /** 🆕 是否使用全局默认高度 */\r\n useGlobalHeight?: boolean;\r\n }>;\r\n altitudeMode?: string;\r\n defaultAltitude?: number;\r\n };\r\n stop: () => void;\r\n }) => void;\r\n /** 🎯 当用户选中顶点时触发,返回完整的顶点详细信息 */\r\n onVertexSelectDetail?: (info: VertexDetailInfo) => void;\r\n },\r\n onComplete?: (entity: Cesium.Entity) => void,\r\n): { stop: () => void } {\r\n const C: any = CesiumNS as any;\r\n const layer: any = options?.layer ?? new C.CustomDataSource('Paths');\r\n if (!options?.layer) viewer.dataSources.add(layer);\r\n const altitudeMode: AltitudeMode = options?.altitudeMode ?? 'absolute';\r\n const climbHeight = Number(options?.climbHeight) || 0;\r\n // 🆕 默认高度优先使用 defaultAltitude,兼容旧的 defaultHeight\r\n const defaultAltitude = options?.defaultAltitude ?? options?.defaultHeight ?? 100;\r\n\r\n // Styling constants\r\n const DEFAULT_MAIN_WIDTH = options?.width ?? 3;\r\n\r\n // 🔧 创建的航线 entity(用于 stop 时清理)\r\n let createdEntity: any = undefined;\r\n // 是否已创建航线实体\r\n let entityCreated = false;\r\n // 编辑会话引用\r\n let editSession: ReturnType<typeof startPathEditingImpl> | undefined = undefined;\r\n\r\n /**\r\n * try to get a Cartesian3 from mouse event\r\n * @param movement - Cesium.ScreenSpaceEventHandler.PositionedEvent | Cesium.ScreenSpaceEventHandler.MotionEvent | Cesium.Cartesian2\r\n * @returns\r\n */\r\n const getPositionFromMouse = (movement: any): any | undefined => {\r\n const scene: any = (viewer as any).scene;\r\n const winPos = movement?.position ?? movement?.endPosition ?? movement;\r\n if (!winPos) return undefined;\r\n let cart: any | undefined;\r\n try {\r\n cart = scene.pickPosition?.(winPos);\r\n } catch {}\r\n if (!cart) {\r\n const ray = (viewer.camera as any).getPickRay?.(winPos);\r\n cart = ray ? scene.globe?.pick?.(ray, scene) : undefined;\r\n }\r\n return cart;\r\n };\r\n\r\n // State\r\n let handler: any;\r\n\r\n handler = new C.ScreenSpaceEventHandler((viewer.scene as any).canvas);\r\n\r\n // 🆕 Left click: 创建空航线实体并立即进入编辑模式(不再在这里创建第一个航点)\r\n // 所有航点的添加都由编辑模式(快速编辑)处理\r\n handler.setInputAction((movement: any) => {\r\n const picked = getPositionFromMouse(movement);\r\n if (!picked) return;\r\n\r\n // 如果航线实体尚未创建,创建空航线并进入编辑模式\r\n if (!entityCreated) {\r\n entityCreated = true;\r\n \r\n let created: any;\r\n try {\r\n const id = `${options?.idPrefix ?? 'path'}-${Date.now().toString(36)}`;\r\n\r\n // 🆕 创建空的 positions 数组(航点由编辑模式添加)\r\n const positions: any[] = [];\r\n\r\n // 使用 CallbackProperty 包装 positions\r\n const pathPositions = new C.CallbackProperty(() => positions.slice(), false);\r\n\r\n created = layer.entities.add({\r\n id,\r\n name: 'Path',\r\n polyline: {\r\n positions: pathPositions,\r\n width: DEFAULT_MAIN_WIDTH,\r\n material: C.Color.fromCssColorString('#00E676'),\r\n clampToGround: false,\r\n },\r\n properties: {\r\n _altitudeMode: altitudeMode,\r\n _defaultAltitude: defaultAltitude,\r\n _climbHeight: climbHeight,\r\n _useGlobalHeightFlags: [], // 🆕 空数组,航点由编辑模式添加\r\n },\r\n } as any);\r\n \r\n createdEntity = created;\r\n\r\n } finally {\r\n // 销毁绘制事件处理器,后续由编辑模式接管\r\n try {\r\n handler?.destroy();\r\n } catch {}\r\n handler = undefined;\r\n }\r\n \r\n if (created) {\r\n try {\r\n onComplete?.(created);\r\n } catch {}\r\n \r\n // 🆕 立即进入编辑模式(自由编辑模式,用户通过飞机游标添加航点)\r\n try {\r\n const auto = options?.autoStartEditing;\r\n const editOptions: any = {\r\n // 🔧 默认使用自由编辑模式(快速编辑和自由编辑互斥)\r\n quickEdit: false,\r\n };\r\n \r\n if (typeof auto === 'object' && auto.preview) {\r\n editOptions.preview = auto.preview;\r\n } else {\r\n editOptions.preview = { enabled: true };\r\n }\r\n \r\n // 传递所有顶点操作回调\r\n const autoOpts: any = typeof auto === 'object' ? auto : {};\r\n if (autoOpts.onVertexSelectDetail) {\r\n editOptions.onVertexSelectDetail = autoOpts.onVertexSelectDetail;\r\n }\r\n if (autoOpts.onVertexDragMoveDetail) {\r\n editOptions.onVertexDragMoveDetail = autoOpts.onVertexDragMoveDetail;\r\n }\r\n if (autoOpts.onVertexDragCompleteDetail) {\r\n editOptions.onVertexDragCompleteDetail = autoOpts.onVertexDragCompleteDetail;\r\n }\r\n if (autoOpts.onVertexInsertDetail) {\r\n editOptions.onVertexInsertDetail = autoOpts.onVertexInsertDetail;\r\n }\r\n if (autoOpts.onVertexDeleteDetail) {\r\n editOptions.onVertexDeleteDetail = autoOpts.onVertexDeleteDetail;\r\n }\r\n \r\n // 传递高度模式相关参数\r\n editOptions.altitudeMode = altitudeMode;\r\n editOptions.defaultAltitude = defaultAltitude;\r\n editOptions.climbHeight = climbHeight;\r\n \r\n editSession = startPathEditingImpl(CesiumNS as any, viewer as any, created as any, editOptions);\r\n \r\n // 🔧 自由编辑模式:用户通过飞机游标(WASD/QE 键)控制位置,按 Enter 添加航点\r\n // 快速编辑模式(quickEdit: true):用户直接点击地图添加航点\r\n // 两种模式互斥,新建航线默认使用自由编辑模式\r\n console.log('[startPathDrawing] 编辑模式已启动,自由编辑模式,使用飞机游标添加航点');\r\n \r\n if (editSession && options?.onEditingStarted) {\r\n try {\r\n options.onEditingStarted(editSession);\r\n } catch {}\r\n }\r\n } catch (error) {\r\n console.error('[startPathDrawing] 进入编辑模式失败:', error);\r\n }\r\n }\r\n }\r\n }, C.ScreenSpaceEventType.LEFT_CLICK);\r\n\r\n return {\r\n stop: () => {\r\n // 销毁事件处理器\r\n try {\r\n handler?.destroy();\r\n } catch {}\r\n // 停止编辑会话\r\n if (editSession) {\r\n try {\r\n editSession.stop();\r\n } catch {}\r\n }\r\n // 移除创建的航线 entity\r\n if (createdEntity) {\r\n try {\r\n (layer.entities as any).remove(createdEntity);\r\n } catch {}\r\n }\r\n },\r\n };\r\n}\r\n","import type * as Cesium from 'cesium';\r\n\r\n/**\r\n * Sinofly 航点信息接口\r\n */\r\nexport interface SinoflyWaypointInfo {\r\n waypointId: number | string;\r\n waylineId: number | string;\r\n index: number;\r\n latitude: string;\r\n longitude: string;\r\n altitude: string;\r\n action: string;\r\n noReturn: number;\r\n createUserId?: string;\r\n createTime?: string;\r\n modifyUserId?: string;\r\n modifyTime?: string;\r\n /** 🆕 椭球高度(WGS84 椭球面以上的高度,米) */\r\n ellipsoidHeight?: number;\r\n /** 🆕 相对高度(根据 altitudeMode 计算:海拔高度或相对地形高度,米) */\r\n relativeHeight?: number;\r\n /** 🆕 是否使用全局默认高度(true: 高度=defaultAltitude, false: 高度=实际计算值) */\r\n useGlobalHeight?: boolean;\r\n}\r\n\r\n/**\r\n * Sinofly 航线路数据结构接口\r\n */\r\nexport interface SinoflyWaylineData {\r\n waylineId: number | string;\r\n waylineName: string;\r\n waylineType: number;\r\n waylineVersion: string;\r\n source: number;\r\n heightType?: string;\r\n droneModelKey: number | string;\r\n relativeHeight: number;\r\n autoFlightSpeed: number;\r\n takeOffSecurityHeight: number;\r\n globalRthHeight: number;\r\n fileId: number | string;\r\n fileMd5: string;\r\n distance: number;\r\n duration: number;\r\n waypointNumber: number;\r\n photoNumber: number;\r\n createUserId?: string;\r\n createTime?: string;\r\n modifyUserId?: string;\r\n modifyTime?: string;\r\n stationId?: number;\r\n subarrayId?: number;\r\n stationName?: string;\r\n subarrayName?: string;\r\n /** 起始点位置坐标(Cartesian3 序列化后的字符串,JSON 格式包含 longitude/latitude/height) */\r\n takeOffRefPoint?: string;\r\n thumbnailFileId?: number;\r\n waypointInfo: SinoflyWaypointInfo[];\r\n}\r\n\r\n/**\r\n * 转换后的航点数据格式(用于 renderFlightPath)\r\n */\r\nexport interface ConvertedWaypointData {\r\n position: Cesium.Cartesian3;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n fov: number;\r\n index: number;\r\n /** 🆕 是否使用全局默认高度(true: 高度=defaultAltitude, false: 高度=实际计算值) */\r\n useGlobalHeight?: boolean;\r\n}\r\n\r\n/**\r\n * 转换后的航线路数据格式\r\n */\r\nexport interface ConvertedWaylineData {\r\n id?: string;\r\n name?: string;\r\n description?: string;\r\n waypointData: ConvertedWaypointData[];\r\n metadata?: {\r\n waylineId: number | string;\r\n waylineType: number;\r\n waylineVersion: string;\r\n relativeHeight: number;\r\n autoFlightSpeed: number;\r\n distance: number;\r\n duration: number;\r\n stationId?: number;\r\n subarrayId?: number;\r\n stationName?: string;\r\n subarrayName?: string;\r\n /** 爬升高度(基础高度偏移) */\r\n climbHeight?: number;\r\n [key: string]: any;\r\n };\r\n}\r\n\r\n/**\r\n * Sinofly 数据适配器配置选项\r\n */\r\nexport interface SinoflyAdapterOptions {\r\n /**\r\n * Cesium 命名空间(用于创建 Cartesian3)\r\n */\r\n CesiumNS: typeof Cesium;\r\n \r\n /**\r\n * 默认航向角(度),默认 0\r\n */\r\n defaultHeading?: number;\r\n \r\n /**\r\n * 默认俯仰角(度),默认 -10\r\n */\r\n defaultPitch?: number;\r\n \r\n /**\r\n * 默认横滚角(度),默认 0\r\n */\r\n defaultRoll?: number;\r\n \r\n /**\r\n * 默认视场角(度),默认 50\r\n */\r\n defaultFov?: number;\r\n \r\n /**\r\n * 是否从 action 字段解析姿态信息(默认 true)\r\n * 如果为 true,会尝试从 action JSON 字符串中解析姿态信息:\r\n * - heading: 从 rotateYaw 或 rotateYaw.aircraftHeading 获取\r\n * - pitch: 从 gimbalRotate 或 gimbalRotate.gimbalPitchRotateAngle 获取\r\n * - fov: 从 zoom 或 zoom.focalLength 获取\r\n * - roll: 保持默认值(Sinofly 数据中通常不包含 roll 信息)\r\n */\r\n parseActionForPose?: boolean;\r\n \r\n /**\r\n * 是否按 index 排序航点(默认 true)\r\n */\r\n sortByIndex?: boolean;\r\n \r\n /**\r\n * 自定义航点过滤函数,返回 false 的航点将被过滤\r\n */\r\n filterWaypoint?: (waypoint: SinoflyWaypointInfo, index: number) => boolean;\r\n}\r\n\r\n/**\r\n * 从 action 字符串中解析姿态信息\r\n * action 字段是 JSON 字符串,包含 Sinofly 格式的姿态信息:\r\n * - rotateYaw / rotateYaw.aircraftHeading -> heading\r\n * - gimbalRotate / gimbalRotate.gimbalPitchRotateAngle -> pitch\r\n * - zoom / zoom.focalLength -> fov\r\n * - roll 通常不在 Sinofly 数据中,保持默认值\r\n * \r\n * @param action JSON 字符串格式的 action 字段\r\n * @returns 解析出的姿态信息对象\r\n * \r\n * @example\r\n * ```typescript\r\n * // 示例 1: 嵌套结构\r\n * const action1 = JSON.stringify({\r\n * rotateYaw: { aircraftHeading: 45 },\r\n * gimbalRotate: { gimbalPitchRotateAngle: -10 },\r\n * zoom: { focalLength: 50 }\r\n * });\r\n * \r\n * // 示例 2: 扁平结构\r\n * const action2 = JSON.stringify({\r\n * rotateYaw: 45,\r\n * gimbalRotate: -10,\r\n * zoom: 50\r\n * });\r\n * \r\n * // 示例 3: 混合结构\r\n * const action3 = JSON.stringify({\r\n * rotateYaw: { aircraftHeading: 45 },\r\n * gimbalRotate: -10,\r\n * zoom: { focalLength: 50 }\r\n * });\r\n * ```\r\n */\r\nfunction parsePoseFromAction(action: string): {\r\n heading?: number;\r\n pitch?: number;\r\n roll?: number;\r\n fov?: number;\r\n} {\r\n if (!action || typeof action !== 'string' || action.trim() === '') {\r\n return {};\r\n }\r\n\r\n try {\r\n // 尝试解析 JSON\r\n let parsed = JSON.parse(action);\r\n \r\n // 如果解析结果是数组,取第一个元素\r\n if (Array.isArray(parsed)) {\r\n if (parsed.length === 0) {\r\n return {};\r\n }\r\n parsed = parsed[0];\r\n }\r\n \r\n if (typeof parsed !== 'object' || parsed === null) {\r\n return {};\r\n }\r\n\r\n const result: {\r\n heading?: number;\r\n pitch?: number;\r\n roll?: number;\r\n fov?: number;\r\n } = {};\r\n\r\n // 解析 heading: 优先从 rotateYaw.aircraftHeading 获取,其次从 rotateYaw 直接获取\r\n if (parsed.rotateYaw !== undefined && parsed.rotateYaw !== null) {\r\n if (\r\n typeof parsed.rotateYaw === 'object' &&\r\n typeof parsed.rotateYaw.aircraftHeading === 'number'\r\n ) {\r\n result.heading = parsed.rotateYaw.aircraftHeading;\r\n } else if (typeof parsed.rotateYaw === 'number') {\r\n result.heading = parsed.rotateYaw;\r\n }\r\n }\r\n\r\n // 解析 pitch: 优先从 gimbalRotate.gimbalPitchRotateAngle 获取,其次从 gimbalRotate 直接获取\r\n if (parsed.gimbalRotate !== undefined && parsed.gimbalRotate !== null) {\r\n if (\r\n typeof parsed.gimbalRotate === 'object' &&\r\n typeof parsed.gimbalRotate.gimbalPitchRotateAngle === 'number'\r\n ) {\r\n result.pitch = parsed.gimbalRotate.gimbalPitchRotateAngle;\r\n } else if (typeof parsed.gimbalRotate === 'number') {\r\n result.pitch = parsed.gimbalRotate;\r\n }\r\n }\r\n\r\n // 解析 fov: 优先从 zoom.focalLength 获取,其次从 zoom 直接获取\r\n if (parsed.zoom !== undefined && parsed.zoom !== null) {\r\n if (\r\n typeof parsed.zoom === 'object' &&\r\n typeof parsed.zoom.focalLength === 'number'\r\n ) {\r\n result.fov = parsed.zoom.focalLength;\r\n } else if (typeof parsed.zoom === 'number') {\r\n result.fov = parsed.zoom;\r\n }\r\n }\r\n\r\n // roll 通常在 Sinofly 数据中不存在,保持 undefined\r\n // 如果将来需要支持,可以在这里添加解析逻辑\r\n\r\n // 兼容性:如果存在标准的 heading/pitch/roll/fov 字段,也支持\r\n if (result.heading === undefined && typeof parsed.heading === 'number') {\r\n result.heading = parsed.heading;\r\n }\r\n if (result.pitch === undefined && typeof parsed.pitch === 'number') {\r\n result.pitch = parsed.pitch;\r\n }\r\n if (typeof parsed.roll === 'number') {\r\n result.roll = parsed.roll;\r\n }\r\n if (result.fov === undefined && typeof parsed.fov === 'number') {\r\n result.fov = parsed.fov;\r\n }\r\n\r\n return result;\r\n } catch (error) {\r\n // JSON 解析失败,尝试从字符串中提取数字(向后兼容)\r\n const numbers = action.match(/-?\\d+\\.?\\d*/g);\r\n if (numbers && numbers.length >= 4) {\r\n return {\r\n heading: parseFloat(numbers[0]),\r\n pitch: parseFloat(numbers[1]),\r\n roll: parseFloat(numbers[2]),\r\n fov: parseFloat(numbers[3]),\r\n };\r\n }\r\n\r\n // 无法解析,返回空对象\r\n // console.warn('[sinoflyAdapter] 无法解析 action 字段:', action, error);\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * 将字符串坐标转换为数字\r\n */\r\nfunction parseCoordinate(value: string | number): number {\r\n if (typeof value === 'number') {\r\n return value;\r\n }\r\n if (typeof value === 'string') {\r\n const parsed = parseFloat(value);\r\n return isNaN(parsed) ? 0 : parsed;\r\n }\r\n return 0;\r\n}\r\n\r\n\r\n\r\n/**\r\n * 将 Sinofly 航线路数据转换为本库所需的数据格式\r\n * \r\n * @param data Sinofly 航线路数据\r\n * @param options 适配器配置选项\r\n * @returns 转换后的航线路数据\r\n * \r\n * @example\r\n * ```typescript\r\n * import * as Cesium from 'cesium';\r\n * import { convertSinoflyWayline } from '@jorgmoritz/gis-manager';\r\n * \r\n * const sinoflyData = {\r\n * waylineId: 1,\r\n * waylineName: \"测试航线\",\r\n * waypointInfo: [\r\n * {\r\n * index: 0,\r\n * latitude: \"39.9042\",\r\n * longitude: \"116.4074\",\r\n * altitude: \"100.0\",\r\n * action: JSON.stringify({\r\n * rotateYaw: { aircraftHeading: 45 },\r\n * gimbalRotate: { gimbalPitchRotateAngle: -10 },\r\n * zoom: { focalLength: 50 }\r\n * })\r\n * }\r\n * ]\r\n * };\r\n * \r\n * const converted = convertSinoflyWayline(sinoflyData, {\r\n * CesiumNS: Cesium,\r\n * // parseActionForPose 默认为 true,会自动从 action 中解析姿态信息\r\n * defaultHeading: 0, // 如果 action 中没有 rotateYaw,使用此默认值\r\n * defaultPitch: -10, // 如果 action 中没有 gimbalRotate,使用此默认值\r\n * defaultRoll: 0,\r\n * defaultFov: 50 // 如果 action 中没有 zoom,使用此默认值\r\n * });\r\n * \r\n * // 使用转换后的数据\r\n * czmlPathManager.renderFlightPath({\r\n * id: converted.id,\r\n * name: converted.name,\r\n * waypointData: converted.waypointData,\r\n * description: converted.description\r\n * });\r\n * ```\r\n */\r\nexport function convertSinoflyWayline(\r\n data: SinoflyWaylineData,\r\n options: SinoflyAdapterOptions\r\n): ConvertedWaylineData {\r\n const {\r\n CesiumNS,\r\n defaultHeading = 0,\r\n defaultPitch = -10,\r\n defaultRoll = 0,\r\n defaultFov = 50,\r\n parseActionForPose = true,\r\n sortByIndex = true,\r\n filterWaypoint,\r\n } = options;\r\n\r\n const C: any = CesiumNS as any;\r\n\r\n // 验证输入数据\r\n if (!data) {\r\n throw new Error('[sinoflyAdapter] data 参数不能为空');\r\n }\r\n \r\n if (!data.waypointInfo || !Array.isArray(data.waypointInfo)) {\r\n throw new Error('[sinoflyAdapter] waypointInfo 必须是数组');\r\n }\r\n \r\n if (data.waypointInfo.length === 0) {\r\n // console.warn('[sinoflyAdapter] waypointInfo 数组为空,将返回空的航点数据');\r\n }\r\n\r\n // 验证 waylineId\r\n if (data.waylineId === undefined || data.waylineId === null) {\r\n throw new Error('[sinoflyAdapter] waylineId 不能为空');\r\n }\r\n\r\n // console.log(`[sinoflyAdapter] 开始转换航线 ${data.waylineId},包含 ${data.waypointInfo.length} 个航点`);\r\n\r\n // 过滤航点(如果提供了过滤函数)\r\n let waypoints = data.waypointInfo;\r\n if (filterWaypoint) {\r\n waypoints = waypoints.filter(filterWaypoint);\r\n }\r\n\r\n // 按 index 排序(如果启用)\r\n if (sortByIndex) {\r\n waypoints = [...waypoints].sort((a, b) => a.index - b.index);\r\n }\r\n\r\n // 转换 waypointInfo 中的航点数据\r\n // 所有航点从 index 0 开始,不再有起飞点和隐藏爬升点\r\n const convertedWaypoints: ConvertedWaypointData[] = waypoints.map((wp, idx) => {\r\n try {\r\n // 验证航点数据\r\n if (!wp) {\r\n throw new Error(`航点 ${idx} 数据为空`);\r\n }\r\n \r\n if (wp.latitude === undefined || wp.longitude === undefined || wp.altitude === undefined) {\r\n throw new Error(`航点 ${idx} 缺少必要的坐标信息`);\r\n }\r\n\r\n // 解析坐标\r\n const lat = parseCoordinate(wp.latitude);\r\n const lon = parseCoordinate(wp.longitude);\r\n const alt = parseCoordinate(wp.altitude);\r\n\r\n // 验证坐标有效性\r\n if (isNaN(lat) || isNaN(lon) || isNaN(alt)) {\r\n throw new Error(`航点 ${idx} 坐标解析失败: lat=${wp.latitude}, lon=${wp.longitude}, alt=${wp.altitude}`);\r\n }\r\n\r\n // 创建 Cartesian3 位置\r\n const position = C.Cartesian3.fromDegrees(lon, lat, alt);\r\n\r\n // 解析姿态信息\r\n let heading = defaultHeading;\r\n let pitch = defaultPitch;\r\n let roll = defaultRoll;\r\n let fov = defaultFov;\r\n\r\n if (parseActionForPose && wp.action) {\r\n try {\r\n const poseFromAction = parsePoseFromAction(wp.action);\r\n if (poseFromAction.heading !== undefined) heading = poseFromAction.heading;\r\n if (poseFromAction.pitch !== undefined) pitch = poseFromAction.pitch;\r\n if (poseFromAction.roll !== undefined) roll = poseFromAction.roll;\r\n if (poseFromAction.fov !== undefined) fov = poseFromAction.fov;\r\n } catch (actionError) {\r\n // console.warn(`[sinoflyAdapter] 航点 ${idx} action 解析失败:`, actionError);\r\n }\r\n }\r\n\r\n return {\r\n position,\r\n heading,\r\n pitch,\r\n roll,\r\n fov,\r\n index: idx, // 从 0 开始分配 index\r\n useGlobalHeight: false, // 🆕 从服务端加载的航点默认使用实际高度\r\n };\r\n } catch (error) {\r\n // console.error(`[sinoflyAdapter] 航点 ${idx} 转换失败:`, error);\r\n throw new Error(`航点 ${idx} 转换失败: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n });\r\n\r\n // 验证最终结果\r\n if (!Array.isArray(convertedWaypoints)) {\r\n throw new Error('[sinoflyAdapter] waypointData 不是数组');\r\n }\r\n \r\n // console.log(`[sinoflyAdapter] 转换完成,共生成 ${convertedWaypoints.length} 个航点`);\r\n\r\n // 构建元数据\r\n const metadata: ConvertedWaylineData['metadata'] = {\r\n waylineId: data.waylineId,\r\n waylineType: data.waylineType,\r\n waylineVersion: data.waylineVersion,\r\n relativeHeight: data.relativeHeight,\r\n autoFlightSpeed: data.autoFlightSpeed,\r\n distance: data.distance,\r\n duration: data.duration,\r\n climbHeight: data.takeOffSecurityHeight, // 使用 climbHeight 作为字段名\r\n };\r\n\r\n // 添加可选字段\r\n if (data.stationId !== undefined) metadata!.stationId = data.stationId;\r\n if (data.subarrayId !== undefined) metadata!.subarrayId = data.subarrayId;\r\n if (data.stationName) metadata!.stationName = data.stationName;\r\n if (data.subarrayName) metadata!.subarrayName = data.subarrayName;\r\n\r\n // 返回转换后的数据\r\n return {\r\n id: `wayline-${data.waylineId}`,\r\n name: data.waylineName || `航线-${data.waylineId}`,\r\n description: `航线ID: ${data.waylineId}, 类型: ${data.waylineType}, 航点数: ${data.waypointNumber}`,\r\n waypointData: convertedWaypoints,\r\n metadata,\r\n };\r\n}\r\n\r\n/**\r\n * 批量转换多个 Sinofly 航线路\r\n * \r\n * @param dataList Sinofly 航线路数据数组\r\n * @param options 适配器配置选项\r\n * @returns 转换后的航线路数据数组\r\n * \r\n * @example\r\n * ```typescript\r\n * const results = convertSinoflyWaylines(\r\n * [wayline1, wayline2, wayline3],\r\n * { CesiumNS: Cesium }\r\n * );\r\n * \r\n * results.forEach(result => {\r\n * if (result.success) {\r\n * czmlPathManager.renderFlightPath({\r\n * waypointData: result.data.waypointData,\r\n * name: result.data.name\r\n * });\r\n * } else {\r\n * console.error('转换失败:', result.error);\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function convertSinoflyWaylines(\r\n dataList: SinoflyWaylineData[],\r\n options: SinoflyAdapterOptions\r\n): Array<{\r\n success: boolean;\r\n data?: ConvertedWaylineData;\r\n error?: string;\r\n waylineId?: number | string;\r\n}> {\r\n return dataList.map((data) => {\r\n try {\r\n const converted = convertSinoflyWayline(data, options);\r\n return {\r\n success: true,\r\n data: converted,\r\n waylineId: data.waylineId,\r\n };\r\n } catch (error) {\r\n return {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n waylineId: data.waylineId,\r\n };\r\n }\r\n });\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { VertexLabelManager } from './editing/VertexLabelManager';\r\nimport {\r\n convertSinoflyWayline,\r\n type SinoflyWaylineData,\r\n type SinoflyAdapterOptions,\r\n} from '../../utils/sinoflyAdapter';\r\n\r\ntype Entity = Cesium.Entity;\r\ntype ScreenSpaceEventHandler = Cesium.ScreenSpaceEventHandler;\r\n\r\n/**\r\n * 回显飞航路线的选项类型\r\n */\r\nexport interface RenderFlightPathOptions {\r\n /** Sinofly 航线路数据 */\r\n data: SinoflyWaylineData;\r\n /** Sinofly 适配器配置选项 */\r\n adapterOptions?: Omit<SinoflyAdapterOptions, 'CesiumNS'>;\r\n id?: string;\r\n name?: string;\r\n description?: string;\r\n layer?: Cesium.CustomDataSource;\r\n style?: {\r\n width?: number;\r\n color?: Cesium.Color;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n };\r\n altitudeMode?: string;\r\n climbHeight?: number;\r\n}\r\n\r\n/**\r\n * 回显飞航路线:显示完整飞航路线和航点编号\r\n * \r\n * 接收 Sinofly 航线路数据,自动转换为本库格式并渲染显示。\r\n * \r\n * 航点逻辑说明:\r\n * - index 0: 第一个航线点,标记为 \"S\"\r\n * - index 1+: 后续航线点,标记为 1, 2, 3...\r\n * \r\n * @param CesiumNS Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param options 回显选项,包含 Sinofly 数据和配置\r\n * @returns 创建的 polyline 实体\r\n * \r\n * @example\r\n * ```typescript\r\n * // 基本用法\r\n * const sinoflyData = {\r\n * waylineId: \"12345\",\r\n * waylineName: \"测试航线\",\r\n * waypointInfo: [\r\n * { \r\n * index: 0, \r\n * latitude: \"39.9045\", \r\n * longitude: \"116.4078\", \r\n * altitude: \"150.0\", \r\n * action: '[{\"rotateYaw\": {\"aircraftHeading\": 45}, \"gimbalRotate\": {\"gimbalPitchRotateAngle\": -10}}]'\r\n * },\r\n * // ... 更多航点\r\n * ]\r\n * };\r\n * \r\n * const entity = renderFlightPath(Cesium, viewer, {\r\n * data: sinoflyData,\r\n * adapterOptions: {\r\n * parseActionForPose: true,\r\n * defaultHeading: 0,\r\n * defaultPitch: -10\r\n * },\r\n * layer: myLayer,\r\n * style: { width: 8, color: Cesium.Color.GREEN }\r\n * });\r\n * ```\r\n */\r\nexport function renderFlightPath(\r\n CesiumNS: typeof Cesium,\r\n viewer: Cesium.Viewer,\r\n options: RenderFlightPathOptions\r\n): Entity {\r\n const C: any = CesiumNS as any;\r\n \r\n // 转换 Sinofly 数据\r\n const sinoflyData = options.data;\r\n \r\n let waypointData: Array<{\r\n position: Cesium.Cartesian3;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n fov: number;\r\n index: number;\r\n }>;\r\n let entityId: string;\r\n let entityName: string | undefined;\r\n let entityDescription: string | undefined;\r\n let altitudeMode: string | undefined;\r\n let climbHeight: number | undefined;\r\n\r\n try {\r\n // 使用适配器转换数据\r\n const adapterOptions: SinoflyAdapterOptions = {\r\n CesiumNS,\r\n ...options.adapterOptions,\r\n };\r\n\r\n const converted = convertSinoflyWayline(sinoflyData, adapterOptions);\r\n\r\n // 验证转换结果\r\n if (!converted || !converted.waypointData || !Array.isArray(converted.waypointData)) {\r\n throw new Error('转换后的 waypointData 不是有效数组');\r\n }\r\n\r\n waypointData = converted.waypointData;\r\n entityId = options.id ?? converted.id ?? `wayline-${sinoflyData.waylineId}`;\r\n entityName = options.name ?? converted.name;\r\n entityDescription = options.description ?? converted.description;\r\n\r\n // 从 metadata 中提取信息(如果存在)\r\n altitudeMode = options.altitudeMode ?? converted.metadata?.altitudeMode;\r\n climbHeight = options.climbHeight ?? converted.metadata?.climbHeight;\r\n } catch (error) {\r\n console.error('[renderFlightPath] Sinofly 数据转换失败:', error);\r\n throw new Error(`Sinofly 数据转换失败: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n\r\n // 验证 waypointData 是否为可迭代对象\r\n if (!waypointData || typeof waypointData[Symbol.iterator] !== 'function') {\r\n console.error('[renderFlightPath] waypointData 不是可迭代对象:', waypointData);\r\n throw new Error('waypointData 必须是可迭代的数组');\r\n }\r\n\r\n // 从 waypointData 中提取 positions 数组,按 index 排序\r\n const sortedWaypoints = [...waypointData].sort((a, b) => a.index - b.index);\r\n const positions: Cesium.Cartesian3[] = sortedWaypoints.map((wp) => wp.position);\r\n\r\n if (positions.length === 0) {\r\n throw new Error('[renderFlightPath] waypointData 不能为空');\r\n }\r\n \r\n console.log(`[renderFlightPath] 开始渲染航线,包含 ${positions.length} 个航点`);\r\n\r\n // 确定 layer\r\n let layer: Cesium.CustomDataSource;\r\n if (options.layer) {\r\n layer = options.layer;\r\n } else {\r\n layer = new C.CustomDataSource(`flight-path-datasource-${Date.now()}`);\r\n viewer.dataSources.add(layer);\r\n }\r\n\r\n // 🆕 不再有隐藏爬升点\r\n const hiddenClimbIndex: number | undefined = undefined;\r\n\r\n // 🆕 从 waypointData 提取 useGlobalHeightFlags\r\n const useGlobalHeightFlags: boolean[] = sortedWaypoints.map((wp: any) => wp.useGlobalHeight ?? false);\r\n\r\n // 创建 Polyline 实体(静态路径线)\r\n const entity = (layer.entities as any).add({\r\n id: entityId,\r\n name: entityName,\r\n description: entityDescription,\r\n polyline: {\r\n positions: positions.slice(),\r\n width: options.style?.width ?? 3,\r\n material:\r\n options.style?.material ?? options.style?.color ?? C.Color.fromCssColorString('#00E676'),\r\n clampToGround: false,\r\n },\r\n properties: {\r\n _altitudeMode: altitudeMode,\r\n _climbHeight: climbHeight,\r\n _useGlobalHeightFlags: useGlobalHeightFlags, // 🆕 保存 useGlobalHeightFlags\r\n },\r\n } as any);\r\n\r\n // 创建航点标签(使用 VertexLabelManager)\r\n try {\r\n const vertexLabelManager = new VertexLabelManager(\r\n CesiumNS,\r\n layer,\r\n entityId,\r\n hiddenClimbIndex,\r\n );\r\n vertexLabelManager.initializeLabels(positions);\r\n \r\n // 将标签管理器保存到实体属性中,以便后续管理\r\n (entity as any)._vertexLabelManager = vertexLabelManager;\r\n } catch (error) {\r\n console.error('Failed to create vertex labels:', error);\r\n }\r\n\r\n return entity;\r\n}\r\n\r\n/**\r\n * 预览模式渲染选项(扩展基础选项)\r\n */\r\nexport interface RenderFlightPathPreviewOptions extends RenderFlightPathOptions {\r\n /** 航点点击回调 */\r\n onWaypointClick?: (index: number, waypointData: any) => void;\r\n /** 初始选中的航点索引 */\r\n initialSelectedIndex?: number;\r\n}\r\n\r\n/**\r\n * 预览模式控制器接口\r\n */\r\nexport interface FlightPathPreviewController {\r\n /** 设置选中的航点(高亮显示)*/\r\n setSelectedWaypoint: (index: number | null) => void;\r\n /** 获取当前选中的航点索引 */\r\n getSelectedWaypoint: () => number | null;\r\n /** 销毁控制器(移除事件监听等)*/\r\n destroy: () => void;\r\n}\r\n\r\n/**\r\n * 预览模式渲染飞航路线:支持航点点击高亮\r\n * \r\n * 与 renderFlightPath 不同,此函数返回一个控制器对象,支持:\r\n * - 航点点击事件回调\r\n * - 程序化设置选中航点(高亮显示)\r\n * - 列表与地图双向联动\r\n * \r\n * @param CesiumNS Cesium 命名空间\r\n * @param viewer Cesium Viewer 实例\r\n * @param options 预览选项\r\n * @returns 包含实体和控制器的对象\r\n * \r\n * @example\r\n * ```typescript\r\n * const { entity, controller } = renderFlightPathPreview(Cesium, viewer, {\r\n * data: sinoflyData,\r\n * onWaypointClick: (index, waypoint) => {\r\n * console.log('点击了航点', index, waypoint);\r\n * },\r\n * initialSelectedIndex: 0\r\n * });\r\n * \r\n * // 程序化设置选中航点\r\n * controller.setSelectedWaypoint(2);\r\n * \r\n * // 销毁\r\n * controller.destroy();\r\n * ```\r\n */\r\nexport function renderFlightPathPreview(\r\n CesiumNS: typeof Cesium,\r\n viewer: Cesium.Viewer,\r\n options: RenderFlightPathPreviewOptions\r\n): { entity: Entity; controller: FlightPathPreviewController } {\r\n const C: any = CesiumNS as any;\r\n \r\n // 先使用基础函数渲染航线\r\n const entity = renderFlightPath(CesiumNS, viewer, options);\r\n \r\n // 获取 VertexLabelManager 实例\r\n const vertexLabelManager: VertexLabelManager | undefined = (entity as any)._vertexLabelManager;\r\n \r\n // 当前选中的航点索引\r\n let selectedWaypointIndex: number | null = options.initialSelectedIndex ?? null;\r\n \r\n // 获取航点数据(从实体的 polyline positions 推断)\r\n const polyline = entity.polyline;\r\n let positions: Cesium.Cartesian3[] = [];\r\n if (polyline && polyline.positions) {\r\n const posValue = (polyline.positions as any).getValue?.(C.JulianDate.now());\r\n if (Array.isArray(posValue)) {\r\n positions = posValue;\r\n }\r\n }\r\n \r\n // 转换航线数据以获取航点详细信息\r\n let waypointDataArray: any[] = [];\r\n try {\r\n const adapterOptions: SinoflyAdapterOptions = {\r\n CesiumNS,\r\n ...options.adapterOptions,\r\n };\r\n const converted = convertSinoflyWayline(options.data, adapterOptions);\r\n if (converted && converted.waypointData) {\r\n waypointDataArray = [...converted.waypointData].sort((a, b) => a.index - b.index);\r\n }\r\n } catch (e) {\r\n console.warn('[renderFlightPathPreview] 无法获取航点数据:', e);\r\n }\r\n \r\n /**\r\n * 更新航点高亮状态\r\n */\r\n const updateWaypointHighlight = (newIndex: number | null) => {\r\n if (!vertexLabelManager || positions.length === 0) return;\r\n \r\n // 重建所有标签,设置选中状态\r\n const editedIndices = new Set<number>();\r\n vertexLabelManager.recreateAllLabels(positions, editedIndices, newIndex ?? undefined);\r\n };\r\n \r\n // 初始化选中状态\r\n if (selectedWaypointIndex !== null) {\r\n updateWaypointHighlight(selectedWaypointIndex);\r\n }\r\n \r\n // 创建点击事件处理器\r\n const handler: ScreenSpaceEventHandler = new C.ScreenSpaceEventHandler(viewer.scene.canvas);\r\n \r\n handler.setInputAction((movement: { position: Cesium.Cartesian2 }) => {\r\n const pickedObject = viewer.scene.pick(movement.position);\r\n \r\n if (C.defined(pickedObject) && pickedObject.id) {\r\n const pickedEntity = pickedObject.id as Cesium.Entity;\r\n const properties = pickedEntity.properties;\r\n \r\n if (properties) {\r\n const type = properties._type?.getValue?.(C.JulianDate.now());\r\n const ownerId = properties._ownerId?.getValue?.(C.JulianDate.now());\r\n const vertexIndex = properties._vertexIndex?.getValue?.(C.JulianDate.now());\r\n \r\n // 检查是否是当前航线的航点标签\r\n if (type === 'vertex-label' && ownerId === entity.id && vertexIndex !== undefined) {\r\n // 🆕 显示索引 = 实际索引(不再有隐藏爬升点)\r\n const displayIndex = vertexIndex;\r\n\r\n // 更新选中状态\r\n selectedWaypointIndex = vertexIndex;\r\n updateWaypointHighlight(selectedWaypointIndex);\r\n\r\n // 触发回调\r\n if (options.onWaypointClick) {\r\n const waypointData = waypointDataArray.find((wp) => wp.index === vertexIndex);\r\n options.onWaypointClick(displayIndex, waypointData);\r\n }\r\n }\r\n }\r\n }\r\n }, C.ScreenSpaceEventType.LEFT_CLICK);\r\n \r\n // 创建控制器\r\n const controller: FlightPathPreviewController = {\r\n setSelectedWaypoint: (index: number | null) => {\r\n if (index === null) {\r\n selectedWaypointIndex = null;\r\n updateWaypointHighlight(null);\r\n return;\r\n }\r\n\r\n // 🆕 显示索引 = 实际索引(不再有隐藏爬升点)\r\n selectedWaypointIndex = index;\r\n updateWaypointHighlight(selectedWaypointIndex);\r\n },\r\n\r\n getSelectedWaypoint: () => {\r\n // 🆕 直接返回索引(不再有隐藏爬升点)\r\n return selectedWaypointIndex;\r\n },\r\n \r\n destroy: () => {\r\n handler.destroy();\r\n },\r\n };\r\n \r\n return { entity, controller };\r\n}\r\n\r\n","import type * as Cesium from 'cesium';\r\nimport { Emitter } from '../../utils/events';\r\nimport { convertSinoflyWayline, type SinoflyWaylineData, type ConvertedWaypointData } from '../../utils/sinoflyAdapter';\r\nimport { AirplaneCursor } from './AirplaneCursor';\r\n\r\n/**\r\n * 飞行仿真状态\r\n */\r\nexport type FlightSimulatorState = 'idle' | 'playing' | 'paused' | 'stopped';\r\n\r\n/**\r\n * 飞行仿真状态变化事件\r\n */\r\nexport interface FlightSimulatorStateChangeEvent {\r\n state: FlightSimulatorState;\r\n progress?: number; // 0-1 的进度值\r\n}\r\n\r\n/**\r\n * 飞行仿真控制器接口\r\n */\r\nexport interface FlightSimulatorController {\r\n /** 开始播放 */\r\n start(): void;\r\n /** 暂停 */\r\n pause(): void;\r\n /** 恢复播放 */\r\n resume(): void;\r\n /** 停止并重置 */\r\n stop(): void;\r\n /** 销毁并清理资源 */\r\n destroy(): void;\r\n /** 设置飞行速度 (m/s) */\r\n setSpeed(speed: number): void;\r\n /** 获取当前状态 */\r\n getState(): FlightSimulatorState;\r\n /** 获取当前进度 (0-1) */\r\n getProgress(): number;\r\n /** 状态变化事件 */\r\n onStateChange: Emitter<FlightSimulatorStateChangeEvent>;\r\n}\r\n\r\n/**\r\n * 航迹高亮选项\r\n */\r\nexport interface TrackHighlightOptions {\r\n enabled: boolean;\r\n color?: Cesium.Color;\r\n width?: number;\r\n}\r\n\r\n/**\r\n * 飞行仿真选项\r\n */\r\nexport interface FlightSimulatorOptions {\r\n /** Sinofly 航线数据 */\r\n waylineData: SinoflyWaylineData;\r\n /** 飞行速度 (m/s),默认 10 */\r\n speed?: number;\r\n /** 是否循环播放,默认 false */\r\n loop?: boolean;\r\n /** 是否显示视锥体,默认 true(AirplaneCursor 已内置视锥体) */\r\n showFrustum?: boolean;\r\n /** 航迹高亮选项 */\r\n trackHighlight?: TrackHighlightOptions;\r\n /** 自定义图层 */\r\n layer?: Cesium.CustomDataSource;\r\n}\r\n\r\n/**\r\n * 航点位置信息(内部使用)\r\n */\r\ninterface WaypointPosition {\r\n cartesian: Cesium.Cartesian3;\r\n heading: number;\r\n pitch: number;\r\n roll: number;\r\n cumulativeDistance: number;\r\n}\r\n\r\n/**\r\n * 飞行仿真器\r\n * \r\n * 沿航线路径移动飞机模型,支持播放控制、速度调节和循环播放\r\n */\r\nexport class FlightSimulator implements FlightSimulatorController {\r\n private CesiumNS: typeof Cesium;\r\n private viewer: Cesium.Viewer;\r\n private options: Required<Omit<FlightSimulatorOptions, 'layer' | 'trackHighlight'>> & {\r\n layer?: Cesium.CustomDataSource;\r\n trackHighlight?: TrackHighlightOptions;\r\n };\r\n\r\n private state: FlightSimulatorState = 'idle';\r\n private progress: number = 0;\r\n private waypoints: WaypointPosition[] = [];\r\n private totalDistance: number = 0;\r\n private currentDistance: number = 0;\r\n\r\n private airplaneCursor?: AirplaneCursor;\r\n private trackEntity?: Cesium.Entity;\r\n private passedTrackEntity?: Cesium.Entity;\r\n\r\n private animationFrameId?: number;\r\n private lastTimestamp?: number;\r\n\r\n public readonly onStateChange = new Emitter<FlightSimulatorStateChangeEvent>();\r\n\r\n constructor(\r\n CesiumNS: typeof Cesium,\r\n viewer: Cesium.Viewer,\r\n options: FlightSimulatorOptions,\r\n ) {\r\n this.CesiumNS = CesiumNS;\r\n this.viewer = viewer;\r\n this.options = {\r\n waylineData: options.waylineData,\r\n speed: options.speed ?? 10,\r\n loop: options.loop ?? false,\r\n showFrustum: options.showFrustum ?? true,\r\n layer: options.layer,\r\n trackHighlight: options.trackHighlight,\r\n };\r\n\r\n this.initWaypoints();\r\n this.createEntities();\r\n }\r\n\r\n /**\r\n * 初始化航点数据\r\n */\r\n private initWaypoints(): void {\r\n const C = this.CesiumNS as any;\r\n const converted = convertSinoflyWayline(this.options.waylineData, { CesiumNS: this.CesiumNS });\r\n\r\n if (!converted.waypointData || converted.waypointData.length < 2) {\r\n console.warn('[FlightSimulator] 航点数量不足');\r\n return;\r\n }\r\n\r\n // 先收集所有航点的基本信息\r\n const tempWaypoints = converted.waypointData.map((wp: ConvertedWaypointData) => ({\r\n cartesian: wp.position,\r\n heading: wp.heading ?? 0,\r\n pitch: wp.pitch ?? 0,\r\n roll: wp.roll ?? 0,\r\n cumulativeDistance: 0,\r\n }));\r\n\r\n // 计算累积距离\r\n let cumulativeDistance = 0;\r\n for (let i = 0; i < tempWaypoints.length; i++) {\r\n if (i > 0) {\r\n const prevCartesian = tempWaypoints[i - 1].cartesian;\r\n const currCartesian = tempWaypoints[i].cartesian;\r\n cumulativeDistance += C.Cartesian3.distance(prevCartesian, currCartesian);\r\n }\r\n tempWaypoints[i].cumulativeDistance = cumulativeDistance;\r\n }\r\n\r\n this.waypoints = tempWaypoints;\r\n this.totalDistance = cumulativeDistance;\r\n }\r\n\r\n /**\r\n * 创建可视化实体\r\n */\r\n private createEntities(): void {\r\n if (this.waypoints.length === 0) return;\r\n\r\n // 使用 AirplaneCursor 代替自建飞机实体(内置无人机模型和视锥体)\r\n const firstWaypoint = this.waypoints[0];\r\n this.airplaneCursor = new AirplaneCursor(\r\n this.CesiumNS,\r\n this.viewer,\r\n firstWaypoint.cartesian,\r\n {\r\n // 禁用键盘控制(仿真模式下不需要手动控制)\r\n stepMeters: 0,\r\n angleStepDeg: 0,\r\n fovDeg: 50,\r\n }\r\n );\r\n\r\n // 设置初始姿态\r\n this.airplaneCursor.setPose(\r\n firstWaypoint.cartesian,\r\n firstWaypoint.heading,\r\n firstWaypoint.pitch,\r\n firstWaypoint.roll\r\n );\r\n\r\n // 创建航迹高亮(如果启用)\r\n if (this.options.trackHighlight?.enabled) {\r\n this.createTrackHighlight();\r\n }\r\n }\r\n\r\n /**\r\n * 创建航迹高亮\r\n */\r\n private createTrackHighlight(): void {\r\n const C = this.CesiumNS as any;\r\n const entities = this.options.layer?.entities ?? this.viewer.entities;\r\n const highlightOpts = this.options.trackHighlight!;\r\n\r\n // 完整航迹(半透明)\r\n const allPositions = this.waypoints.map(wp => wp.cartesian);\r\n this.trackEntity = entities.add({\r\n id: `flight-simulator-track-${Date.now()}`,\r\n polyline: {\r\n positions: allPositions,\r\n width: highlightOpts.width ?? 4,\r\n material: (highlightOpts.color ?? C.Color.CYAN).withAlpha(0.3),\r\n clampToGround: false,\r\n },\r\n properties: {\r\n _type: 'flight-simulator-track',\r\n },\r\n });\r\n\r\n // 已飞过的航迹(高亮)\r\n this.passedTrackEntity = entities.add({\r\n id: `flight-simulator-passed-track-${Date.now()}`,\r\n polyline: {\r\n positions: new C.CallbackProperty(() => this.getPassedPositions(), false),\r\n width: (highlightOpts.width ?? 4) + 2,\r\n material: highlightOpts.color ?? C.Color.CYAN,\r\n clampToGround: false,\r\n },\r\n properties: {\r\n _type: 'flight-simulator-passed-track',\r\n },\r\n });\r\n }\r\n\r\n /**\r\n * 获取当前位置\r\n */\r\n private getCurrentPosition(): Cesium.Cartesian3 {\r\n if (this.waypoints.length === 0) {\r\n return (this.CesiumNS as any).Cartesian3.ZERO;\r\n }\r\n\r\n const C = this.CesiumNS as any;\r\n\r\n // 找到当前距离所在的航段\r\n for (let i = 1; i < this.waypoints.length; i++) {\r\n const prev = this.waypoints[i - 1];\r\n const curr = this.waypoints[i];\r\n\r\n if (this.currentDistance <= curr.cumulativeDistance) {\r\n // 在这个航段内\r\n const segmentStart = prev.cumulativeDistance;\r\n const segmentEnd = curr.cumulativeDistance;\r\n const segmentLength = segmentEnd - segmentStart;\r\n\r\n if (segmentLength <= 0) {\r\n return prev.cartesian;\r\n }\r\n\r\n const t = (this.currentDistance - segmentStart) / segmentLength;\r\n return C.Cartesian3.lerp(prev.cartesian, curr.cartesian, t, new C.Cartesian3());\r\n }\r\n }\r\n\r\n // 超过最后一个航点\r\n return this.waypoints[this.waypoints.length - 1].cartesian;\r\n }\r\n\r\n /**\r\n * 获取当前姿态(用于更新 AirplaneCursor)\r\n */\r\n private getCurrentPose(): { heading: number; pitch: number; roll: number } {\r\n const C = this.CesiumNS as any;\r\n let heading = 0;\r\n let pitch = 0;\r\n let roll = 0;\r\n\r\n for (let i = 1; i < this.waypoints.length; i++) {\r\n const prev = this.waypoints[i - 1];\r\n const curr = this.waypoints[i];\r\n\r\n if (this.currentDistance <= curr.cumulativeDistance) {\r\n const segmentStart = prev.cumulativeDistance;\r\n const segmentEnd = curr.cumulativeDistance;\r\n const segmentLength = segmentEnd - segmentStart;\r\n\r\n if (segmentLength > 0) {\r\n const t = (this.currentDistance - segmentStart) / segmentLength;\r\n heading = C.Math.lerp(prev.heading, curr.heading, t);\r\n pitch = C.Math.lerp(prev.pitch, curr.pitch, t);\r\n roll = C.Math.lerp(prev.roll, curr.roll, t);\r\n } else {\r\n heading = prev.heading;\r\n pitch = prev.pitch;\r\n roll = prev.roll;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return { heading, pitch, roll };\r\n }\r\n\r\n /**\r\n * 获取已飞过的位置数组\r\n */\r\n private getPassedPositions(): Cesium.Cartesian3[] {\r\n const positions: Cesium.Cartesian3[] = [];\r\n\r\n for (let i = 0; i < this.waypoints.length; i++) {\r\n const wp = this.waypoints[i];\r\n if (wp.cumulativeDistance <= this.currentDistance) {\r\n positions.push(wp.cartesian);\r\n } else {\r\n // 添加当前插值位置\r\n positions.push(this.getCurrentPosition());\r\n break;\r\n }\r\n }\r\n\r\n return positions;\r\n }\r\n\r\n /**\r\n * 动画循环\r\n */\r\n private animate = (timestamp: number): void => {\r\n if (this.state !== 'playing') return;\r\n\r\n if (this.lastTimestamp === undefined) {\r\n this.lastTimestamp = timestamp;\r\n }\r\n\r\n const deltaTime = (timestamp - this.lastTimestamp) / 1000; // 转为秒\r\n this.lastTimestamp = timestamp;\r\n\r\n // 更新距离\r\n this.currentDistance += this.options.speed * deltaTime;\r\n\r\n // 检查是否完成\r\n if (this.currentDistance >= this.totalDistance) {\r\n if (this.options.loop) {\r\n // 循环播放\r\n this.currentDistance = 0;\r\n } else {\r\n // 停止\r\n this.currentDistance = this.totalDistance;\r\n this.setState('stopped');\r\n return;\r\n }\r\n }\r\n\r\n // 更新进度\r\n this.progress = this.totalDistance > 0 ? this.currentDistance / this.totalDistance : 0;\r\n\r\n // 更新 AirplaneCursor 的位置和姿态\r\n if (this.airplaneCursor) {\r\n const position = this.getCurrentPosition();\r\n const { heading, pitch, roll } = this.getCurrentPose();\r\n this.airplaneCursor.setPose(position, heading, pitch, roll);\r\n }\r\n\r\n // 请求渲染\r\n this.viewer.scene.requestRender();\r\n\r\n // 继续动画\r\n this.animationFrameId = requestAnimationFrame(this.animate);\r\n };\r\n\r\n /**\r\n * 设置状态并发射事件\r\n */\r\n private setState(newState: FlightSimulatorState): void {\r\n if (this.state === newState) return;\r\n this.state = newState;\r\n this.onStateChange.emit({ state: newState, progress: this.progress });\r\n }\r\n\r\n // ==================== 公共方法 ====================\r\n\r\n start(): void {\r\n if (this.waypoints.length < 2) {\r\n console.warn('[FlightSimulator] 航点数量不足,无法开始仿真');\r\n return;\r\n }\r\n\r\n this.currentDistance = 0;\r\n this.progress = 0;\r\n this.lastTimestamp = undefined;\r\n this.setState('playing');\r\n this.animationFrameId = requestAnimationFrame(this.animate);\r\n }\r\n\r\n pause(): void {\r\n if (this.state !== 'playing') return;\r\n \r\n if (this.animationFrameId !== undefined) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = undefined;\r\n }\r\n this.lastTimestamp = undefined;\r\n this.setState('paused');\r\n }\r\n\r\n resume(): void {\r\n if (this.state !== 'paused') return;\r\n \r\n this.lastTimestamp = undefined;\r\n this.setState('playing');\r\n this.animationFrameId = requestAnimationFrame(this.animate);\r\n }\r\n\r\n stop(): void {\r\n if (this.animationFrameId !== undefined) {\r\n cancelAnimationFrame(this.animationFrameId);\r\n this.animationFrameId = undefined;\r\n }\r\n this.currentDistance = 0;\r\n this.progress = 0;\r\n this.lastTimestamp = undefined;\r\n this.setState('stopped');\r\n this.viewer.scene.requestRender();\r\n }\r\n\r\n destroy(): void {\r\n this.stop();\r\n\r\n const entities = this.options.layer?.entities ?? this.viewer.entities;\r\n\r\n // 销毁 AirplaneCursor\r\n if (this.airplaneCursor) {\r\n this.airplaneCursor.destroy();\r\n this.airplaneCursor = undefined;\r\n }\r\n\r\n // 移除航迹实体\r\n if (this.trackEntity) {\r\n entities.remove(this.trackEntity);\r\n this.trackEntity = undefined;\r\n }\r\n if (this.passedTrackEntity) {\r\n entities.remove(this.passedTrackEntity);\r\n this.passedTrackEntity = undefined;\r\n }\r\n\r\n this.waypoints = [];\r\n this.setState('idle');\r\n }\r\n\r\n setSpeed(speed: number): void {\r\n this.options.speed = Math.max(0.1, speed);\r\n }\r\n\r\n getState(): FlightSimulatorState {\r\n return this.state;\r\n }\r\n\r\n getProgress(): number {\r\n return this.progress;\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { startPathEditing as startPathEditingImpl } from './path-manager/pathEditing';\r\nimport { startPathDrawing as startPathDrawingImpl } from './path-manager/startPathDrawing';\r\nimport { renderFlightPath as renderFlightPathImpl, renderFlightPathPreview as renderFlightPathPreviewImpl } from './path-manager/renderFlightPath';\r\nimport type { RenderFlightPathOptions, RenderFlightPathPreviewOptions, FlightPathPreviewController } from './path-manager/renderFlightPath';\r\nimport { FlightSimulator, type FlightSimulatorOptions, type FlightSimulatorController } from './path-manager/FlightSimulator';\r\n\r\nexport type PathSample =\r\n | { time: Cesium.JulianDate | Date | string | number; lon: number; lat: number; height?: number }\r\n | [Cesium.JulianDate | Date | string | number, number, number, number?];\r\n\r\nexport interface PathCreateOptions {\r\n id?: string;\r\n name?: string;\r\n description?: string;\r\n /** Optional initial samples */\r\n samples?: PathSample[];\r\n /** Style and behavior of the path graphic */\r\n style?: {\r\n width?: number; // pixels\r\n color?: Cesium.Color; // Solid color for the path material\r\n material?: Cesium.MaterialProperty | Cesium.Color; // overrides color if provided\r\n leadTime?: number; // seconds into the future to show\r\n trailTime?: number; // seconds into the past to show\r\n resolution?: number; // seconds between sampled positions for rendering\r\n };\r\n /** Optional availability window; if omitted, inferred from samples */\r\n availability?: {\r\n start: Cesium.JulianDate | Date | string | number;\r\n stop: Cesium.JulianDate | Date | string | number;\r\n };\r\n}\r\n\r\nexport interface PathStyleOptions {\r\n width?: number;\r\n color?: Cesium.Color;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n leadTime?: number;\r\n trailTime?: number;\r\n resolution?: number;\r\n}\r\n\r\ntype Entity = Cesium.Entity;\r\n\r\n/**\r\n * Manages time-dynamic path entities using SampledPositionProperty + PathGraphics.\r\n * Provides helpers to create paths, mutate their samples, and export CZML-compatible payloads.\r\n */\r\nexport class CZMLPathManager {\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Cesium.Viewer,\r\n ) {}\r\n\r\n private static readonly SAMPLES_KEY = '__czmlPathSamples__';\r\n\r\n /** Utility: normalize various time inputs into Cesium.JulianDate */\r\n private toJulian(time: Cesium.JulianDate | Date | string | number): Cesium.JulianDate {\r\n const C: any = this.CesiumNS as any;\r\n if ((time as any)?.isJulianDate) return time as Cesium.JulianDate;\r\n if (typeof time === 'string') return C.JulianDate.fromIso8601(time);\r\n if (typeof time === 'number') return C.JulianDate.fromDate(new Date(time));\r\n if (time instanceof Date) return C.JulianDate.fromDate(time);\r\n return time as Cesium.JulianDate;\r\n }\r\n\r\n private toCartesian(lon: number, lat: number, height?: number): Cesium.Cartesian3 {\r\n const C: any = this.CesiumNS as any;\r\n return C.Cartesian3.fromDegrees(lon, lat, height ?? 0);\r\n }\r\n\r\n private ensureAvailability(entity: Entity, start: Cesium.JulianDate, stop: Cesium.JulianDate) {\r\n const C: any = this.CesiumNS as any;\r\n const TimeInterval = C.TimeInterval;\r\n const TimeIntervalCollection = C.TimeIntervalCollection;\r\n const s = C.JulianDate.lessThan(stop, start) ? start : start;\r\n const e = C.JulianDate.lessThan(stop, start) ? stop : stop;\r\n entity.availability = new TimeIntervalCollection([new TimeInterval({ start: s, stop: e })]);\r\n }\r\n\r\n private parseSample(sample: PathSample) {\r\n if (Array.isArray(sample)) {\r\n const [t, lon, lat, height] = sample;\r\n return { t: this.toJulian(t), lon, lat, height: height ?? 0 };\r\n }\r\n return {\r\n t: this.toJulian(sample.time),\r\n lon: sample.lon,\r\n lat: sample.lat,\r\n height: sample.height ?? 0,\r\n };\r\n }\r\n\r\n /**\r\n * 回显飞航路线:显示完整飞航路线、航点编号和起始点箭头\r\n * \r\n * 接收 Sinofly 航线路数据,自动转换为本库格式并渲染显示。\r\n * \r\n * 航点逻辑说明:\r\n * - 有 takeOffRefPoint 时:index 0 是起始点(显示箭头),index 1 是隐藏转折点,index 2 是第一个航线点(标记 \"S\")\r\n * - 无 takeOffRefPoint 时:index 0 是第一个航线点(标记 \"S\"),无起始箭头\r\n * \r\n * @param options Sinofly 数据和配置选项\r\n * @returns 创建的 polyline 实体\r\n * \r\n * @example\r\n * ```typescript\r\n * const sinoflyData = {\r\n * waylineId: \"12345\",\r\n * waylineName: \"测试航线\",\r\n * takeOffSecurityHeight: 50,\r\n * takeOffRefPoint: '{\"longitude\": 116.4074, \"latitude\": 39.9042, \"height\": 100}',\r\n * waypointInfo: [\r\n * { \r\n * index: 0, \r\n * latitude: \"39.9045\", \r\n * longitude: \"116.4078\", \r\n * altitude: \"150.0\", \r\n * action: '[{\"rotateYaw\": {\"aircraftHeading\": 45}}]'\r\n * },\r\n * // ... 更多航点\r\n * ]\r\n * };\r\n * \r\n * const entity = pathManager.renderFlightPath({\r\n * data: sinoflyData,\r\n * adapterOptions: {\r\n * parseActionForPose: true\r\n * },\r\n * style: { width: 8, color: Cesium.Color.GREEN }\r\n * });\r\n * ```\r\n */\r\n renderFlightPath(\r\n options: RenderFlightPathOptions\r\n ): Entity {\r\n return renderFlightPathImpl(this.CesiumNS, this.viewer, options);\r\n }\r\n\r\n /**\r\n * 预览模式渲染飞航路线:支持航点点击高亮\r\n * \r\n * 与 renderFlightPath 不同,此方法返回一个控制器对象,支持:\r\n * - 航点点击事件回调\r\n * - 程序化设置选中航点(高亮显示)\r\n * - 列表与地图双向联动\r\n * \r\n * @param options 预览选项\r\n * @returns 包含实体和控制器的对象\r\n * \r\n * @example\r\n * ```typescript\r\n * const { entity, controller } = pathManager.renderFlightPathPreview({\r\n * data: sinoflyData,\r\n * onWaypointClick: (index, waypoint) => {\r\n * console.log('点击了航点', index, waypoint);\r\n * },\r\n * initialSelectedIndex: 0\r\n * });\r\n * \r\n * // 程序化设置选中航点\r\n * controller.setSelectedWaypoint(2);\r\n * \r\n * // 销毁\r\n * controller.destroy();\r\n * ```\r\n */\r\n renderFlightPathPreview(\r\n options: RenderFlightPathPreviewOptions\r\n ): { entity: Entity; controller: FlightPathPreviewController } {\r\n return renderFlightPathPreviewImpl(this.CesiumNS, this.viewer, options);\r\n }\r\n\r\n private resolveEntity(entityOrId: Entity | string): Entity | undefined {\r\n return typeof entityOrId === 'string'\r\n ? (this.viewer.entities.getById(entityOrId) as Entity | undefined)\r\n : entityOrId;\r\n }\r\n\r\n addPathSample(entityOrId: Entity | string, sample: PathSample) {\r\n const entity = this.resolveEntity(entityOrId);\r\n if (!entity) return;\r\n const { t, lon, lat, height } = this.parseSample(sample);\r\n const spp: Cesium.SampledPositionProperty = entity.position as any;\r\n spp.addSample(t, this.toCartesian(lon, lat, height));\r\n // Track samples on entity for robust export\r\n const key = CZMLPathManager.SAMPLES_KEY as any;\r\n const arr = ((entity as any)[key] ||= []);\r\n arr.push({ t, lon, lat, height });\r\n // keep sorted by time\r\n const C: any = this.CesiumNS as any;\r\n arr.sort((a: any, b: any) => C.JulianDate.compare(a.t, b.t));\r\n // maintain availability bounds\r\n const priv: any = spp as any;\r\n const times: Cesium.JulianDate[] | undefined = priv?._times;\r\n if (times && times.length > 0) {\r\n this.ensureAvailability(entity, times[0], times[times.length - 1]);\r\n }\r\n }\r\n\r\n addPathSamples(entityOrId: Entity | string, samples: PathSample[]) {\r\n for (const s of samples) this.addPathSample(entityOrId, s);\r\n }\r\n\r\n setPathSamples(entityOrId: Entity | string, samples: PathSample[]) {\r\n const entity = this.resolveEntity(entityOrId);\r\n if (!entity) return;\r\n const C: any = this.CesiumNS as any;\r\n const spp = new C.SampledPositionProperty();\r\n // sort by time for consistency\r\n const parsed = samples\r\n .map((s) => this.parseSample(s))\r\n .sort((a, b) => C.JulianDate.compare(a.t, b.t));\r\n for (const { t, lon, lat, height } of parsed) {\r\n spp.addSample(t, this.toCartesian(lon, lat, height));\r\n }\r\n (entity as any).position = spp;\r\n (entity as any)[CZMLPathManager.SAMPLES_KEY as any] = parsed.slice();\r\n if (parsed.length > 0) {\r\n this.ensureAvailability(entity, parsed[0].t, parsed[parsed.length - 1].t);\r\n }\r\n }\r\n\r\n clearPathSamples(entityOrId: Entity | string) {\r\n const entity = this.resolveEntity(entityOrId);\r\n if (!entity) return;\r\n const C: any = this.CesiumNS as any;\r\n (entity as any).position = new C.SampledPositionProperty();\r\n entity.availability = undefined as any;\r\n (entity as any)[CZMLPathManager.SAMPLES_KEY as any] = [];\r\n }\r\n\r\n setPathStyle(entityOrId: Entity | string, style: PathStyleOptions) {\r\n const entity = this.resolveEntity(entityOrId);\r\n if (!entity || !(entity as any).path) return;\r\n const path: any = (entity as any).path;\r\n if (style.width !== undefined) path.width = style.width as any;\r\n if (style.resolution !== undefined) path.resolution = style.resolution as any;\r\n if (style.leadTime !== undefined) path.leadTime = style.leadTime as any;\r\n if (style.trailTime !== undefined) path.trailTime = style.trailTime as any;\r\n if (style.material) path.material = style.material as any;\r\n else if (style.color) path.material = style.color as any;\r\n }\r\n\r\n /**\r\n * Build a CZML entity for a path + sampled position. Appends to target array and returns it.\r\n */\r\n exportEntityToCzml(entity: Entity, target: any[]): any | undefined {\r\n const C: any = this.CesiumNS as any;\r\n const spp: any = (entity as any).position;\r\n const path: any = (entity as any).path; // may be undefined in tests/headless envs\r\n if (!spp) return undefined;\r\n\r\n // Prefer our tracked samples\r\n const tracked: Array<{ t: Cesium.JulianDate; lon: number; lat: number; height: number }> = (\r\n entity as any\r\n )[CZMLPathManager.SAMPLES_KEY as any];\r\n\r\n let times: Cesium.JulianDate[] | undefined;\r\n let values: Cesium.Cartesian3[] | undefined;\r\n if (tracked && tracked.length > 0) {\r\n times = tracked.map((s) => s.t);\r\n } else {\r\n times = (spp as any)?._times as Cesium.JulianDate[] | undefined;\r\n values = (spp as any)?._values as Cesium.Cartesian3[] | undefined;\r\n if (!times || !values || times.length === 0 || values.length !== times.length)\r\n return undefined;\r\n }\r\n\r\n const epoch = times[0];\r\n const epochIso = C.JulianDate.toIso8601(epoch);\r\n const coords: number[] = [];\r\n if (tracked && tracked.length > 0) {\r\n for (let i = 0; i < tracked.length; i++) {\r\n const s = tracked[i];\r\n const seconds = C.JulianDate.secondsDifference(s.t, epoch);\r\n coords.push(seconds, s.lon, s.lat, s.height ?? 0);\r\n }\r\n } else if (values) {\r\n for (let i = 0; i < times.length; i++) {\r\n const t = times[i];\r\n const seconds = C.JulianDate.secondsDifference(t, epoch);\r\n const carto = C.Cartographic.fromCartesian(values[i]);\r\n coords.push(\r\n seconds,\r\n C.Math.toDegrees(carto.longitude),\r\n C.Math.toDegrees(carto.latitude),\r\n carto.height ?? 0,\r\n );\r\n }\r\n }\r\n\r\n const now = C.JulianDate.now();\r\n const colorToRgba = (color: any, fallback: [number, number, number, number]) => {\r\n if (!color) return fallback;\r\n try {\r\n const c = color.getValue ? color.getValue(now) : color;\r\n const r = Math.round((c.red ?? 1) * 255);\r\n const g = Math.round((c.green ?? 1) * 255);\r\n const b = Math.round((c.blue ?? 1) * 255);\r\n const a = Math.round((c.alpha ?? 1) * 255);\r\n return [r, g, b, a] as [number, number, number, number];\r\n } catch {\r\n return fallback;\r\n }\r\n };\r\n\r\n const width = path?.width?.getValue ? path.width.getValue(now) : (path?.width ?? 2);\r\n const res = path?.resolution?.getValue ? path.resolution.getValue(now) : path?.resolution;\r\n const lead = path?.leadTime?.getValue ? path.leadTime.getValue(now) : path?.leadTime;\r\n const trail = path?.trailTime?.getValue\r\n ? path.trailTime.getValue(now)\r\n : (path?.trailTime ?? 60);\r\n const rgba = colorToRgba(path?.material?.color ?? path?.material, [0, 255, 255, 255]);\r\n\r\n const id = (entity.id as string) || `path-${Math.random().toString(36).slice(2)}`;\r\n const name = (entity.name as string) || undefined;\r\n const description = (entity.description as any) || undefined;\r\n\r\n // Availability covers first to last sample\r\n const startIso = epochIso;\r\n const stopIso = C.JulianDate.toIso8601(times[times.length - 1]);\r\n\r\n const czmlEntity: any = {\r\n id,\r\n name,\r\n description,\r\n availability: `${startIso}/${stopIso}`,\r\n position: {\r\n epoch: epochIso,\r\n cartographicDegrees: coords,\r\n interpolationAlgorithm: 'LINEAR',\r\n },\r\n path: {\r\n width,\r\n material: { solidColor: { color: { rgba } } },\r\n resolution: res,\r\n leadTime: lead,\r\n trailTime: trail,\r\n },\r\n };\r\n target.push(czmlEntity);\r\n return czmlEntity;\r\n }\r\n\r\n // ======== Interactive Path (Polyline) Drawing & Editing ========\r\n // The following interactive helpers mirror PolygonEditor patterns but operate on polylines.\r\n\r\n /** Options for drawing a 3D path (polyline) with height. */\r\n startPathDrawing(\r\n options?: {\r\n layer?: Cesium.CustomDataSource;\r\n idPrefix?: string;\r\n /** Default altitude in meters when pick has no/low height. Defaults to 120. */\r\n defaultHeight?: number;\r\n /** Polyline style (width in px, material color). */\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n },\r\n onComplete?: (entity: Entity) => void,\r\n ): { stop: () => void } {\r\n return startPathDrawingImpl(\r\n this.CesiumNS as any,\r\n this.viewer as any,\r\n options as any,\r\n onComplete as any,\r\n );\r\n }\r\n\r\n /** Edit an existing 3D path (polyline). Supports vertex selection, keyboard movement and insertion. */\r\n startPathEditing(\r\n entityOrId: Entity | string,\r\n options?: {\r\n layer?: Cesium.CustomDataSource;\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n },\r\n ): { stop: () => void } | undefined {\r\n // Delegate to modular implementation via static import\r\n return startPathEditingImpl(\r\n this.CesiumNS as any,\r\n this.viewer as any,\r\n entityOrId as any,\r\n options,\r\n );\r\n }\r\n\r\n /**\r\n * Start flight simulation/preview for a wayline.\r\n * Animates an aircraft model along the wayline path with controls for play/pause/stop.\r\n * @param options - Configuration for the flight simulator\r\n * @returns A controller object with start/pause/resume/stop/destroy methods\r\n */\r\n startFlightPreview(options: FlightSimulatorOptions): FlightSimulatorController {\r\n const simulator = new FlightSimulator(\r\n this.CesiumNS as any,\r\n this.viewer as any,\r\n options,\r\n );\r\n return simulator;\r\n }\r\n\r\n // ensureLayerForEntity moved into path-editing module\r\n}\r\n","import type * as Cesium from 'cesium';\r\n// import { get } from 'http';\r\n\r\ntype Viewer = Cesium.Viewer;\r\n\r\nexport interface PolygonDrawingOptions {\r\n layer?: Cesium.CustomDataSource;\r\n idPrefix?: string;\r\n}\r\n\r\nexport interface PolygonEditingSession {\r\n stop: () => void;\r\n}\r\n\r\nexport class PolygonEditor {\r\n private handler?: Cesium.ScreenSpaceEventHandler;\r\n private drawingPositions: any[] = [];\r\n private tempPolyline?: Cesium.Entity;\r\n private tempPolygon?: Cesium.Entity;\r\n // Temporary point handles shown while drawing for better feedback\r\n private drawHandles: Cesium.Entity[] = [];\r\n // 橡皮筋效果:鼠标跟随的临时预览点(未确认的点)\r\n private rubberBandPoint?: Cesium.Entity;\r\n private editHandles: Cesium.Entity[] = [];\r\n private draggingIndex: number | undefined;\r\n // Remember the original position of the selected vertex to allow canceling on right-click\r\n private originalPositionOnDrag?: any;\r\n // Segment hover and highlight for inserting new vertex between two points\r\n private segmentHighlight?: Cesium.Entity;\r\n // Dynamic outline polyline kept in sync while editing\r\n private editOutline?: Cesium.Entity;\r\n // Store a preview point handle while hovering a segment\r\n private insertPreviewHandle?: Cesium.Entity;\r\n // Keyboard event handler for ESC and X keys during drawing\r\n private keydownHandler?: (event: KeyboardEvent) => void;\r\n // 保存编码前的原始名称,用于还原\r\n private originalPolygonNames: Map<string, { entityId: string; oldName: string; layerName: string }> = new Map();\r\n // 保存双击缩放是否被禁用的状态\r\n private doubleClickZoomDisabled = false;\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Viewer,\r\n ) {}\r\n\r\n /**\r\n * 根据图层名称获取颜色配置\r\n * @param layerName 图层名称 ('subarray' | 'inverter' | 其他)\r\n * @returns 颜色配置对象\r\n */\r\n getColorConfig(layerName: string): {\r\n lineColor: any; // 绘制时轮廓线颜色\r\n lineFinalColor: any; // 完成后轮廓线颜色\r\n faceColor: any; // 绘制/编辑时填充颜色\r\n faceFinalColor: any; // 完成后填充颜色\r\n pointColor: any; // 控制点颜色\r\n } {\r\n const C: any = this.CesiumNS as any;\r\n\r\n if (layerName === 'subarray') {\r\n return {\r\n lineColor: C.Color.fromCssColorString('rgba(218, 1, 26, 0.88)'),\r\n lineFinalColor: C.Color.fromCssColorString('rgba(218, 1, 27, 0.70)'),\r\n faceColor: C.Color.fromCssColorString('rgba(218, 1, 26, 0.49)'),\r\n faceFinalColor: C.Color.fromCssColorString('rgba(218, 1, 26, 0.14)'),\r\n pointColor: C.Color.WHITE,\r\n };\r\n } else if (layerName === 'inverter') {\r\n return {\r\n lineColor: C.Color.fromCssColorString('rgba(113, 183, 5, 0.90)'),\r\n lineFinalColor: C.Color.fromCssColorString('rgba(113, 183, 5, 0.70)'),\r\n faceColor: C.Color.fromCssColorString('rgba(113, 183, 5, 0.40)'),\r\n faceFinalColor: C.Color.fromCssColorString('rgba(113, 183, 5, 0.10)'),\r\n pointColor: C.Color.WHITE,\r\n };\r\n } else if (layerName === 'astrict') {\r\n return {\r\n lineColor: C.Color.fromCssColorString('rgba(217, 0, 27, 0.92)'),\r\n lineFinalColor: C.Color.fromCssColorString('rgba(217, 0, 27, 0.68)'),\r\n faceColor: C.Color.fromCssColorString('rgba(217, 0, 27, 0.4)'),\r\n faceFinalColor: C.Color.fromCssColorString('rgba(217, 0, 27, 0.1)'),\r\n pointColor: C.Color.WHITE,\r\n };\r\n } else if (layerName === 'rail') {\r\n return {\r\n lineColor: C.Color.fromCssColorString('rgba(2, 167, 240, 0.58)'),\r\n lineFinalColor: C.Color.fromCssColorString('rgba(2, 167, 240, 0.92)'),\r\n faceColor: C.Color.fromCssColorString('rgba(2, 167, 240, 0.4)'),\r\n faceFinalColor: C.Color.fromCssColorString('rgba(2, 167, 240, 0.1)'),\r\n pointColor: C.Color.WHITE,\r\n };\r\n } else if (layerName === 'feature') {\r\n return {\r\n lineColor: C.Color.fromCssColorString('rgba(245, 154, 35, 0.92)'),\r\n lineFinalColor: C.Color.fromCssColorString('rgba(245, 154, 35, 0.52)'),\r\n faceColor: C.Color.fromCssColorString('rgba(245, 154, 35, 0.4)'),\r\n faceFinalColor: C.Color.fromCssColorString('rgba(245, 154, 35, 0.1)'),\r\n pointColor: C.Color.WHITE,\r\n };\r\n } else {\r\n return {\r\n lineColor: C.Color.fromCssColorString('rgba(0,150,255,0.85)'),\r\n lineFinalColor: C.Color.fromCssColorString('rgba(0,150,255,0.85)'),\r\n faceColor: C.Color.fromCssColorString('rgba(255, 149, 0, 0.40)'),\r\n faceFinalColor: C.Color.fromCssColorString('rgba(255, 149, 0, 0.1)'),\r\n pointColor: C.Color.WHITE,\r\n };\r\n }\r\n }\r\n\r\n private getPositionFromMouse(movement: any): any | undefined {\r\n const scene: any = (this.viewer as any).scene;\r\n const winPos = movement?.position ?? movement?.endPosition ?? movement;\r\n if (!winPos) return undefined;\r\n let cart: any | undefined;\r\n try {\r\n cart = scene.pickPosition?.(winPos);\r\n } catch {}\r\n if (!cart) {\r\n const ray = (this.viewer.camera as any).getPickRay?.(winPos);\r\n cart = ray ? scene.globe?.pick?.(ray, scene) : undefined;\r\n }\r\n return cart;\r\n }\r\n\r\n /**\r\n *\r\n * @param fn 计算属性函数\r\n * @returns 计算函数返回值的CallbackProperty对象\r\n */\r\n private makeCallback<T>(fn: () => T): any {\r\n const C: any = this.CesiumNS as any;\r\n return new C.CallbackProperty(fn, false);\r\n }\r\n\r\n /**\r\n * 生成复杂唯一的 Entity ID\r\n * 格式: {timestamp}-{random}\r\n */\r\n private generateUniqueId(): string {\r\n const timestamp = Date.now().toString();\r\n const random = Math.floor(Math.random() * 1000000).toString().padStart(6, '0');\r\n return timestamp + random;\r\n }\r\n\r\n /**\r\n * 将轮廓线设置为虚线样式(公用方法)\r\n */\r\n applyDashedOutlineStyle(\r\n outlineEntity: any,\r\n color: any,\r\n width: number = 3,\r\n dashLength: number = 10\r\n ): void {\r\n try {\r\n if (!outlineEntity || !outlineEntity.polyline) {\r\n return;\r\n }\r\n \r\n const C: any = this.CesiumNS as any;\r\n \r\n outlineEntity.polyline.material = new C.PolylineDashMaterialProperty({\r\n color: color,\r\n dashLength: dashLength,\r\n gapColor: C.Color.TRANSPARENT,\r\n });\r\n \r\n outlineEntity.polyline.width = width;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] Failed to apply dashed outline style:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有图层中多边形的高亮状态\r\n */\r\n private clearAllPolygonHighlights(): void {\r\n try {\r\n const dataSources = this.viewer.dataSources;\r\n \r\n for (let i = 0; i < dataSources.length; i++) {\r\n const ds: any = dataSources.get(i);\r\n if (!ds || !ds.entities) continue;\r\n \r\n const layerName = ds.name || '';\r\n \r\n if (layerName !== 'subarray' && layerName !== 'inverter') {\r\n continue;\r\n }\r\n \r\n const entities = ds.entities.values;\r\n for (let j = 0; j < entities.length; j++) {\r\n const entity: any = entities[j];\r\n if (!entity) continue;\r\n \r\n const entityId = entity.id || '';\r\n const type = entity.type || layerName;\r\n const checked = entity.checked;\r\n \r\n if (entity.polygon && checked === true) {\r\n entity.checked = false;\r\n \r\n const colors = this.getColorConfig(type);\r\n \r\n try {\r\n entity.polygon.material = colors.faceFinalColor;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 清除多边形填充色失败:', e);\r\n }\r\n \r\n const outlineId = `${entityId}-outline`;\r\n const outlineEntity = ds.entities.getById(outlineId);\r\n if (outlineEntity && (outlineEntity as any).polyline) {\r\n try {\r\n this.applyDashedOutlineStyle(outlineEntity, colors.lineFinalColor, 3, 10);\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 清除多边形轮廓线失败:', e);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n console.warn('[PolygonEditor] clearAllPolygonHighlights error:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 创建轮廓线实体\r\n */\r\n private createOutlineEntity(\r\n layer: Cesium.CustomDataSource,\r\n polygonId: string,\r\n positions: any[] | (() => any[]),\r\n color: any,\r\n isDynamic: boolean = false\r\n ): any {\r\n try {\r\n const getPositions = () => {\r\n const arr = typeof positions === 'function' ? positions() : positions.slice();\r\n return arr.length > 1 ? arr.concat(arr[0]) : arr;\r\n };\r\n \r\n const outlineEntity = layer.entities.add({\r\n id: `${polygonId}-outline`,\r\n name: 'Polygon Outline',\r\n polyline: {\r\n positions: isDynamic ? this.makeCallback(getPositions) : getPositions(),\r\n width: isDynamic ? 4 : 3,\r\n material: color,\r\n clampToGround: true,\r\n },\r\n properties: { _ownerId: polygonId, _type: 'polygon-outline' },\r\n } as any);\r\n \r\n return outlineEntity;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] Failed to create outline entity:', e);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 创建标签实体\r\n */\r\n private createLabelEntity(\r\n layer: Cesium.CustomDataSource,\r\n polygonId: string,\r\n position: any,\r\n text: string,\r\n color: any\r\n ): any {\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n \r\n const labelEntity = layer.entities.add({\r\n id: `${polygonId}-label`,\r\n name: 'Polygon Label',\r\n position: position,\r\n label: {\r\n text: text,\r\n font: 'bold 16px Microsoft YaHei, SimHei, sans-serif',\r\n fillColor: color,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n style: C.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n pixelOffset: new C.Cartesian2(0, -10),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n clampToGround: true,\r\n },\r\n properties: { _ownerId: polygonId, _type: 'polygon-label' },\r\n } as any);\r\n \r\n return labelEntity;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] Failed to create label entity:', e);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 清理临时绘制元素\r\n */\r\n private cleanupDrawingTemporaries(layer: Cesium.CustomDataSource): void {\r\n try {\r\n if (this.tempPolyline) {\r\n layer.entities.remove(this.tempPolyline);\r\n this.tempPolyline = undefined as any;\r\n }\r\n \r\n if (this.tempPolygon) {\r\n layer.entities.remove(this.tempPolygon);\r\n this.tempPolygon = undefined as any;\r\n }\r\n \r\n if (this.rubberBandPoint) {\r\n try {\r\n layer.entities.remove(this.rubberBandPoint);\r\n } catch {}\r\n this.rubberBandPoint = undefined;\r\n }\r\n \r\n if (this.drawHandles && this.drawHandles.length > 0) {\r\n try {\r\n for (const h of this.drawHandles) {\r\n layer.entities.remove(h);\r\n }\r\n } catch {}\r\n this.drawHandles = [];\r\n }\r\n \r\n this.drawingPositions = [];\r\n } catch (e) {\r\n console.warn('[PolygonEditor] Failed to cleanup drawing temporaries:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 设置键盘事件监听器(ESC/X 键)\r\n */\r\n private setupKeyboardListener(callback: () => void): void {\r\n this.keydownHandler = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape' || event.key === 'x' || event.key === 'X') {\r\n callback();\r\n }\r\n };\r\n document.addEventListener('keydown', this.keydownHandler);\r\n }\r\n\r\n /**\r\n * 移除键盘事件监听器\r\n */\r\n private removeKeyboardListener(): void {\r\n if (this.keydownHandler) {\r\n document.removeEventListener('keydown', this.keydownHandler);\r\n this.keydownHandler = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * 销毁事件处理器\r\n */\r\n private destroyHandler(): void {\r\n try {\r\n this.handler?.destroy();\r\n } catch {}\r\n this.handler = undefined;\r\n }\r\n\r\n /**\r\n * 禁用 Cesium 默认的双击缩放行为\r\n * 在绘制/编辑过程中调用,防止双击导致相机乱飞\r\n */\r\n private disableDoubleClickZoom(): void {\r\n if (this.doubleClickZoomDisabled) return;\r\n \r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const cesiumWidget = (this.viewer as any).cesiumWidget;\r\n if (cesiumWidget?.screenSpaceEventHandler) {\r\n cesiumWidget.screenSpaceEventHandler.removeInputAction(\r\n C.ScreenSpaceEventType.LEFT_DOUBLE_CLICK\r\n );\r\n this.doubleClickZoomDisabled = true;\r\n }\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 禁用双击缩放失败:', e);\r\n }\r\n }\r\n\r\n /**\r\n * 恢复 Cesium 默认的双击缩放行为\r\n * 在绘制/编辑结束后调用\r\n */\r\n private restoreDoubleClickZoom(): void {\r\n if (!this.doubleClickZoomDisabled) return;\r\n \r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const viewer = this.viewer as any;\r\n const cesiumWidget = viewer.cesiumWidget;\r\n \r\n if (cesiumWidget?.screenSpaceEventHandler) {\r\n // 重新绑定双击缩放事件\r\n cesiumWidget.screenSpaceEventHandler.setInputAction(\r\n (movement: any) => {\r\n try {\r\n // Cesium 默认的双击行为:飞向点击位置\r\n const pickedObject = viewer.scene.pick(movement.position);\r\n if (pickedObject?.id && viewer.trackedEntity !== pickedObject.id) {\r\n viewer.flyTo(pickedObject.id, { duration: 1.5 });\r\n }\r\n } catch {}\r\n },\r\n C.ScreenSpaceEventType.LEFT_DOUBLE_CLICK\r\n );\r\n this.doubleClickZoomDisabled = false;\r\n }\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 恢复双击缩放失败:', e);\r\n this.doubleClickZoomDisabled = false;\r\n }\r\n }\r\n\r\n /**\r\n * 完成编辑/绘制的通用清理逻辑\r\n */\r\n private finalizePolygonSession(\r\n layer: Cesium.CustomDataSource,\r\n onComplete?: (entity: Cesium.Entity) => void,\r\n entity?: Cesium.Entity\r\n ): void {\r\n this.destroyHandler();\r\n this.removeKeyboardListener();\r\n this.restoreDoubleClickZoom();\r\n \r\n if (entity && onComplete) {\r\n onComplete(entity);\r\n }\r\n }\r\n\r\n /**\r\n * 创建polygon绘制会话,允许用户通过鼠标交互绘制多边形。\r\n * @param type 多边形类型\r\n * @param layer 自定义图层对象\r\n * @param onComplete 结果回调函数,参数为新创建的多边形实体\r\n * @returns 返回一个polygon绘制会话对象\r\n */\r\n startDrawing(\r\n type: string,\r\n layer?: Cesium.CustomDataSource,\r\n onComplete?: (entity: Cesium.Entity) => void,\r\n ): { stop: () => void } {\r\n const C: any = this.CesiumNS as any;\r\n \r\n if(layer == null) {\r\n console.warn(\"PolygonEditor.startDrawing: layer is null, return without starting drawing.\");\r\n return { stop: () => {} };\r\n }\r\n \r\n const colors = this.getColorConfig(type);\r\n const line_color = colors.lineColor;\r\n const line_fina_color = colors.lineFinalColor;\r\n const face_color = colors.faceColor;\r\n const face_fina_color = colors.faceFinalColor;\r\n const point_color = colors.pointColor;\r\n \r\n let nameStr = '';\r\n\r\n if('subarray'==type){\r\n const polygonCount = layer.entities.values.filter((e: any) => e.polygon).length;\r\n nameStr = 'subarray_#'+(polygonCount+1).toString().padStart(2, '0');\r\n }else if('inverter'==type){\r\n const polygonCount = layer.entities.values.filter((e: any) => e.polygon).length;\r\n const count = polygonCount + 1;\r\n const z = count % 100 === 0 ? 99 : (count % 100);\r\n const y = Math.floor((count - 1) / 100);\r\n nameStr = `inverter_GX.${y}.${z}`;\r\n }else{\r\n const polygonCount = layer.entities.values.filter((e: any) => \r\n e.polygon || e.point || e.ellipse \r\n ).length;\r\n nameStr = `${type}_`+(polygonCount+1).toString().padStart(2, '0');;\r\n }\r\n\r\n this.clearAllPolygonHighlights();\r\n\r\n this.stopInternal(layer);\r\n this.disableDoubleClickZoom();\r\n this.drawingPositions = [];\r\n this.drawHandles = [];\r\n this.rubberBandPoint = undefined;\r\n \r\n let currentPreviewPosition: any = null;\r\n\r\n const getDrawingPositionsWithPreview = () => {\r\n const positions = this.drawingPositions.slice();\r\n if (currentPreviewPosition) {\r\n positions.push(currentPreviewPosition);\r\n }\r\n return positions.filter((p: any) => p && typeof p === 'object' && p.x !== undefined && p.y !== undefined && p.z !== undefined);\r\n };\r\n\r\n this.tempPolyline = layer.entities.add({\r\n polyline: {\r\n positions: this.makeCallback(() => {\r\n const arr = getDrawingPositionsWithPreview();\r\n if (arr.length < 2) {\r\n return [];\r\n }\r\n const result = arr.length > 1 ? arr.concat(arr[0]) : arr;\r\n return result.filter((p: any) => p && typeof p === 'object' && p.x !== undefined && p.y !== undefined && p.z !== undefined);\r\n }),\r\n width: 1,\r\n material: line_color,\r\n clampToGround: true,\r\n },\r\n });\r\n\r\n this.tempPolygon = layer.entities.add({\r\n polygon: {\r\n hierarchy: this.makeCallback(() => ({\r\n positions: getDrawingPositionsWithPreview().length >= 3 ? getDrawingPositionsWithPreview() : [],\r\n })),\r\n material: face_color,\r\n outline: false,\r\n },\r\n } as any);\r\n\r\n this.handler = new (this.CesiumNS as any).ScreenSpaceEventHandler(\r\n (this.viewer.scene as any).canvas,\r\n );\r\n\r\n this.handler &&\r\n this.handler.setInputAction(\r\n (movement: any) => {\r\n // 🔧 修复: 立即清除可能被其他组件(如Selector)设置的选择状态\r\n // 防止点击时其他图层的实体被高亮\r\n try {\r\n const dataSources = this.viewer.dataSources;\r\n for (let i = 0; i < dataSources.length; i++) {\r\n const ds: any = dataSources.get(i);\r\n if (ds && ds.entities && ds.name !== layer.name) { // 跳过当前绘制的图层\r\n const entities = ds.entities.values;\r\n for (let j = 0; j < entities.length; j++) {\r\n const entity: any = entities[j];\r\n if (entity.polygon && entity.polygon.material) {\r\n const material = entity.polygon.material;\r\n if (material && typeof material.getValue === 'function') {\r\n const currentColor = material.getValue((this.viewer as any).clock.currentTime);\r\n // 检查是否是高亮的黄色 (255, 255, 0)\r\n if (currentColor && currentColor.red === 1 && \r\n currentColor.green === 1 && currentColor.blue === 0) {\r\n const colors = this.getColorConfig(type);\r\n entity.polygon.material = colors.faceFinalColor;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n // 忽略错误\r\n }\r\n \r\n // 将屏幕坐标转换为世界坐标(Cartesian3)\r\n const p = this.getPositionFromMouse(movement);\r\n if (p) {\r\n // 将新顶点加入顶点数组\r\n this.drawingPositions.push(p);\r\n const handle = (layer.entities as any).add({\r\n position: p,\r\n point: {\r\n pixelSize: 7,\r\n color: point_color,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n },\r\n } as any);\r\n this.drawHandles.push(handle);\r\n\r\n if (this.drawingPositions.length === 1 && !this.rubberBandPoint) {\r\n currentPreviewPosition = p;\r\n this.rubberBandPoint = (layer.entities as any).add({\r\n position: this.makeCallback(() => currentPreviewPosition),\r\n point: {\r\n pixelSize: 7,\r\n color: C.Color.YELLOW.withAlpha(0.6),\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n },\r\n } as any);\r\n }\r\n }\r\n },\r\n (this.CesiumNS as any).ScreenSpaceEventType.LEFT_CLICK,\r\n );\r\n\r\n this.handler &&\r\n this.handler.setInputAction(\r\n (movement: any) => {\r\n if (this.drawingPositions.length > 0 && this.rubberBandPoint) {\r\n const p = this.getPositionFromMouse(movement);\r\n if (p) {\r\n currentPreviewPosition = p;\r\n }\r\n }\r\n },\r\n (this.CesiumNS as any).ScreenSpaceEventType.MOUSE_MOVE,\r\n );\r\n\r\n const finishDrawing = () => {\r\n if (this.drawingPositions.length >= 3) {\r\n const id = this.generateUniqueId();\r\n const entity = layer.entities.add({\r\n id,\r\n name_str: nameStr,\r\n name: '',\r\n shape: 'polygon',\r\n type: type,\r\n checked: false,\r\n polygon: {\r\n hierarchy: this.drawingPositions.slice(),\r\n material: face_fina_color,\r\n outline: false,\r\n },\r\n } as any);\r\n \r\n const ring = this.drawingPositions.slice();\r\n const outlineEntity = this.createOutlineEntity(layer, id, ring, line_fina_color, false);\r\n if (outlineEntity) {\r\n this.applyDashedOutlineStyle(outlineEntity, line_fina_color, 3, 10);\r\n }\r\n \r\n if (nameStr && this.drawingPositions.length > 0) {\r\n this.createLabelEntity(layer, id, this.drawingPositions[0], '', line_fina_color);\r\n }\r\n \r\n this.cleanupDrawingTemporaries(layer);\r\n \r\n this.finalizePolygonSession(layer, onComplete, entity);\r\n } else {\r\n this.cleanupDrawingTemporaries(layer);\r\n this.destroyHandler();\r\n }\r\n };\r\n\r\n this.handler &&\r\n this.handler.setInputAction(finishDrawing, (this.CesiumNS as any).ScreenSpaceEventType.RIGHT_CLICK);\r\n\r\n this.setupKeyboardListener(finishDrawing);\r\n\r\n // 返回会话对象:提供 stop() 方法用于手动终止绘制\r\n return { stop: () => this.stopInternal(layer) };\r\n }\r\n\r\n private stopInternal(layer?: Cesium.CustomDataSource) {\r\n if (layer) {\r\n this.cleanupDrawingTemporaries(layer);\r\n }\r\n this.destroyHandler();\r\n this.removeKeyboardListener();\r\n this.restoreDoubleClickZoom();\r\n }\r\n\r\n /**\r\n * 开始编辑多边形\r\n * @param polygonEntity 要编辑的多边形实体\r\n * @param layer 多边形所属的图层\r\n * @param onComplete 编辑完成回调函数\r\n * @returns 返回编辑会话对象\r\n */\r\n startEditing(\r\n polygonEntity: Cesium.Entity,\r\n layer: Cesium.CustomDataSource,\r\n onComplete?: (entity: Cesium.Entity) => void,\r\n ): PolygonEditingSession {\r\n const C: any = this.CesiumNS as any;\r\n this.cleanupHandles(layer);\r\n this.disableDoubleClickZoom();\r\n\r\n const colors = this.getColorConfig(layer.name);\r\n const line_color = colors.lineColor;\r\n const line_fina_color = colors.lineFinalColor;\r\n const point_color = colors.pointColor;\r\n const face_color = colors.faceColor;\r\n const face_fina_color = colors.faceFinalColor;\r\n\r\n const getPositions = (): any[] => {\r\n const h = (polygonEntity.polygon as any)?.hierarchy;\r\n // 如果 hierarchy 是 CallbackProperty,需要调用 getValue\r\n const value = typeof h?.getValue === 'function' ? h.getValue(C.JulianDate.now()) : h;\r\n const arr = value?.positions ?? value ?? [];\r\n return arr.slice(); // 返回副本避免外部修改\r\n };\r\n // 获取当前多边形的所有顶点(编辑过程中会动态修改此数组)\r\n let positions = getPositions();\r\n\r\n try {\r\n if ((polygonEntity as any).polygon) {\r\n (polygonEntity as any).polygon.outline = false;\r\n (polygonEntity as any).polygon.material = face_color;\r\n }\r\n } catch {}\r\n\r\n this.editHandles = positions.map((p, i) =>\r\n layer.entities.add({\r\n position: p,\r\n point: { pixelSize: 7, color: point_color },\r\n properties: { _vertexIndex: i },\r\n } as any),\r\n );\r\n\r\n (polygonEntity.polygon as any).hierarchy = this.makeCallback(() => ({ positions }));\r\n\r\n try {\r\n const values: any[] = ((layer.entities as any).values ?? []) as any[];\r\n const found = values.find(\r\n (e: any) =>\r\n e?.polyline &&\r\n (e.properties?._ownerId?.getValue?.() ?? e.properties?._ownerId) ===\r\n (polygonEntity as any).id,\r\n );\r\n\r\n if (found) {\r\n // 找到已存在的轮廓线,将其改为动态更新(绑定 positions 数组)\r\n this.editOutline = found as any;\r\n (this.editOutline as any).polyline.positions = this.makeCallback(() => {\r\n const arr = positions.slice();\r\n return arr.length > 1 ? arr.concat(arr[0]) : arr; // 首尾相连形成闭合环\r\n });\r\n (this.editOutline as any).polyline.material = line_color;\r\n (this.editOutline as any).polyline.width = 1;\r\n } else {\r\n // 未找到轮廓线,新建一个并绑定动态 positions\r\n this.editOutline = layer.entities.add({\r\n id: `${(polygonEntity as any).id}-outline`,\r\n name: 'Polygon Outline',\r\n polyline: {\r\n positions: this.makeCallback(() => {\r\n const arr = positions.slice();\r\n return arr.length > 1 ? arr.concat(arr[0]) : arr;\r\n }),\r\n width: 1,\r\n material: line_color,\r\n clampToGround: true,\r\n },\r\n properties: { _ownerId: (polygonEntity as any).id, _type: 'polygon-outline' },\r\n } as any);\r\n }\r\n } catch {}\r\n\r\n this.handler = new (this.CesiumNS as any).ScreenSpaceEventHandler(\r\n (this.viewer.scene as any).canvas,\r\n );\r\n\r\n const computeNearestSegmentFromPoint = (\r\n cart: any,\r\n ): { i: number; t: number; dist: number } | undefined => {\r\n try {\r\n let bestIdx: number | undefined;\r\n let bestDist = Number.POSITIVE_INFINITY;\r\n let bestT = 0.5;\r\n const n = positions.length;\r\n if (n >= 2) {\r\n const Cany: any = this.CesiumNS as any;\r\n for (let i = 0; i < n; i++) {\r\n const j = (i + 1) % n;\r\n const p1 = positions[i];\r\n const p2 = positions[j];\r\n const v1 = Cany.Cartesian3.subtract(p2, p1, new Cany.Cartesian3());\r\n const v2 = Cany.Cartesian3.subtract(cart, p1, new Cany.Cartesian3());\r\n const len2 = Cany.Cartesian3.dot(v1, v1);\r\n let t = 0;\r\n let proj;\r\n if (len2 > 0) {\r\n t = Cany.Cartesian3.dot(v2, v1) / len2;\r\n t = Math.max(0, Math.min(1, t));\r\n proj = Cany.Cartesian3.add(\r\n p1,\r\n Cany.Cartesian3.multiplyByScalar(v1, t, new Cany.Cartesian3()),\r\n new Cany.Cartesian3(),\r\n );\r\n } else {\r\n proj = p1;\r\n t = 0;\r\n }\r\n const d = Cany.Cartesian3.distance(cart, proj);\r\n if (d < bestDist) {\r\n bestDist = d;\r\n bestIdx = i;\r\n bestT = t;\r\n }\r\n }\r\n }\r\n if (bestIdx === undefined) return undefined;\r\n return { i: bestIdx, t: bestT, dist: bestDist };\r\n } catch {\r\n return undefined;\r\n }\r\n };\r\n\r\n this.handler &&\r\n this.handler.setInputAction(\r\n (movement: any) => {\r\n // 拾取鼠标点击位置的实体\r\n const picked = (this.viewer.scene as any).pick?.(movement.position);\r\n const entity = picked?.id as Cesium.Entity | undefined;\r\n // 尝试从实体的 properties 中获取顶点索引(用于识别控制点)\r\n const idx =\r\n (entity as any)?.properties?._vertexIndex?.getValue?.() ??\r\n (entity as any)?.properties?._vertexIndex;\r\n\r\n if (this.draggingIndex === undefined) {\r\n // 当前没有选中的顶点\r\n if (typeof idx === 'number') {\r\n this.draggingIndex = idx;\r\n this.originalPositionOnDrag = positions[idx];\r\n if (this.segmentHighlight) {\r\n try {\r\n (layer.entities as any).remove(this.segmentHighlight);\r\n } catch {}\r\n this.segmentHighlight = undefined;\r\n }\r\n if (this.insertPreviewHandle) {\r\n try {\r\n (layer.entities as any).remove(this.insertPreviewHandle);\r\n } catch {}\r\n this.insertPreviewHandle = undefined;\r\n }\r\n } else {\r\n const clicked = this.getPositionFromMouse(movement);\r\n if (!clicked) return;\r\n let insertIndex = positions.length;\r\n if (positions.length >= 2) {\r\n const nearestWS = computeNearestSegmentFromPoint(clicked);\r\n if (nearestWS && typeof nearestWS.i === 'number') {\r\n insertIndex = nearestWS.i + 1; // 在线段 i→j 之间插入,索引为 i+1\r\n }\r\n }\r\n const insertPoint = clicked;\r\n positions.splice(insertIndex, 0, insertPoint);\r\n const newHandle = layer.entities.add({\r\n position: insertPoint,\r\n point: { pixelSize: 7, color: point_color },\r\n properties: { _vertexIndex: insertIndex },\r\n } as any);\r\n this.editHandles.splice(insertIndex, 0, newHandle);\r\n this.editHandles.forEach((h, k) => {\r\n try {\r\n (h as any).properties = { _vertexIndex: k } as any;\r\n } catch {}\r\n });\r\n this.draggingIndex = insertIndex;\r\n this.originalPositionOnDrag = insertPoint;\r\n if (this.segmentHighlight) {\r\n try {\r\n (layer.entities as any).remove(this.segmentHighlight);\r\n } catch {}\r\n this.segmentHighlight = undefined;\r\n }\r\n if (this.insertPreviewHandle) {\r\n try {\r\n (layer.entities as any).remove(this.insertPreviewHandle);\r\n } catch {}\r\n this.insertPreviewHandle = undefined;\r\n }\r\n }\r\n } else {\r\n this.draggingIndex = undefined;\r\n this.originalPositionOnDrag = undefined;\r\n }\r\n },\r\n (this.CesiumNS as any).ScreenSpaceEventType.LEFT_CLICK,\r\n );\r\n\r\n this.handler &&\r\n this.handler.setInputAction(\r\n (movement: any) => {\r\n const scene: any = (this.viewer as any).scene;\r\n if (this.draggingIndex !== undefined) {\r\n // 拖拽模式:更新正在拖拽的顶点位置\r\n const p = this.getPositionFromMouse(movement);\r\n if (!p) return;\r\n positions[this.draggingIndex] = p; // 更新顶点位置数组\r\n const handle = this.editHandles[this.draggingIndex];\r\n if (handle) (handle as any).position = p;\r\n if (this.segmentHighlight) {\r\n try {\r\n (layer.entities as any).remove(this.segmentHighlight);\r\n } catch {}\r\n this.segmentHighlight = undefined;\r\n }\r\n if (this.insertPreviewHandle) {\r\n try {\r\n (layer.entities as any).remove(this.insertPreviewHandle);\r\n } catch {}\r\n this.insertPreviewHandle = undefined;\r\n }\r\n return;\r\n }\r\n try {\r\n const winPos = movement?.endPosition ?? movement?.position ?? movement;\r\n if (!winPos) return;\r\n const ST: any = (this.CesiumNS as any).SceneTransforms;\r\n const threshold = 8;\r\n let bestIdx: number | undefined;\r\n let bestDist = Number.POSITIVE_INFINITY;\r\n let bestT: number | undefined; // 投影在线段上的位置比例 [0,1]\r\n const n = positions.length;\r\n if (n >= 2) {\r\n // 遍历所有线段,找出距离鼠标最近的线段\r\n for (let i = 0; i < n; i++) {\r\n const j = (i + 1) % n; // 闭合环\r\n const p1 = positions[i];\r\n const p2 = positions[j];\r\n // 将世界坐标转换为屏幕坐标\r\n const c1 = ST.wgs84ToWindowCoordinates?.(scene, p1);\r\n const c2 = ST.wgs84ToWindowCoordinates?.(scene, p2);\r\n if (!c1 || !c2) continue;\r\n const x = winPos.x,\r\n y = winPos.y;\r\n const x1 = c1.x,\r\n y1 = c1.y;\r\n const x2 = c2.x,\r\n y2 = c2.y;\r\n const dx = x2 - x1,\r\n dy = y2 - y1;\r\n const len2 = dx * dx + dy * dy;\r\n let t = 0;\r\n let dist;\r\n if (len2 === 0) {\r\n // 线段退化为点\r\n dist = Math.hypot(x - x1, y - y1);\r\n t = 0;\r\n } else {\r\n // 计算鼠标在线段上的投影位置比例 t\r\n t = ((x - x1) * dx + (y - y1) * dy) / len2;\r\n t = Math.max(0, Math.min(1, t)); // 限制在 [0,1] 范围\r\n const px = x1 + t * dx,\r\n py = y1 + t * dy;\r\n dist = Math.hypot(x - px, y - py); // 屏幕像素距离\r\n }\r\n if (dist < bestDist) {\r\n bestDist = dist;\r\n bestIdx = i;\r\n bestT = t;\r\n }\r\n }\r\n }\r\n if (bestIdx !== undefined && bestDist <= threshold) {\r\n const i = bestIdx;\r\n const j = (i + 1) % positions.length;\r\n if (!this.segmentHighlight) {\r\n // 创建绿色高亮线段\r\n this.segmentHighlight = layer.entities.add({\r\n polyline: {\r\n positions: [positions[i], positions[j]],\r\n width: 1,\r\n material: C.Color.LIME,\r\n clampToGround: true,\r\n },\r\n } as any);\r\n } else {\r\n // 更新高亮线段的位置\r\n (this.segmentHighlight as any).polyline.positions = [positions[i], positions[j]];\r\n }\r\n try {\r\n const Cany: any = this.CesiumNS as any;\r\n const p1 = positions[i];\r\n const p2 = positions[j];\r\n const tt = Math.max(0, Math.min(1, bestT ?? 0.5));\r\n // 使用线性插值计算插入预览点的世界坐标\r\n const preview = Cany.Cartesian3.lerp\r\n ? Cany.Cartesian3.lerp(p1, p2, tt, new Cany.Cartesian3())\r\n : new Cany.Cartesian3(\r\n p1.x + (p2.x - p1.x) * tt,\r\n p1.y + (p2.y - p1.y) * tt,\r\n p1.z + (p2.z - p1.z) * tt,\r\n );\r\n if (!this.insertPreviewHandle) {\r\n // 创建插入预览控制点(白色小圆点)\r\n this.insertPreviewHandle = layer.entities.add({\r\n position: preview,\r\n point: {\r\n pixelSize: 7,\r\n color: point_color,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n },\r\n properties: { _type: 'insert-preview' },\r\n } as any);\r\n } else {\r\n // 更新插入预览控制点的位置\r\n (this.insertPreviewHandle as any).position = preview;\r\n }\r\n } catch {}\r\n } else {\r\n if (this.segmentHighlight) {\r\n try {\r\n (layer.entities as any).remove(this.segmentHighlight);\r\n } catch {}\r\n this.segmentHighlight = undefined;\r\n }\r\n if (this.insertPreviewHandle) {\r\n try {\r\n (layer.entities as any).remove(this.insertPreviewHandle);\r\n } catch {}\r\n this.insertPreviewHandle = undefined;\r\n }\r\n }\r\n } catch {}\r\n },\r\n (this.CesiumNS as any).ScreenSpaceEventType.MOUSE_MOVE,\r\n );\r\n\r\n const finishEditing = () => {\r\n if (this.draggingIndex !== undefined && this.originalPositionOnDrag) {\r\n positions[this.draggingIndex] = this.originalPositionOnDrag;\r\n const handle = this.editHandles[this.draggingIndex];\r\n if (handle) (handle as any).position = this.originalPositionOnDrag;\r\n this.draggingIndex = undefined;\r\n this.originalPositionOnDrag = undefined;\r\n }\r\n if (this.segmentHighlight) {\r\n try {\r\n (layer.entities as any).remove(this.segmentHighlight);\r\n } catch {}\r\n this.segmentHighlight = undefined;\r\n }\r\n if (this.insertPreviewHandle) {\r\n try {\r\n (layer.entities as any).remove(this.insertPreviewHandle);\r\n } catch {}\r\n this.insertPreviewHandle = undefined;\r\n }\r\n this.cleanupHandles(layer);\r\n try {\r\n if (this.editOutline) {\r\n const finalRing = positions.slice();\r\n if (finalRing.length > 1) finalRing.push(finalRing[0]);\r\n (this.editOutline as any).polyline.positions = finalRing;\r\n \r\n this.applyDashedOutlineStyle(this.editOutline, line_fina_color, 3, 10);\r\n }\r\n } catch {}\r\n try {\r\n if ((polygonEntity as any).polygon) {\r\n (polygonEntity as any).polygon.hierarchy = positions.slice();\r\n }\r\n } catch {}\r\n try {\r\n if ((polygonEntity as any).polygon) {\r\n (polygonEntity as any).polygon.material = face_fina_color;\r\n }\r\n } catch {}\r\n try {\r\n this.handler?.destroy();\r\n } catch {}\r\n this.handler = undefined;\r\n \r\n if (this.keydownHandler) {\r\n document.removeEventListener('keydown', this.keydownHandler);\r\n this.keydownHandler = undefined;\r\n }\r\n \r\n onComplete?.(polygonEntity);\r\n };\r\n \r\n this.handler &&\r\n this.handler.setInputAction(\r\n finishEditing,\r\n (this.CesiumNS as any).ScreenSpaceEventType.RIGHT_CLICK,\r\n );\r\n\r\n this.setupKeyboardListener(finishEditing);\r\n\r\n return {\r\n stop: () => {\r\n // 清理所有控制点\r\n this.cleanupHandles(layer);\r\n try {\r\n if (this.editOutline) {\r\n const finalRing = positions.slice();\r\n if (finalRing.length > 1) finalRing.push(finalRing[0]); // 闭合环\r\n (this.editOutline as any).polyline.positions = finalRing;\r\n \r\n this.applyDashedOutlineStyle(this.editOutline, line_fina_color, 3, 10);\r\n }\r\n } catch {}\r\n // 将多边形的 hierarchy 改为静态值(不再动态更新)\r\n try {\r\n if ((polygonEntity as any).polygon) {\r\n (polygonEntity as any).polygon.hierarchy = positions.slice();\r\n }\r\n if ((polygonEntity as any).polygon) {\r\n (polygonEntity as any).polygon.hierarchy = positions.slice();\r\n }\r\n } catch {}\r\n try {\r\n if ((polygonEntity as any).polygon) {\r\n (polygonEntity as any).polygon.material = face_fina_color;\r\n }\r\n } catch {}\r\n \r\n this.finalizePolygonSession(layer, onComplete, polygonEntity);\r\n },\r\n };\r\n }\r\n\r\n private cleanupHandles(layer: Cesium.CustomDataSource) {\r\n try {\r\n for (const h of this.editHandles) (layer.entities as any).remove(h);\r\n } catch {}\r\n this.editHandles = [];\r\n this.draggingIndex = undefined;\r\n }\r\n\r\n /**\r\n * 计算多边形的周长和面积\r\n */\r\n calculatePolygonPerimeterAndArea(\r\n points: Array<{ lon: number; lat: number; height?: number }>\r\n ): { perimeter: number; area: number } {\r\n if (!points || points.length < 3) {\r\n return { perimeter: 0, area: 0 };\r\n }\r\n\r\n const C = this.CesiumNS as any;\r\n const ellipsoid = C.Ellipsoid.WGS84;\r\n\r\n const positions = points.map((pt) =>\r\n C.Cartesian3.fromDegrees(pt.lon, pt.lat, 0)\r\n );\r\n\r\n let perimeter = 0;\r\n for (let i = 0; i < positions.length; i++) {\r\n const p1 = positions[i];\r\n const p2 = positions[(i + 1) % positions.length];\r\n const distance = C.Cartesian3.distance(p1, p2);\r\n perimeter += distance;\r\n }\r\n\r\n try {\r\n const polygonGeometry = new C.PolygonGeometry({\r\n polygonHierarchy: new C.PolygonHierarchy(positions),\r\n ellipsoid: ellipsoid,\r\n });\r\n\r\n const geometry = C.PolygonGeometry.createGeometry(polygonGeometry);\r\n \r\n if (geometry && geometry.attributes && geometry.attributes.position) {\r\n const positionAttribute = geometry.attributes.position.values;\r\n const indices = geometry.indices;\r\n \r\n let area = 0;\r\n \r\n if (indices) {\r\n for (let i = 0; i < indices.length; i += 3) {\r\n const i0 = indices[i] * 3;\r\n const i1 = indices[i + 1] * 3;\r\n const i2 = indices[i + 2] * 3;\r\n\r\n const v0 = new C.Cartesian3(\r\n positionAttribute[i0],\r\n positionAttribute[i0 + 1],\r\n positionAttribute[i0 + 2]\r\n );\r\n const v1 = new C.Cartesian3(\r\n positionAttribute[i1],\r\n positionAttribute[i1 + 1],\r\n positionAttribute[i1 + 2]\r\n );\r\n const v2 = new C.Cartesian3(\r\n positionAttribute[i2],\r\n positionAttribute[i2 + 1],\r\n positionAttribute[i2 + 2]\r\n );\r\n\r\n const ab = C.Cartesian3.subtract(v1, v0, new C.Cartesian3());\r\n const ac = C.Cartesian3.subtract(v2, v0, new C.Cartesian3());\r\n const cross = C.Cartesian3.cross(ab, ac, new C.Cartesian3());\r\n const triangleArea = C.Cartesian3.magnitude(cross) / 2.0;\r\n \r\n area += triangleArea;\r\n }\r\n }\r\n\r\n return {\r\n perimeter: perimeter,\r\n area: area,\r\n };\r\n }\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 面积计算失败,使用近似算法:', e);\r\n }\r\n\r\n let area = 0;\r\n const radiusSquared = ellipsoid.maximumRadius * ellipsoid.maximumRadius;\r\n \r\n for (let i = 0; i < positions.length; i++) {\r\n const p1 = positions[i];\r\n const p2 = positions[(i + 1) % positions.length];\r\n \r\n const cartographic1 = ellipsoid.cartesianToCartographic(p1);\r\n const cartographic2 = ellipsoid.cartesianToCartographic(p2);\r\n \r\n const lat1 = cartographic1.latitude;\r\n const lat2 = cartographic2.latitude;\r\n const lon1 = cartographic1.longitude;\r\n const lon2 = cartographic2.longitude;\r\n \r\n area += (lon2 - lon1) * (2 + Math.sin(lat1) + Math.sin(lat2));\r\n }\r\n \r\n area = Math.abs(area * radiusSquared / 2.0);\r\n\r\n return {\r\n perimeter: perimeter,\r\n area: area,\r\n };\r\n }\r\n\r\n /**\r\n * 从点位数组创建一个多边形及其轮廓线和标签\r\n * @param options 创建选项\r\n * - layer: 目标图层 (CustomDataSource)\r\n * - id: 实体ID\r\n * - name: 实体名称\r\n * - points: 点位数组 [{ lon, lat, height }]\r\n * @returns 创建的主多边形实体,如果失败则返回 null\r\n */\r\n createPolygonFromPoints(options: {\r\n layer: Cesium.CustomDataSource;\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height?: number }>;\r\n }): Cesium.Entity | null {\r\n const C = this.CesiumNS as any;\r\n const { layer, id, name, points } = options;\r\n\r\n // 1. 验证点位数量\r\n if (!points || points.length < 3) {\r\n console.warn(`[PolygonEditor] 顶点不足 3 个,无法创建多边形`);\r\n return null;\r\n }\r\n\r\n // 2. 获取图层对应的颜色配置\r\n const colors = this.getColorConfig(layer.name);\r\n const lineColor = colors.lineFinalColor;\r\n const faceColor = colors.faceFinalColor;\r\n\r\n // 3. 转换点位为 Cartesian3\r\n const positions = points.map((pt) =>\r\n C.Cartesian3.fromDegrees(pt.lon, pt.lat, pt.height || 0)\r\n );\r\n\r\n try {\r\n // 4. 创建多边形实体(贴合地形)\r\n const entity = layer.entities.add({\r\n id,\r\n name,\r\n polygon: {\r\n hierarchy: positions,\r\n material: faceColor,\r\n outline: false,\r\n // 🔧 修复:设置 heightReference 使多边形贴合地形\r\n heightReference: C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n } as any);\r\n\r\n // 5. 创建轮廓线(贴合地形)\r\n const ring = positions.slice();\r\n ring.push(ring[0]);\r\n const outlineEntity = layer.entities.add({\r\n id: `${id}-outline`,\r\n name: 'Polygon Outline',\r\n polyline: {\r\n positions: ring,\r\n width: 1,\r\n material: lineColor,\r\n clampToGround: true, // 轮廓线已经设置了 clampToGround\r\n },\r\n properties: { _ownerId: id, _type: 'polygon-outline' },\r\n } as any);\r\n\r\n this.applyDashedOutlineStyle(outlineEntity, lineColor, 3, 10);\r\n\r\n // 6. 创建标签 - 使用地形采样获取正确高度\r\n const displayText = name.includes('_') ? name.split('_')[1] : name;\r\n const firstPoint = points[0];\r\n\r\n // 异步获取地形高度并创建标签\r\n this.createLabelWithTerrainHeight(\r\n layer,\r\n id,\r\n displayText,\r\n firstPoint.lon,\r\n firstPoint.lat,\r\n lineColor,\r\n );\r\n\r\n return entity;\r\n } catch (err) {\r\n console.error(`[PolygonEditor] 创建多边形失败:`, err);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * 辅助方法:使用地形采样创建标签\r\n * 先尝试获取地形高度,如果失败则使用 heightReference\r\n */\r\n private async createLabelWithTerrainHeight(\r\n layer: Cesium.CustomDataSource,\r\n ownerId: string,\r\n displayText: string,\r\n lon: number,\r\n lat: number,\r\n lineColor: any,\r\n ): Promise<void> {\r\n const C = this.CesiumNS as any;\r\n\r\n try {\r\n // 尝试获取地形高度\r\n let terrainHeight = 0;\r\n const terrainProvider = this.viewer.terrainProvider;\r\n\r\n if (terrainProvider && typeof C.sampleTerrainMostDetailed === 'function') {\r\n try {\r\n const positions = [C.Cartographic.fromDegrees(lon, lat)];\r\n const updatedPositions = await C.sampleTerrainMostDetailed(terrainProvider, positions);\r\n if (updatedPositions && updatedPositions[0] && updatedPositions[0].height !== undefined) {\r\n terrainHeight = updatedPositions[0].height;\r\n }\r\n } catch (e) {\r\n // 地形采样失败,使用默认高度\r\n }\r\n }\r\n\r\n // 创建标签,使用采样到的地形高度\r\n const labelPosition = C.Cartesian3.fromDegrees(lon, lat, terrainHeight + 1); // +1 确保在地形上方\r\n\r\n layer.entities.add({\r\n id: `${ownerId}-label`,\r\n name: 'Polygon Label',\r\n position: labelPosition,\r\n label: {\r\n text: displayText,\r\n font: 'bold 16px Microsoft YaHei, SimHei, sans-serif',\r\n fillColor: lineColor,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n style: C.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n pixelOffset: new C.Cartesian2(0, -10),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n // 仍然设置 heightReference 作为备用\r\n heightReference: C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n properties: { _ownerId: ownerId, _type: 'polygon-label' },\r\n } as any);\r\n } catch (e) {\r\n console.warn(`[PolygonEditor] 创建标签失败:`, e);\r\n }\r\n }\r\n\r\n /**\r\n * 辅助方法:从实体中提取经纬度高度数组\r\n * @param entity 多边形实体\r\n * @returns 点位数组 [{ lon, lat, height }]\r\n */\r\n private getEntityLonLatTerrainHeightArray(entity: Cesium.Entity): Array<{ lon: number; lat: number; height: number }> {\r\n const C = this.CesiumNS as any;\r\n const polygon = (entity as any).polygon;\r\n if (!polygon) return [];\r\n\r\n const hierarchy = typeof polygon.hierarchy?.getValue === 'function'\r\n ? polygon.hierarchy.getValue(C.JulianDate.now())\r\n : polygon.hierarchy;\r\n\r\n const positions = hierarchy?.positions ?? hierarchy ?? [];\r\n \r\n const points = positions.map((cartesian: any) => {\r\n const cartographic = C.Cartographic.fromCartesian(cartesian);\r\n return {\r\n lon: C.Math.toDegrees(cartographic.longitude),\r\n lat: C.Math.toDegrees(cartographic.latitude),\r\n height: cartographic.height\r\n };\r\n });\r\n\r\n // 多边形首尾闭合:如果首尾点不同,则添加第一个点到末尾\r\n if (points.length > 0) {\r\n const first = points[0];\r\n const last = points[points.length - 1];\r\n if (first.lon !== last.lon || first.lat !== last.lat || first.height !== last.height) {\r\n points.push({ ...first });\r\n }\r\n }\r\n\r\n return points;\r\n }\r\n\r\n /**\r\n * 辅助方法:获取实体所属的 DataSource\r\n * @param entity 实体对象\r\n * @returns DataSource 或 undefined\r\n */\r\n private getEntityDataSource(entity: Cesium.Entity | undefined): Cesium.CustomDataSource | undefined {\r\n if (!entity) return undefined;\r\n return (entity as any)?.entityCollection?._owner;\r\n }\r\n /**\r\n * 分析子阵和组串的层级关系,并自动重新编码\r\n * \r\n * 功能说明:\r\n * 1. 收集所有 subarray 和 inverter 多边形 (或仅处理指定的子阵)\r\n * 2. 使用射线法判断 inverter 是否在 subarray 内部\r\n * 3. 构建层级关系数据结构\r\n * 4. 按空间位置排序(从北到南、从东到西)\r\n * 5. 重新编码:\r\n * - 子阵: #01, #02, #03, ...\r\n * - 子阵内组串: G1.1.1, G1.1.2, ..., G1.1.99, G1.2.1, ...\r\n * - 独立组串: GX.1.1, GX.1.2, ..., GX.1.99, GX.2.1, ...\r\n * 6. 保存原始名称用于还原\r\n * \r\n * @param targetSubarrayEntity - 可选,指定要处理的子阵实体。如果提供,则只处理该子阵及其内部组串\r\n * @returns 编码结果对象,包含成功状态、统计信息、层级关系等\r\n */\r\n analyzeAndEncodePolygonHierarchy(targetSubarrayEntity?: any): {\r\n success: boolean;\r\n subarrayCount: number;\r\n inverterCount: number;\r\n independentCount: number;\r\n savedNamesCount: number;\r\n hierarchy?: {\r\n subarrays: Array<{\r\n id: string;\r\n name: string;\r\n oldName?: string;\r\n inverters: Array<{\r\n id: string;\r\n name: string;\r\n oldName?: string;\r\n }>;\r\n }>;\r\n independentInverters?: Array<{\r\n id: string;\r\n name: string;\r\n oldName?: string;\r\n }>;\r\n };\r\n recodingResult?: Array<{\r\n oldId: string;\r\n oldName: string;\r\n newCode: string;\r\n subarraySeq: number | string;\r\n subarrayName: string;\r\n globalIndex: number;\r\n isIndependent?: boolean;\r\n }>;\r\n error?: string;\r\n } {\r\n try {\r\n // 判断是全局计算还是单个子阵计算\r\n const isSingleSubarrayMode = !!targetSubarrayEntity;\r\n \r\n // 清空原始名称映射,准备保存新的映射\r\n this.originalPolygonNames.clear();\r\n \r\n // 1. 收集 subarray 多边形\r\n let subarrayEntities: any[] = [];\r\n \r\n if (isSingleSubarrayMode) {\r\n // 单个子阵模式: 只处理指定的子阵\r\n subarrayEntities = [targetSubarrayEntity];\r\n } else {\r\n // 全局模式: 收集所有 subarray 多边形\r\n const subarrayLayers = this.viewer.dataSources.getByName('subarray');\r\n subarrayLayers.forEach((layer: any) => {\r\n const entities = layer.entities.values.filter((e: any) => e.polygon);\r\n subarrayEntities.push(...entities);\r\n });\r\n }\r\n \r\n // 2. 收集 inverter 多边形 (在单个子阵模式下,后续会过滤出只在该子阵内的组串)\r\n const inverterLayers = this.viewer.dataSources.getByName('inverter');\r\n const inverterEntities: any[] = [];\r\n inverterLayers.forEach((layer: any) => {\r\n const entities = layer.entities.values.filter((e: any) => e.polygon);\r\n inverterEntities.push(...entities);\r\n });\r\n \r\n // 3. 判断一个点是否在多边形内部 (射线法)\r\n const isPointInPolygon = (point: [number, number], polygonPoints: any[]): boolean => {\r\n const [x, y] = point;\r\n let inside = false;\r\n \r\n for (let i = 0, j = polygonPoints.length - 1; i < polygonPoints.length; j = i++) {\r\n const xi = polygonPoints[i].lon;\r\n const yi = polygonPoints[i].lat;\r\n const xj = polygonPoints[j].lon;\r\n const yj = polygonPoints[j].lat;\r\n \r\n const intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\r\n if (intersect) inside = !inside;\r\n }\r\n \r\n return inside;\r\n };\r\n \r\n // 4. 判断 inverter 是否完全在 subarray 内部\r\n const isInverterInSubarray = (inverter: any, subarray: any): boolean => {\r\n const inverterPoints = this.getEntityLonLatTerrainHeightArray(inverter);\r\n const subarrayPoints = this.getEntityLonLatTerrainHeightArray(subarray);\r\n \r\n // 检查 inverter 的所有顶点是否都在 subarray 内\r\n for (const point of inverterPoints) {\r\n if (!isPointInPolygon([point.lon, point.lat], subarrayPoints)) {\r\n return false;\r\n }\r\n }\r\n \r\n return true;\r\n };\r\n \r\n // 5. 构建层级关系\r\n const hierarchy: any = {\r\n subarrays: []\r\n };\r\n \r\n // 遍历所有 subarray\r\n subarrayEntities.forEach((subarray: any) => {\r\n const subarrayData: any = {\r\n id: subarray.id,\r\n name: subarray.name || '',\r\n inverters: []\r\n };\r\n \r\n // 遍历所有 inverter,检查是否在当前 subarray 内\r\n inverterEntities.forEach((inverter: any) => {\r\n if (isInverterInSubarray(inverter, subarray)) {\r\n subarrayData.inverters.push({\r\n id: inverter.id,\r\n name: inverter.name || ''\r\n });\r\n }\r\n });\r\n \r\n hierarchy.subarrays.push(subarrayData);\r\n });\r\n \r\n // 6. 找出不属于任何 subarray 的 inverter (独立的)\r\n const allInvertersInSubarrays = new Set<string>();\r\n hierarchy.subarrays.forEach((sub: any) => {\r\n sub.inverters.forEach((inv: any) => {\r\n allInvertersInSubarrays.add(inv.id);\r\n });\r\n });\r\n \r\n const independentInverters: any[] = [];\r\n inverterEntities.forEach((inverter: any) => {\r\n if (!allInvertersInSubarrays.has(inverter.id)) {\r\n independentInverters.push({\r\n id: inverter.id,\r\n name: inverter.name || ''\r\n });\r\n }\r\n });\r\n \r\n if (independentInverters.length > 0) {\r\n hierarchy.independentInverters = independentInverters;\r\n }\r\n \r\n // 7. 子阵和组串重新编码\r\n // 计算多边形的空间中心点 (用于排序)\r\n const getPolygonCenter = (entity: any): [number, number] => {\r\n const points = this.getEntityLonLatTerrainHeightArray(entity);\r\n let sumLon = 0, sumLat = 0;\r\n points.forEach((p: any) => {\r\n sumLon += p.lon;\r\n sumLat += p.lat;\r\n });\r\n return [sumLon / points.length, sumLat / points.length];\r\n };\r\n \r\n // 第一步: 按空间顺序排序 subarray (从北到南、从东到西)\r\n const sortedSubarrays = [...hierarchy.subarrays].sort((a: any, b: any) => {\r\n const aEntity = subarrayEntities.find((e: any) => e.id === a.id);\r\n const bEntity = subarrayEntities.find((e: any) => e.id === b.id);\r\n const [aLon, aLat] = getPolygonCenter(aEntity);\r\n const [bLon, bLat] = getPolygonCenter(bEntity);\r\n \r\n // 先按纬度降序 (从北到南)\r\n if (Math.abs(aLat - bLat) > 0.0001) {\r\n return bLat - aLat;\r\n }\r\n // 纬度相近则按经度降序 (从东到西)\r\n return bLon - aLon;\r\n });\r\n \r\n // 第二步: 为每个 subarray 分配编码并更新 name (格式: #01, #02, ...)\r\n // ⚠️ 单个子阵模式下,不重新编码子阵本身,只编码组串\r\n if (!isSingleSubarrayMode) {\r\n sortedSubarrays.forEach((subarrayData: any, subarrayIndex: number) => {\r\n const subarraySeq = subarrayIndex + 1;\r\n const subarrayEntity = subarrayEntities.find((e: any) => e.id === subarrayData.id);\r\n \r\n const subarrayNewCode = `#${String(subarraySeq).padStart(2, '0')}`;\r\n const oldSubarrayName = subarrayEntity.name || '';\r\n \r\n // 保存原始名称到映射表 (用于还原)\r\n const subarrayDataSource = this.getEntityDataSource(subarrayEntity);\r\n this.originalPolygonNames.set(subarrayEntity.id, {\r\n entityId: subarrayEntity.id,\r\n oldName: oldSubarrayName,\r\n layerName: subarrayDataSource?.name || 'subarray'\r\n });\r\n \r\n subarrayEntity.name = subarrayNewCode;\r\n \r\n // 更新子阵的 label\r\n if (subarrayDataSource) {\r\n const subarrayLabelId = `${subarrayEntity.id}-label`;\r\n const subarrayLabelEntity = subarrayDataSource.entities.getById(subarrayLabelId);\r\n if (subarrayLabelEntity && (subarrayLabelEntity as any).label) {\r\n (subarrayLabelEntity as any).label.text = subarrayNewCode;\r\n }\r\n }\r\n });\r\n } else {\r\n // 单个子阵模式: 保持子阵原名称,但仍需保存到映射表\r\n const subarrayEntity = targetSubarrayEntity;\r\n const subarrayDataSource = this.getEntityDataSource(subarrayEntity);\r\n this.originalPolygonNames.set(subarrayEntity.id, {\r\n entityId: subarrayEntity.id,\r\n oldName: subarrayEntity.name || '',\r\n layerName: subarrayDataSource?.name || 'subarray'\r\n });\r\n }\r\n \r\n // 第三步: 为每个子阵内的 inverter 分配编码\r\n const recodingResult: any[] = [];\r\n let globalInverterIndex = 1;\r\n \r\n sortedSubarrays.forEach((subarrayData: any, subarrayIndex: number) => {\r\n // 确定子阵序号\r\n let subarraySeq: number;\r\n let subarrayName: string;\r\n \r\n if (isSingleSubarrayMode) {\r\n // 单个子阵模式: 从子阵名称中提取序号\r\n // 例如: \"#01\" -> 1, \"#02\" -> 2, \"subarray_#03\" -> 3\r\n const subarrayEntity = targetSubarrayEntity;\r\n const name = subarrayEntity.name || '';\r\n const match = name.match(/#(\\d+)/);\r\n subarraySeq = match ? parseInt(match[1], 10) : 1;\r\n subarrayName = name;\r\n } else {\r\n // 全局模式: 使用排序后的索引\r\n subarraySeq = subarrayIndex + 1;\r\n subarrayName = `#${String(subarraySeq).padStart(2, '0')}`;\r\n }\r\n \r\n // 获取当前子阵的所有 inverter 实体\r\n const inverterEntitiesInSubarray = subarrayData.inverters.map((inv: any) => \r\n inverterEntities.find((e: any) => e.id === inv.id)\r\n );\r\n \r\n // 按空间顺序排序 inverter (从北到南、从东到西)\r\n const sortedInverters = inverterEntitiesInSubarray.sort((a: any, b: any) => {\r\n const [aLon, aLat] = getPolygonCenter(a);\r\n const [bLon, bLat] = getPolygonCenter(b);\r\n if (Math.abs(aLat - bLat) > 0.0001) {\r\n return bLat - aLat;\r\n }\r\n return bLon - aLon;\r\n });\r\n \r\n // 为每个 inverter 分配三级编码 (逢99进1)\r\n sortedInverters.forEach((inverterEntity: any, localIndex: number) => {\r\n const level2 = Math.floor(localIndex / 99) + 1;\r\n const level3 = (localIndex % 99) + 1;\r\n \r\n const newCode = `G${subarraySeq}.${level2}.${level3}`;\r\n const oldName = inverterEntity.name || '';\r\n \r\n // 保存原始名称到映射表 (用于还原)\r\n const inverterDataSource = this.getEntityDataSource(inverterEntity);\r\n this.originalPolygonNames.set(inverterEntity.id, {\r\n entityId: inverterEntity.id,\r\n oldName: oldName,\r\n layerName: inverterDataSource?.name || 'inverter'\r\n });\r\n \r\n recodingResult.push({\r\n oldId: inverterEntity.id,\r\n oldName: oldName,\r\n newCode: newCode,\r\n subarraySeq: subarraySeq,\r\n subarrayName: subarrayName,\r\n globalIndex: globalInverterIndex++\r\n });\r\n \r\n // 实际更新 entity 的 name\r\n inverterEntity.name = newCode;\r\n \r\n // 更新关联的 label\r\n const dataSource = this.getEntityDataSource(inverterEntity);\r\n if (dataSource) {\r\n const labelId = `${inverterEntity.id}-label`;\r\n const labelEntity = dataSource.entities.getById(labelId);\r\n if (labelEntity && (labelEntity as any).label) {\r\n (labelEntity as any).label.text = newCode;\r\n }\r\n }\r\n });\r\n });\r\n \r\n // 处理独立组串 (不在任何子阵内的 inverter)\r\n // ⚠️ 单个子阵模式下,不处理独立组串\r\n if (!isSingleSubarrayMode && independentInverters.length > 0) {\r\n const independentInverterEntities = independentInverters.map((inv: any) => \r\n inverterEntities.find((e: any) => e.id === inv.id)\r\n ).filter((e: any) => e !== undefined);\r\n \r\n // 按空间顺序排序 (从北到南、从东到西)\r\n const sortedIndependentInverters = independentInverterEntities.sort((a: any, b: any) => {\r\n const [aLon, aLat] = getPolygonCenter(a);\r\n const [bLon, bLat] = getPolygonCenter(b);\r\n \r\n if (Math.abs(aLat - bLat) > 0.0001) {\r\n return bLat - aLat;\r\n }\r\n return bLon - aLon;\r\n });\r\n \r\n // 为每个独立组串分配编码 (使用 X 作为第一位)\r\n sortedIndependentInverters.forEach((inverterEntity: any, localIndex: number) => {\r\n const level2 = Math.floor(localIndex / 99) + 1;\r\n const level3 = (localIndex % 99) + 1;\r\n \r\n const newCode = `GX.${level2}.${level3}`;\r\n const oldName = inverterEntity.name || '';\r\n \r\n // 保存原始名称到映射表 (用于还原)\r\n const inverterDataSource = this.getEntityDataSource(inverterEntity);\r\n this.originalPolygonNames.set(inverterEntity.id, {\r\n entityId: inverterEntity.id,\r\n oldName: oldName,\r\n layerName: inverterDataSource?.name || 'inverter'\r\n });\r\n \r\n recodingResult.push({\r\n oldId: inverterEntity.id,\r\n oldName: oldName,\r\n newCode: newCode,\r\n subarraySeq: 'X',\r\n subarrayName: '(独立组串)',\r\n globalIndex: globalInverterIndex++,\r\n isIndependent: true\r\n });\r\n \r\n // 实际更新 entity 的 name\r\n inverterEntity.name = newCode;\r\n \r\n // 更新关联的 label\r\n const dataSource = this.getEntityDataSource(inverterEntity);\r\n if (dataSource) {\r\n const labelId = `${inverterEntity.id}-label`;\r\n const labelEntity = dataSource.entities.getById(labelId);\r\n if (labelEntity && (labelEntity as any).label) {\r\n (labelEntity as any).label.text = newCode;\r\n }\r\n }\r\n });\r\n }\r\n \r\n // 构建返回的层级关系数据 (包含编码后的新名称和原始名称)\r\n const finalHierarchy = {\r\n subarrays: sortedSubarrays.map((subarrayData: any) => {\r\n const subarrayEntity = subarrayEntities.find((e: any) => e.id === subarrayData.id);\r\n const originalData = this.originalPolygonNames.get(subarrayData.id);\r\n return {\r\n id: subarrayData.id,\r\n name: subarrayEntity?.name || subarrayData.name,\r\n oldName: originalData?.oldName,\r\n inverters: subarrayData.inverters.map((inv: any) => {\r\n const inverterEntity = inverterEntities.find((e: any) => e.id === inv.id);\r\n const invOriginalData = this.originalPolygonNames.get(inv.id);\r\n return {\r\n id: inv.id,\r\n name: inverterEntity?.name || inv.name,\r\n oldName: invOriginalData?.oldName\r\n };\r\n })\r\n };\r\n }),\r\n independentInverters: independentInverters.length > 0 ? independentInverters.map((inv: any) => {\r\n const inverterEntity = inverterEntities.find((e: any) => e.id === inv.id);\r\n const invOriginalData = this.originalPolygonNames.get(inv.id);\r\n return {\r\n id: inv.id,\r\n name: inverterEntity?.name || inv.name,\r\n oldName: invOriginalData?.oldName\r\n };\r\n }) : undefined\r\n };\r\n \r\n return {\r\n success: true,\r\n subarrayCount: sortedSubarrays.length,\r\n inverterCount: recodingResult.length,\r\n independentCount: independentInverters.length,\r\n savedNamesCount: this.originalPolygonNames.size,\r\n hierarchy: finalHierarchy,\r\n recodingResult: recodingResult\r\n };\r\n \r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to analyze polygon hierarchy:', e);\r\n return {\r\n success: false,\r\n subarrayCount: 0,\r\n inverterCount: 0,\r\n independentCount: 0,\r\n savedNamesCount: 0,\r\n error: String(e)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 还原多边形的原始名称\r\n * \r\n * 功能说明:\r\n * 1. 检查是否有保存的原始名称\r\n * 2. 遍历所有保存的实体并还原名称\r\n * 3. 同步更新关联的 label 文本\r\n * 4. 还原后清空映射表\r\n * \r\n * @returns 还原结果对象,包含成功状态、统计信息等\r\n */\r\n restoreOriginalNames(): {\r\n success: boolean;\r\n restoredCount: number;\r\n notFoundCount: number;\r\n message?: string;\r\n } {\r\n try {\r\n \r\n // 检查是否有保存的原始名称\r\n if (this.originalPolygonNames.size === 0) {\r\n console.warn('[PolygonEditor] ⚠️ 未找到保存的原始名称,请先执行 analyzeAndEncodePolygonHierarchy 进行编码');\r\n return {\r\n success: false,\r\n restoredCount: 0,\r\n notFoundCount: 0,\r\n message: '未找到保存的原始名称,请先执行编码操作'\r\n };\r\n }\r\n \r\n let restoredCount = 0;\r\n let notFoundCount = 0;\r\n \r\n // 遍历所有保存的原始名称\r\n this.originalPolygonNames.forEach((data, entityId) => {\r\n // 在对应的图层中查找实体\r\n const layers = this.viewer.dataSources.getByName(data.layerName);\r\n let entityFound = false;\r\n \r\n for (const layer of layers) {\r\n const entity = layer.entities.getById(entityId);\r\n if (entity) {\r\n entityFound = true;\r\n \r\n // 还原实体名称\r\n entity.name = data.oldName;\r\n \r\n // 还原关联的 label\r\n const labelId = `${entityId}-label`;\r\n const labelEntity = layer.entities.getById(labelId);\r\n if (labelEntity && (labelEntity as any).label) {\r\n const displayText = data.oldName.includes('_') ? data.oldName.split('_')[1] : data.oldName;\r\n (labelEntity as any).label.text = displayText;\r\n }\r\n \r\n restoredCount++;\r\n break;\r\n }\r\n }\r\n \r\n if (!entityFound) {\r\n console.warn(`[PolygonEditor] ✗ 未找到实体: ${entityId} (${data.layerName})`);\r\n notFoundCount++;\r\n }\r\n });\r\n \r\n // 清空保存的映射表\r\n this.originalPolygonNames.clear();\r\n \r\n return {\r\n success: true,\r\n restoredCount,\r\n notFoundCount\r\n };\r\n \r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to restore polygon names:', e);\r\n return {\r\n success: false,\r\n restoredCount: 0,\r\n notFoundCount: 0,\r\n message: String(e)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 仅分析多边形层级关系,不修改名称\r\n * \r\n * 功能说明:\r\n * 1. 收集所有 subarray 和 inverter 多边形\r\n * 2. 使用射线法判断 inverter 是否在 subarray 内部\r\n * 3. 构建层级关系数据结构\r\n * 4. 不进行任何重新编码操作,保持原始名称\r\n * 5. 按当前名称组织层级结构\r\n * \r\n * @returns 层级关系对象,包含成功状态和层级数据\r\n */\r\n getPolygonHierarchyWithoutEncoding(): {\r\n success: boolean;\r\n subarrayCount: number;\r\n inverterCount: number;\r\n independentCount: number;\r\n hierarchy?: {\r\n subarrays: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n inverters: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n }>;\r\n independentInverters: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n };\r\n error?: string;\r\n } {\r\n try {\r\n // 1. 收集所有 subarray 和 inverter 实体\r\n const subarrayEntities: any[] = [];\r\n const inverterEntities: any[] = [];\r\n\r\n const subarrayLayers = this.viewer.dataSources.getByName('subarray');\r\n subarrayLayers.forEach((layer: any) => {\r\n const entities = layer.entities.values.filter((e: any) => !!(e.polygon));\r\n subarrayEntities.push(...entities);\r\n });\r\n\r\n const inverterLayers = this.viewer.dataSources.getByName('inverter');\r\n inverterLayers.forEach((layer: any) => {\r\n const entities = layer.entities.values.filter((e: any) => !!(e.polygon));\r\n inverterEntities.push(...entities);\r\n });\r\n\r\n if (subarrayEntities.length === 0 && inverterEntities.length === 0) {\r\n return {\r\n success: false,\r\n subarrayCount: 0,\r\n inverterCount: 0,\r\n independentCount: 0,\r\n error: '未找到任何多边形'\r\n };\r\n }\r\n\r\n // 2. 射线法判断点是否在多边形内\r\n const isPointInPolygon = (point: [number, number], polygonPoints: any[]): boolean => {\r\n let inside = false;\r\n for (let i = 0, j = polygonPoints.length - 1; i < polygonPoints.length; j = i++) {\r\n const xi = polygonPoints[i].lon, yi = polygonPoints[i].lat;\r\n const xj = polygonPoints[j].lon, yj = polygonPoints[j].lat;\r\n const intersect = ((yi > point[1]) !== (yj > point[1]))\r\n && (point[0] < (xj - xi) * (point[1] - yi) / (yj - yi) + xi);\r\n if (intersect) inside = !inside;\r\n }\r\n return inside;\r\n };\r\n\r\n // 3. 建立层级关系:判断每个 inverter 是否在某个 subarray 内\r\n const hierarchyMap: Map<string, any[]> = new Map();\r\n const independentInverters: any[] = [];\r\n\r\n // 初始化每个子阵的组串数组\r\n subarrayEntities.forEach((subarray: any) => {\r\n hierarchyMap.set(subarray.id, []);\r\n });\r\n\r\n // 遍历每个 inverter,判断它属于哪个 subarray\r\n inverterEntities.forEach((inverter: any) => {\r\n let belongsToSubarray = false;\r\n\r\n for (const subarray of subarrayEntities) {\r\n const inverterPoints = this.getEntityLonLatTerrainHeightArray(inverter);\r\n const subarrayPoints = this.getEntityLonLatTerrainHeightArray(subarray);\r\n\r\n // 检查 inverter 的所有顶点是否都在 subarray 内\r\n const allPointsInside = inverterPoints.every(point => \r\n isPointInPolygon([point.lon, point.lat], subarrayPoints)\r\n );\r\n\r\n if (allPointsInside) {\r\n hierarchyMap.get(subarray.id)!.push(inverter);\r\n belongsToSubarray = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!belongsToSubarray) {\r\n independentInverters.push(inverter);\r\n }\r\n });\r\n\r\n // 4. 构建返回的层级关系数据 (使用当前名称,不修改)\r\n const finalHierarchy = {\r\n subarrays: subarrayEntities.map((subarrayEntity: any) => {\r\n const subarrayPoints = this.getEntityLonLatTerrainHeightArray(subarrayEntity);\r\n const invertersInSubarray = hierarchyMap.get(subarrayEntity.id) || [];\r\n\r\n return {\r\n id: subarrayEntity.id,\r\n name: subarrayEntity.name || '',\r\n points: subarrayPoints,\r\n inverters: invertersInSubarray.map((inverterEntity: any) => {\r\n const inverterPoints = this.getEntityLonLatTerrainHeightArray(inverterEntity);\r\n return {\r\n id: inverterEntity.id,\r\n name: inverterEntity.name || '',\r\n points: inverterPoints\r\n };\r\n })\r\n };\r\n }),\r\n independentInverters: independentInverters.map((inverterEntity: any) => {\r\n const points = this.getEntityLonLatTerrainHeightArray(inverterEntity);\r\n return {\r\n id: inverterEntity.id,\r\n name: inverterEntity.name || '',\r\n points: points\r\n };\r\n })\r\n };\r\n\r\n const totalInvertersInSubarrays = finalHierarchy.subarrays.reduce(\r\n (sum, subarray) => sum + subarray.inverters.length,\r\n 0\r\n );\r\n\r\n return {\r\n success: true,\r\n subarrayCount: subarrayEntities.length,\r\n inverterCount: totalInvertersInSubarrays,\r\n independentCount: independentInverters.length,\r\n hierarchy: finalHierarchy\r\n };\r\n\r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to analyze hierarchy:', e);\r\n return {\r\n success: false,\r\n subarrayCount: 0,\r\n inverterCount: 0,\r\n independentCount: 0,\r\n error: String(e)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 导出指定子阵及其内部组串的层级结构\r\n * \r\n * @param subarrayEntity - 要导出的子阵实体\r\n * @returns 导出结果,包含该子阵及其内部组串的层级结构\r\n */\r\n exportSingleSubarrayHierarchy(subarrayEntity: any): {\r\n success: boolean;\r\n subarrayCount: number;\r\n inverterCount: number;\r\n hierarchy?: {\r\n subarrays: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n inverters: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n }>;\r\n independentInverters: Array<any>;\r\n };\r\n error?: string;\r\n } {\r\n try {\r\n console.log(`[PolygonEditor] 导出单个子阵: ${subarrayEntity.name}`);\r\n\r\n // 获取子阵的点位数据\r\n const subarrayPoints = this.getEntityLonLatTerrainHeightArray(subarrayEntity);\r\n\r\n // 射线法判断点是否在多边形内\r\n const isPointInPolygon = (point: [number, number], polygonPoints: any[]): boolean => {\r\n let inside = false;\r\n for (let i = 0, j = polygonPoints.length - 1; i < polygonPoints.length; j = i++) {\r\n const xi = polygonPoints[i].lon, yi = polygonPoints[i].lat;\r\n const xj = polygonPoints[j].lon, yj = polygonPoints[j].lat;\r\n const intersect = ((yi > point[1]) !== (yj > point[1]))\r\n && (point[0] < (xj - xi) * (point[1] - yi) / (yj - yi) + xi);\r\n if (intersect) inside = !inside;\r\n }\r\n return inside;\r\n };\r\n\r\n // 查找该子阵内的所有组串\r\n const invertersInSubarray: any[] = [];\r\n const inverterLayers = this.viewer.dataSources.getByName('inverter');\r\n\r\n inverterLayers.forEach((inverterLayer: any) => {\r\n const inverterEntities = inverterLayer.entities.values.filter((e: any) => !!(e.polygon));\r\n\r\n inverterEntities.forEach((inverterEntity: any) => {\r\n const inverterPoints = this.getEntityLonLatTerrainHeightArray(inverterEntity);\r\n\r\n // 检查组串的所有顶点是否都在子阵内\r\n const allPointsInside = inverterPoints.every(point =>\r\n isPointInPolygon([point.lon, point.lat], subarrayPoints)\r\n );\r\n\r\n if (allPointsInside) {\r\n invertersInSubarray.push({\r\n id: inverterEntity.id,\r\n name: inverterEntity.name || '',\r\n points: inverterPoints\r\n });\r\n }\r\n });\r\n });\r\n\r\n // 构建层级结构输出\r\n const hierarchy = {\r\n subarrays: [\r\n {\r\n id: subarrayEntity.id,\r\n name: subarrayEntity.name || '',\r\n points: subarrayPoints,\r\n inverters: invertersInSubarray\r\n }\r\n ],\r\n independentInverters: []\r\n };\r\n\r\n return {\r\n success: true,\r\n subarrayCount: 1,\r\n inverterCount: invertersInSubarray.length,\r\n hierarchy: hierarchy\r\n };\r\n\r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to export single subarray:', e);\r\n return {\r\n success: false,\r\n subarrayCount: 0,\r\n inverterCount: 0,\r\n error: String(e)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 导出指定组串的扁平结构\r\n * \r\n * @param inverterEntity - 要导出的组串实体\r\n * @returns 导出结果,包含该组串的扁平结构数据\r\n */\r\n exportSingleInverter(inverterEntity: any): {\r\n success: boolean;\r\n data: {\r\n subarray: Array<any>;\r\n inverter: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n };\r\n error?: string;\r\n } {\r\n try {\r\n const points = this.getEntityLonLatTerrainHeightArray(inverterEntity);\r\n const data = {\r\n subarray: [],\r\n inverter: [\r\n {\r\n id: inverterEntity.id,\r\n name: inverterEntity.name || '',\r\n points: points\r\n }\r\n ]\r\n };\r\n\r\n return {\r\n success: true,\r\n data: data\r\n };\r\n\r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to export single inverter:', e);\r\n return {\r\n success: false,\r\n data: { subarray: [], inverter: [] },\r\n error: String(e)\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 从 JSON 数据批量创建多边形(层级结构)\r\n * \r\n * @param data - 层级结构的 JSON 数据\r\n * @param createPolygonFromPointsFn - 创建多边形的函数(由 CZMLManager 提供)\r\n * @returns 创建结果统计\r\n */\r\n importPolygonsFromHierarchy(\r\n data: {\r\n subarrays: Array<{\r\n id: string;\r\n name: string;\r\n oldName?: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n inverters: Array<{\r\n id: string;\r\n name: string;\r\n oldName?: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n }>;\r\n independentInverters: Array<{\r\n id: string;\r\n name: string;\r\n oldName?: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n },\r\n createPolygonFromPointsFn: (params: {\r\n layerName: string;\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }) => any\r\n ): {\r\n success: boolean;\r\n subarrayCount: number;\r\n inverterCount: number;\r\n independentCount: number;\r\n errors: Array<{ type: string; name: string; error: string }>;\r\n } {\r\n const C: any = this.CesiumNS as any;\r\n console.log('[PolygonEditor] 开始从层级数据导入多边形...');\r\n\r\n // 🔧 检查并切换场景模式: 如果是 3D 模式,强制切换为 2D\r\n try {\r\n const scene = (this.viewer as any).scene;\r\n const currentMode = scene.mode;\r\n \r\n if (currentMode === C.SceneMode.SCENE3D) {\r\n scene.mode = C.SceneMode.SCENE2D;\r\n }\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 场景模式切换失败:', e);\r\n }\r\n\r\n let subarrayCount = 0;\r\n let inverterCount = 0;\r\n let independentCount = 0;\r\n const errors: Array<{ type: string; name: string; error: string }> = [];\r\n\r\n \r\n\r\n try {\r\n // 创建子阵及其内部组串\r\n if (data.subarrays && Array.isArray(data.subarrays)) {\r\n for (const subarrayItem of data.subarrays) {\r\n // 创建子阵\r\n try {\r\n const subarrayEntity = createPolygonFromPointsFn({\r\n layerName: 'subarray',\r\n id: subarrayItem.id,\r\n name: subarrayItem.name,\r\n points: subarrayItem.points\r\n });\r\n\r\n if (subarrayEntity) {\r\n subarrayCount++;\r\n }\r\n } catch (err) {\r\n const errorMsg = String(err);\r\n errors.push({ type: 'subarray', name: subarrayItem.name, error: errorMsg });\r\n console.error(`[PolygonEditor] ✗ 创建子阵 ${subarrayItem.name} 失败:`, err);\r\n }\r\n\r\n // 创建子阵内的组串\r\n if (subarrayItem.inverters && Array.isArray(subarrayItem.inverters)) {\r\n for (const inverterItem of subarrayItem.inverters) {\r\n try {\r\n const inverterEntity = createPolygonFromPointsFn({\r\n layerName: 'inverter',\r\n id: inverterItem.id,\r\n name: inverterItem.name,\r\n points: inverterItem.points\r\n });\r\n\r\n if (inverterEntity) {\r\n inverterCount++;\r\n }\r\n } catch (err) {\r\n const errorMsg = String(err);\r\n errors.push({ type: 'inverter', name: inverterItem.name, error: errorMsg });\r\n console.error(`[PolygonEditor] ✗ 创建组串 ${inverterItem.name} 失败:`, err);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 创建独立组串\r\n if (data.independentInverters && Array.isArray(data.independentInverters)) {\r\n for (const inverterItem of data.independentInverters) {\r\n try {\r\n const inverterEntity = createPolygonFromPointsFn({\r\n layerName: 'inverter',\r\n id: inverterItem.id,\r\n name: inverterItem.name,\r\n points: inverterItem.points\r\n });\r\n\r\n if (inverterEntity) {\r\n independentCount++;\r\n }\r\n } catch (err) {\r\n const errorMsg = String(err);\r\n errors.push({ type: 'independent-inverter', name: inverterItem.name, error: errorMsg });\r\n console.error(`[PolygonEditor] ✗ 创建独立组串 ${inverterItem.name} 失败:`, err);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n subarrayCount,\r\n inverterCount,\r\n independentCount,\r\n errors\r\n };\r\n\r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to import hierarchy:', e);\r\n return {\r\n success: false,\r\n subarrayCount,\r\n inverterCount,\r\n independentCount,\r\n errors\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 从 JSON 数据批量创建多边形(扁平结构)\r\n * \r\n * @param data - 扁平结构的 JSON 数据\r\n * @param createPolygonFromPointsFn - 创建多边形的函数(由 CZMLManager 提供)\r\n * @returns 创建结果统计\r\n */\r\n importPolygonsFromFlatStructure(\r\n data: {\r\n subarray: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n inverter: Array<{\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }>;\r\n },\r\n createPolygonFromPointsFn: (params: {\r\n layerName: string;\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height: number }>;\r\n }) => any\r\n ): {\r\n success: boolean;\r\n subarrayCount: number;\r\n inverterCount: number;\r\n errors: Array<{ type: string; name: string; error: string }>;\r\n } {\r\n let subarrayCount = 0;\r\n let inverterCount = 0;\r\n const errors: Array<{ type: string; name: string; error: string }> = [];\r\n\r\n try {\r\n // 创建 subarray 多边形\r\n if (data.subarray && Array.isArray(data.subarray)) {\r\n for (const item of data.subarray) {\r\n try {\r\n const entity = createPolygonFromPointsFn({\r\n layerName: 'subarray',\r\n id: item.id,\r\n name: item.name,\r\n points: item.points\r\n });\r\n\r\n if (entity) {\r\n subarrayCount++;\r\n }\r\n } catch (err) {\r\n const errorMsg = String(err);\r\n errors.push({ type: 'subarray', name: item.name, error: errorMsg });\r\n console.error(`[PolygonEditor] ✗ 创建 subarray ${item.name} 失败:`, err);\r\n }\r\n }\r\n }\r\n\r\n // 创建 inverter 多边形\r\n if (data.inverter && Array.isArray(data.inverter)) {\r\n for (const item of data.inverter) {\r\n try {\r\n const entity = createPolygonFromPointsFn({\r\n layerName: 'inverter',\r\n id: item.id,\r\n name: item.name,\r\n points: item.points\r\n });\r\n\r\n if (entity) {\r\n inverterCount++;\r\n }\r\n } catch (err) {\r\n const errorMsg = String(err);\r\n errors.push({ type: 'inverter', name: item.name, error: errorMsg });\r\n console.error(`[PolygonEditor] ✗ 创建 inverter ${item.name} 失败:`, err);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n success: true,\r\n subarrayCount,\r\n inverterCount,\r\n errors\r\n };\r\n\r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to import flat structure:', e);\r\n return {\r\n success: false,\r\n subarrayCount,\r\n inverterCount,\r\n errors\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 更新多边形实体的类型、颜色和标签\r\n * @param entity 要更新的多边形实体\r\n * @param newType 新的类型 ('subarray' | 'inverter' | 'astrict' | 'rail' | 'feature')\r\n * @param customName 可选的自定义名称\r\n * @returns 更新结果\r\n */\r\n updatePolygonTypeAndStyle(\r\n entity: Cesium.Entity,\r\n newType: string,\r\n customName?: string\r\n ): {\r\n success: boolean;\r\n message: string;\r\n oldType?: string;\r\n newType?: string;\r\n oldName?: string;\r\n newName?: string;\r\n } {\r\n try {\r\n // 验证实体是否有 polygon 属性\r\n \r\n // 保存旧的类型和名称\r\n const oldType = (entity as any).type || 'unknown';\r\n const oldName = entity.name || entity.id;\r\n\r\n // 获取实体所在的 DataSource\r\n let dataSource: Cesium.CustomDataSource | null = null;\r\n const dataSources = this.viewer.dataSources;\r\n for (let i = 0; i < dataSources.length; i++) {\r\n const ds: any = dataSources.get(i);\r\n if (ds && ds.entities && ds.entities.contains(entity)) {\r\n dataSource = ds;\r\n break;\r\n }\r\n }\r\n\r\n if (!dataSource) {\r\n return {\r\n success: false,\r\n message: '无法找到实体所在的图层'\r\n };\r\n }\r\n\r\n // 获取新类型的颜色配置\r\n const colors = this.getColorConfig(newType);\r\n\r\n const hasPolygon = !!(entity as any).polygon;\r\n const hasEllipse = !!(entity as any).ellipse;\r\n\r\n if (hasEllipse) {\r\n // 更新圆形边框颜色\r\n if(entity.ellipse){\r\n entity.ellipse.outlineColor = colors.lineFinalColor;\r\n // 更新圆形填充颜色\r\n entity.ellipse.material = colors.faceFinalColor;\r\n }\r\n \r\n \r\n }else if (hasPolygon) {\r\n // 更新多边形边框颜色\r\n if(entity.polygon){\r\n entity.polygon.outlineColor = colors.lineFinalColor;\r\n // 更新多边形填充颜色\r\n entity.polygon.material = colors.faceFinalColor;\r\n }\r\n \r\n }\r\n // 更新多边形的填充颜色和轮廓线颜色\r\n\r\n // 更新轮廓线颜色 (查找同 ID 的 outline 实体,使用虚线材质)\r\n const outlineId = `${entity.id}-outline`;\r\n const outlineEntity = dataSource.entities.getById(outlineId);\r\n if (outlineEntity && outlineEntity.polyline) {\r\n // 应用虚线样式(使用公用方法)\r\n this.applyDashedOutlineStyle(outlineEntity, colors.lineFinalColor, 3, 10);\r\n }\r\n\r\n // 更新 type 属性\r\n (entity as any).type = newType;\r\n\r\n // 更新名称\r\n let newName = customName;\r\n if (newName) {\r\n entity.name = newType+\"-\" + newName;\r\n\r\n // 更新标签文本 (查找同 ID 的 label 实体)\r\n const labelId = `${entity.id}-label`;\r\n const labelEntity = dataSource.entities.getById(labelId);\r\n if (labelEntity && labelEntity.label) {\r\n labelEntity.label.text = new this.CesiumNS.ConstantProperty(customName);\r\n labelEntity.label.fillColor = colors.lineFinalColor;\r\n }\r\n }\r\n\r\n \r\n\r\n return {\r\n success: true,\r\n message: '多边形类型和样式更新成功',\r\n oldType,\r\n newType,\r\n oldName,\r\n newName\r\n };\r\n\r\n } catch (e) {\r\n console.error('[PolygonEditor] Failed to update polygon type and style:', e);\r\n return {\r\n success: false,\r\n message: `更新失败: ${e}`\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * 开始圆形绘制\r\n * 用户流程:\r\n * 1. 左键点击确定圆心\r\n * 2. 移动鼠标动态调整半径\r\n * 3. 再次左键点击确定半径,完成绘制\r\n * 4. 或右键/ESC取消绘制\r\n * \r\n * @param layer 图层对象 (使用 'other' 类型的 DataSource)\r\n * @param onComplete 绘制完成回调函数\r\n * @returns 返回绘制会话对象,包含 stop() 方法\r\n */\r\n startCircleDrawing(\r\n layer?: Cesium.CustomDataSource,\r\n onComplete?: (entity: Cesium.Entity) => void,\r\n ): { stop: () => void } {\r\n const C: any = this.CesiumNS as any;\r\n \r\n // 验证图层\r\n if (layer == null) {\r\n console.warn('[PolygonEditor.startCircleDrawing] layer is null, return without starting drawing.');\r\n return { stop: () => {} };\r\n }\r\n \r\n // 获取 'other' 类型的颜色配置\r\n const colors = this.getColorConfig('other');\r\n const line_color = colors.lineColor;\r\n const line_fina_color = colors.lineFinalColor;\r\n const face_color = colors.faceColor;\r\n const face_fina_color = colors.faceFinalColor;\r\n const point_color = colors.pointColor;\r\n \r\n // 生成名称: circle_01, circle_02, ...\r\n const circleCount = layer.entities.values.filter((e: any) => e.ellipse).length;\r\n const nameStr = `circle_${(circleCount + 1).toString().padStart(2, '0')}`;\r\n \r\n // 清除所有多边形的高亮状态\r\n this.clearAllPolygonHighlights();\r\n \r\n // 重置绘制状态\r\n this.stopInternal();\r\n this.disableDoubleClickZoom();\r\n \r\n // 圆形绘制状态\r\n let centerPosition: any = null; // 圆心位置 (Cartesian3)\r\n let currentRadius = 0; // 当前半径 (米)\r\n let tempCenterPoint: Cesium.Entity | undefined; // 临时圆心标记\r\n let tempCircle: Cesium.Entity | undefined; // 临时圆形实体\r\n let tempRadiusLabel: Cesium.Entity | undefined; // 半径标签\r\n \r\n // 创建鼠标事件处理器\r\n this.handler = new C.ScreenSpaceEventHandler(this.viewer.scene.canvas);\r\n \r\n // 阶段标记: 'selectCenter' | 'selectRadius'\r\n let phase: 'selectCenter' | 'selectRadius' = 'selectCenter';\r\n \r\n // 左键点击事件\r\n this.handler && this.handler.setInputAction(\r\n (movement: any) => {\r\n try {\r\n // 拾取位置\r\n let position: any;\r\n try {\r\n position = (this.viewer.scene as any).pickPosition(movement.position);\r\n } catch {}\r\n if (!position) {\r\n position = (this.viewer.camera as any).pickEllipsoid(\r\n movement.position,\r\n (this.viewer.scene as any).globe.ellipsoid,\r\n );\r\n }\r\n if (!position) {\r\n console.warn('[PolygonEditor.startCircleDrawing] 无法拾取位置');\r\n return;\r\n }\r\n \r\n // 阶段1: 选择圆心\r\n if (phase === 'selectCenter') {\r\n centerPosition = position;\r\n \r\n // 创建圆心标记点\r\n tempCenterPoint = layer.entities.add({\r\n position: centerPosition,\r\n point: {\r\n pixelSize: 8,\r\n color: point_color,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n });\r\n \r\n // 创建动态圆形实体\r\n tempCircle = layer.entities.add({\r\n position: centerPosition,\r\n ellipse: {\r\n semiMajorAxis: this.makeCallback(() => currentRadius),\r\n semiMinorAxis: this.makeCallback(() => currentRadius),\r\n material: face_color,\r\n outline: true,\r\n outlineColor: line_color,\r\n outlineWidth: 1,\r\n height: 0,\r\n heightReference: C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n } as any);\r\n \r\n // 创建半径标签\r\n tempRadiusLabel = layer.entities.add({\r\n position: this.makeCallback(() => {\r\n if (!centerPosition) return centerPosition;\r\n // 标签位置在圆心右上方\r\n const carto = C.Cartographic.fromCartesian(centerPosition);\r\n const offset = currentRadius * 0.3; // 偏移30%半径\r\n const labelCarto = new C.Cartographic(\r\n carto.longitude + offset / 6378137, // 简单的经度偏移\r\n carto.latitude + offset / 6378137, // 简单的纬度偏移\r\n carto.height\r\n );\r\n return C.Cartesian3.fromRadians(\r\n labelCarto.longitude,\r\n labelCarto.latitude,\r\n labelCarto.height\r\n );\r\n }),\r\n label: {\r\n text: '',\r\n font: 'bold 16px Microsoft YaHei',\r\n fillColor: colors.lineFinalColor,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n style: C.LabelStyle.FILL_AND_OUTLINE,\r\n pixelOffset: new C.Cartesian2(0, -10),\r\n heightReference: C.HeightReference.CLAMP_TO_GROUND,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n } as any);\r\n \r\n phase = 'selectRadius';\r\n } \r\n // 阶段2: 确定半径,完成绘制\r\n else if (phase === 'selectRadius') {\r\n finishCircleDrawing();\r\n }\r\n } catch (e) {\r\n console.error('[PolygonEditor.startCircleDrawing] 左键点击处理失败:', e);\r\n }\r\n },\r\n (C as any).ScreenSpaceEventType.LEFT_CLICK,\r\n );\r\n \r\n // 鼠标移动事件: 动态更新半径\r\n this.handler && this.handler.setInputAction(\r\n (movement: any) => {\r\n try {\r\n // 只在选择半径阶段响应鼠标移动\r\n if (phase !== 'selectRadius' || !centerPosition) return;\r\n \r\n // 拾取鼠标位置\r\n let position: any;\r\n try {\r\n position = (this.viewer.scene as any).pickPosition(movement.endPosition);\r\n } catch {}\r\n if (!position) {\r\n position = (this.viewer.camera as any).pickEllipsoid(\r\n movement.endPosition,\r\n (this.viewer.scene as any).globe.ellipsoid,\r\n );\r\n }\r\n if (!position) return;\r\n \r\n // 计算圆心到鼠标位置的距离作为半径\r\n const distance = C.Cartesian3.distance(centerPosition, position);\r\n currentRadius = Math.max(1, distance); // 最小半径 1 米\r\n \r\n } catch (e) {\r\n console.error('[PolygonEditor.startCircleDrawing] 鼠标移动处理失败:', e);\r\n }\r\n },\r\n (C as any).ScreenSpaceEventType.MOUSE_MOVE,\r\n );\r\n \r\n // 完成圆形绘制的函数\r\n const finishCircleDrawing = () => {\r\n try {\r\n if (!centerPosition || currentRadius <= 0) {\r\n console.warn('[PolygonEditor.startCircleDrawing] 圆心或半径无效');\r\n cleanupAndStop();\r\n return;\r\n }\r\n \r\n // 生成唯一 ID\r\n // const timestamp = Date.now();\r\n // const id = `circle-${timestamp}`;\r\n const id = this.generateUniqueId();\r\n \r\n // 创建正式的圆形实体(不显示轮廓线,因为要用虚线 polyline 代替)\r\n const entity = layer.entities.add({\r\n id,\r\n name: '',\r\n name_str: nameStr,\r\n shape: 'circle',\r\n type: 'other',\r\n position: centerPosition,\r\n ellipse: {\r\n semiMajorAxis: currentRadius,\r\n semiMinorAxis: currentRadius,\r\n material: face_fina_color,\r\n outline: false, // 不显示实体自带的轮廓线\r\n height: 0,\r\n heightReference: C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n properties: {\r\n _type: 'circle',\r\n radius: currentRadius,\r\n },\r\n } as any);\r\n \r\n // 设置类型属性\r\n (entity as any).type = 'other';\r\n \r\n // 创建圆形虚线轮廓(使用 polyline 模拟圆形轮廓)\r\n // 生成圆周上的点(64个点,形成平滑的圆)\r\n const numPoints = 64;\r\n const circlePositions: any[] = [];\r\n const carto = C.Cartographic.fromCartesian(centerPosition);\r\n \r\n for (let i = 0; i <= numPoints; i++) {\r\n const angle = (i / numPoints) * 2 * Math.PI;\r\n // 使用简单的球面几何计算圆周上的点\r\n const dx = currentRadius * Math.cos(angle);\r\n const dy = currentRadius * Math.sin(angle);\r\n \r\n // 将偏移量转换为经纬度偏移(简化算法,适用于小范围)\r\n const earthRadius = 6378137; // 地球半径(米)\r\n const dLon = dx / (earthRadius * Math.cos(carto.latitude));\r\n const dLat = dy / earthRadius;\r\n \r\n const pointCarto = new C.Cartographic(\r\n carto.longitude + dLon,\r\n carto.latitude + dLat,\r\n carto.height\r\n );\r\n \r\n circlePositions.push(C.Cartesian3.fromRadians(\r\n pointCarto.longitude,\r\n pointCarto.latitude,\r\n pointCarto.height\r\n ));\r\n }\r\n \r\n // 创建虚线轮廓线实体\r\n const outlineEntity = layer.entities.add({\r\n id: `${id}-outline`,\r\n polyline: {\r\n positions: circlePositions,\r\n width: 1,\r\n material: line_fina_color,\r\n clampToGround: true,\r\n },\r\n properties: {\r\n _ownerId: id,\r\n _type: 'circle-outline',\r\n },\r\n } as any);\r\n \r\n // 应用虚线样式\r\n if (outlineEntity) {\r\n this.applyDashedOutlineStyle(outlineEntity, line_fina_color, 3, 10);\r\n }\r\n \r\n // 创建标签 (显示名称和半径)\r\n this.createLabelEntity(\r\n layer,\r\n id,\r\n centerPosition,\r\n ``,\r\n line_fina_color\r\n );\r\n \r\n // 清理临时实体\r\n cleanupAndStop();\r\n \r\n // 调用完成回调\r\n this.finalizePolygonSession(layer, onComplete, entity);\r\n \r\n } catch (e) {\r\n console.error('[PolygonEditor.startCircleDrawing] 完成绘制失败:', e);\r\n cleanupAndStop();\r\n }\r\n };\r\n \r\n // 取消绘制的函数\r\n const cancelCircleDrawing = () => {\r\n cleanupAndStop();\r\n };\r\n \r\n // 清理临时实体并停止绘制\r\n const cleanupAndStop = () => {\r\n try {\r\n if (tempCenterPoint) layer.entities.remove(tempCenterPoint);\r\n if (tempCircle) layer.entities.remove(tempCircle);\r\n if (tempRadiusLabel) layer.entities.remove(tempRadiusLabel);\r\n } catch (e) {\r\n console.warn('[PolygonEditor.startCircleDrawing] 清理临时实体失败:', e);\r\n }\r\n \r\n tempCenterPoint = undefined;\r\n tempCircle = undefined;\r\n tempRadiusLabel = undefined;\r\n centerPosition = null;\r\n currentRadius = 0;\r\n \r\n this.destroyHandler();\r\n this.removeKeyboardListener();\r\n this.restoreDoubleClickZoom();\r\n };\r\n \r\n // 右键点击: 取消绘制\r\n this.handler && this.handler.setInputAction(\r\n cancelCircleDrawing,\r\n (C as any).ScreenSpaceEventType.RIGHT_CLICK,\r\n );\r\n \r\n // 键盘监听: ESC 或 X 键取消绘制\r\n this.setupKeyboardListener(cancelCircleDrawing);\r\n \r\n return {\r\n stop: () => {\r\n cancelCircleDrawing();\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * 开始点标记绘制\r\n * 用户流程:\r\n * 1. 左键点击地图添加点标记\r\n * 2. 可连续点击添加多个点\r\n * 3. 右键或 ESC 结束绘制\r\n * \r\n * @param layer 图层对象 (使用 'other' 类型的 DataSource)\r\n * @param iconSvg SVG 图标的 data URL 或路径\r\n * @param onComplete 每次添加点时的回调函数(可选)\r\n * @returns 返回绘制会话对象,包含 stop() 方法\r\n */\r\n startPointDrawing(\r\n layer?: Cesium.CustomDataSource,\r\n iconSvg?: string,\r\n onComplete?: (entity: Cesium.Entity) => void,\r\n ): { stop: () => void } {\r\n const C: any = this.CesiumNS as any;\r\n \r\n // 验证图层\r\n if (layer == null) {\r\n console.warn('[PolygonEditor.startPointDrawing] layer is null, return without starting drawing.');\r\n return { stop: () => {} };\r\n }\r\n \r\n // 获取 'other' 类型的颜色配置\r\n const colors = this.getColorConfig('other');\r\n const line_fina_color = colors.lineFinalColor;\r\n \r\n // 清除所有多边形的高亮状态\r\n this.clearAllPolygonHighlights();\r\n \r\n // 重置绘制状态\r\n this.stopInternal();\r\n this.disableDoubleClickZoom();\r\n \r\n // 点标记计数器(用于生成名称)\r\n let pointCount = 0;\r\n \r\n // 存储已添加的点实体\r\n // const addedPoints: Cesium.Entity[] = [];\r\n \r\n // 创建鼠标事件处理器\r\n this.handler = new C.ScreenSpaceEventHandler(this.viewer.scene.canvas);\r\n \r\n // 左键点击事件:添加点标记\r\n this.handler && this.handler.setInputAction(\r\n (movement: any) => {\r\n try {\r\n // 拾取位置\r\n let position: any;\r\n try {\r\n position = (this.viewer.scene as any).pickPosition(movement.position);\r\n } catch {}\r\n if (!position) {\r\n position = (this.viewer.camera as any).pickEllipsoid(\r\n movement.position,\r\n (this.viewer.scene as any).globe.ellipsoid,\r\n );\r\n }\r\n if (!position) {\r\n console.warn('[PolygonEditor.startPointDrawing] 无法拾取位置');\r\n return;\r\n }\r\n \r\n // 转换为经纬度\r\n const carto = C.Cartographic.fromCartesian(position);\r\n const lon = C.Math.toDegrees(carto.longitude);\r\n const lat = C.Math.toDegrees(carto.latitude);\r\n const height = carto.height;\r\n \r\n // 生成名称\r\n pointCount++;\r\n const currentPointCount = layer.entities.values.filter((e: any) => \r\n e.billboard && e.properties?._type?.getValue() === 'point-marker'\r\n ).length;\r\n const nameStr = `point_${(currentPointCount + 1).toString().padStart(2, '0')}`;\r\n \r\n // 生成唯一 ID\r\n const id = this.generateUniqueId();\r\n \r\n // 检查是否是 2D 模式\r\n const is2DMode = this.viewer.scene.mode === C.SceneMode.SCENE2D;\r\n \r\n // 创建点标记实体\r\n const entity = layer.entities.add({\r\n id,\r\n name: '',\r\n name_str: nameStr,\r\n shape: 'point',\r\n type: 'feature_point',\r\n position: C.Cartesian3.fromDegrees(lon, lat, 0),\r\n billboard: {\r\n image: iconSvg || '', // 使用传入的 SVG 图标\r\n width: 25,\r\n height: 25,\r\n verticalOrigin: is2DMode ? C.VerticalOrigin.CENTER : C.VerticalOrigin.BOTTOM,\r\n heightReference: is2DMode ? C.HeightReference.NONE : C.HeightReference.CLAMP_TO_GROUND,\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: {\r\n _type: 'point-marker',\r\n lon,\r\n lat,\r\n height,\r\n },\r\n } as any);\r\n \r\n \r\n // 创建标签(显示名称)- 点标记需要更高的位置\r\n // 不使用 createLabelEntity,因为它的偏移量太小\r\n try {\r\n layer.entities.add({\r\n id: `${id}-label`,\r\n name: 'Point Label',\r\n position: position,\r\n label: {\r\n text: ``,\r\n font: 'bold 16px Microsoft YaHei, SimHei, sans-serif',\r\n fillColor: line_fina_color,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n style: C.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n // 点标记图标高度 45px,标签需要在图标上方,所以偏移更大\r\n pixelOffset: new C.Cartesian2(0, -30), // 原来 -10,现在 -55\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n heightReference: is2DMode ? C.HeightReference.NONE : C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n properties: { _ownerId: id, _type: 'point-label' },\r\n } as any);\r\n } catch (e) {\r\n console.warn('[PolygonEditor.startPointDrawing] 创建标签失败:', e);\r\n }\r\n \r\n // 存储点实体\r\n // addedPoints.push(entity);\r\n \r\n // 调用完成回调(每添加一个点就调用一次)\r\n if (onComplete) {\r\n try {\r\n onComplete(entity);\r\n } catch (e) {\r\n console.warn('[PolygonEditor.startPointDrawing] 回调执行失败:', e);\r\n }\r\n }\r\n \r\n } catch (e) {\r\n console.error('[PolygonEditor.startPointDrawing] 左键点击处理失败:', e);\r\n }\r\n },\r\n (C as any).ScreenSpaceEventType.LEFT_CLICK,\r\n );\r\n \r\n // 停止绘制的函数\r\n const stopPointDrawing = () => {\r\n this.destroyHandler();\r\n this.removeKeyboardListener();\r\n this.restoreDoubleClickZoom();\r\n };\r\n \r\n // 右键点击: 结束绘制\r\n this.handler && this.handler.setInputAction(\r\n stopPointDrawing,\r\n (C as any).ScreenSpaceEventType.RIGHT_CLICK,\r\n );\r\n \r\n // 键盘监听: ESC 或 X 键结束绘制\r\n this.setupKeyboardListener(stopPointDrawing);\r\n \r\n return {\r\n stop: () => {\r\n stopPointDrawing();\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * 从 JSON 数据加载多边形、圆形和特征点到 other 图层\r\n * @param data JSON 数据,包含 astrict, rail, feature, feature_point 数组\r\n * @returns 加载结果统计\r\n */\r\n loadOtherLayerFromJson(data: {\r\n astrict?: Array<any>;\r\n rail?: Array<any>;\r\n feature?: Array<any>;\r\n feature_point?: Array<any>;\r\n }): {\r\n success: boolean;\r\n message: string;\r\n stats: {\r\n astrict: number;\r\n rail: number;\r\n feature: number;\r\n feature_point: number;\r\n total: number;\r\n };\r\n } {\r\n const C: any = this.CesiumNS as any;\r\n \r\n try {\r\n // 获取或创建 other 图层\r\n let otherLayer = this.viewer.dataSources.getByName('other')[0] as any;\r\n if (!otherLayer) {\r\n otherLayer = new (C as any).CustomDataSource('other');\r\n this.viewer.dataSources.add(otherLayer);\r\n }\r\n \r\n const stats = {\r\n astrict: 0,\r\n rail: 0,\r\n feature: 0,\r\n feature_point: 0,\r\n total: 0\r\n };\r\n \r\n // 检测当前场景模式\r\n const is2DMode = this.viewer.scene.mode === C.SceneMode.SCENE2D;\r\n \r\n // 加载 astrict (多边形或圆形)\r\n if (data.astrict && Array.isArray(data.astrict)) {\r\n data.astrict.forEach((item: any) => {\r\n try {\r\n if (item.shape === 'circle' && item.points && item.points[0]?.radius) {\r\n // 圆形: points[0] 包含圆心坐标和半径\r\n this.loadCircleEntity(otherLayer, item, 'astrict', is2DMode);\r\n } else if (item.shape === 'polygon') {\r\n // 多边形: points 是多个坐标点\r\n this.loadPolygonEntity(otherLayer, item, 'astrict', is2DMode);\r\n }\r\n stats.astrict++;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 加载 astrict 实体失败:', item.id, e);\r\n }\r\n });\r\n }\r\n \r\n // 加载 rail (多边形或圆形)\r\n if (data.rail && Array.isArray(data.rail)) {\r\n data.rail.forEach((item: any) => {\r\n try {\r\n if (item.shape === 'circle' && item.points && item.points[0]?.radius) {\r\n // 圆形: points[0] 包含圆心坐标和半径\r\n this.loadCircleEntity(otherLayer, item, 'rail', is2DMode);\r\n } else if (item.shape === 'polygon') {\r\n // 多边形: points 是多个坐标点\r\n this.loadPolygonEntity(otherLayer, item, 'rail', is2DMode);\r\n }\r\n stats.rail++;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 加载 rail 实体失败:', item.id, e);\r\n }\r\n });\r\n }\r\n \r\n // 加载 feature (多边形或圆形)\r\n if (data.feature && Array.isArray(data.feature)) {\r\n data.feature.forEach((item: any) => {\r\n try {\r\n if (item.shape === 'circle' && item.points && item.points[0]?.radius) {\r\n // 圆形: points[0] 包含圆心坐标和半径\r\n this.loadCircleEntity(otherLayer, item, 'feature', is2DMode);\r\n } else if (item.shape === 'polygon') {\r\n // 多边形: points 是多个坐标点\r\n this.loadPolygonEntity(otherLayer, item, 'feature', is2DMode);\r\n }\r\n stats.feature++;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 加载 feature 实体失败:', item.id, e);\r\n }\r\n });\r\n }\r\n \r\n // 加载 feature_point 特征点\r\n if (data.feature_point && Array.isArray(data.feature_point)) {\r\n data.feature_point.forEach((item: any) => {\r\n try {\r\n this.loadPointEntity(otherLayer, item, 'feature_point', is2DMode);\r\n stats.feature_point++;\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 加载 feature_point 实体失败:', item.id, e);\r\n }\r\n });\r\n }\r\n \r\n stats.total = stats.astrict + stats.rail + stats.feature + stats.feature_point;\r\n \r\n return {\r\n success: true,\r\n message: '加载成功',\r\n stats\r\n };\r\n \r\n } catch (e) {\r\n console.error('[PolygonEditor.loadOtherLayerFromJson] ❌ 加载失败:', e);\r\n return {\r\n success: false,\r\n message: `加载失败: ${e}`,\r\n stats: {\r\n astrict: 0,\r\n rail: 0,\r\n feature: 0,\r\n feature_point: 0,\r\n total: 0\r\n }\r\n };\r\n }\r\n }\r\n \r\n /**\r\n * 加载多边形实体 (复用代码)\r\n */\r\n private loadPolygonEntity(\r\n layer: any,\r\n item: any,\r\n type: string,\r\n is2DMode: boolean\r\n ): void {\r\n const C: any = this.CesiumNS as any;\r\n \r\n // 转换坐标点\r\n const positions: any[] = [];\r\n if (item.points && Array.isArray(item.points)) {\r\n item.points.forEach((point: any) => {\r\n const position = C.Cartesian3.fromDegrees(\r\n point.lon,\r\n point.lat,\r\n point.height || 0\r\n );\r\n positions.push(position);\r\n });\r\n }\r\n \r\n if (positions.length < 3) {\r\n throw new Error('多边形至少需要3个点');\r\n }\r\n \r\n // 获取颜色配置\r\n const colors = this.getColorConfig(type);\r\n \r\n // 生成唯一 ID\r\n const id = item.id || `${type}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n const nameStr = item.name || '';\r\n \r\n // 创建多边形实体\r\n layer.entities.add({\r\n id,\r\n name_str: nameStr,\r\n name: '',\r\n shape: item.shape || 'polygon',\r\n type: type,\r\n checked: false,\r\n polygon: {\r\n hierarchy: positions,\r\n material: colors.faceFinalColor,\r\n outline: false,\r\n heightReference: is2DMode ? C.HeightReference.NONE : C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n } as any);\r\n \r\n // 创建轮廓线\r\n // const outlineId = `${id}-outline`;\r\n const outlineEntity = this.createOutlineEntity(layer, id, positions, colors.lineFinalColor, false);\r\n this.applyDashedOutlineStyle(outlineEntity, colors.lineFinalColor, 3, 10);\r\n // 创建标签 (使用第一个点作为标签位置)\r\n const labelPosition = positions[0];\r\n this.createLabelEntity(layer, id, labelPosition, nameStr, colors.lineFinalColor);\r\n }\r\n \r\n /**\r\n * 加载圆形实体 (复用代码)\r\n * 圆形数据格式: points[0] 包含 {lon, lat, height, radius}\r\n */\r\n private loadCircleEntity(\r\n layer: any,\r\n item: any,\r\n type: string,\r\n is2DMode: boolean\r\n ): void {\r\n const C: any = this.CesiumNS as any;\r\n \r\n // 从 points[0] 获取圆心坐标和半径\r\n if (!item.points || !item.points[0] || !item.points[0].radius) {\r\n throw new Error('圆形缺少 points[0] 或 radius');\r\n }\r\n \r\n const centerData = item.points[0];\r\n const radius = centerData.radius;\r\n \r\n // 获取颜色配置\r\n const colors = this.getColorConfig(type);\r\n \r\n // 生成唯一 ID\r\n const id = item.id || `${type}-circle-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n const nameStr = item.name || '';\r\n \r\n // 中心点位置\r\n const centerPosition = C.Cartesian3.fromDegrees(\r\n centerData.lon,\r\n centerData.lat,\r\n centerData.height || 0\r\n );\r\n \r\n // 创建圆形实体\r\n // 注意: 圆形不支持贴地轮廓线,所以使用单独的 polyline 绘制轮廓\r\n layer.entities.add({\r\n id,\r\n name_str: nameStr,\r\n name: '',\r\n shape: 'circle',\r\n type: type,\r\n position: centerPosition,\r\n ellipse: {\r\n semiMajorAxis: radius,\r\n semiMinorAxis: radius, // 相等半径 = 圆形\r\n height: centerData.height || 0, // 明确设置 height 避免警告\r\n material: colors.faceFinalColor,\r\n outline: false, // 圆形贴地时不支持轮廓线\r\n heightReference: is2DMode ? C.HeightReference.NONE : C.HeightReference.CLAMP_TO_GROUND,\r\n },\r\n properties: {\r\n radius: radius\r\n }\r\n } as any);\r\n \r\n // 创建圆形轮廓线 (使用 polyline 模拟圆形)\r\n try {\r\n const outlinePositions: any[] = [];\r\n const segments = 64; // 圆形分段数,越大越圆滑\r\n for (let i = 0; i <= segments; i++) {\r\n const angle = (i / segments) * 2 * Math.PI;\r\n const dx = radius * Math.cos(angle);\r\n const dy = radius * Math.sin(angle);\r\n \r\n // 计算圆周上的点\r\n const carto = C.Cartographic.fromCartesian(centerPosition);\r\n const lon = carto.longitude;\r\n const lat = carto.latitude;\r\n \r\n // 简单的平面近似 (适用于小范围)\r\n const earthRadius = 6378137.0; // 地球半径(米)\r\n const dLon = dx / (earthRadius * Math.cos(lat));\r\n const dLat = dy / earthRadius;\r\n \r\n const pointPosition = C.Cartesian3.fromRadians(\r\n lon + dLon,\r\n lat + dLat,\r\n centerData.height || 0\r\n );\r\n outlinePositions.push(pointPosition);\r\n }\r\n\r\n const outlineEntity = layer.entities.add({\r\n id: `${id}-outline`,\r\n name: 'Circle Outline',\r\n polyline: {\r\n positions: outlinePositions,\r\n width:1,\r\n material: colors.lineFinalColor,\r\n clampToGround: !is2DMode,\r\n },\r\n properties: { _ownerId: id, _type: 'circle-outline' },\r\n } as any);\r\n\r\n this.applyDashedOutlineStyle(outlineEntity, colors.lineFinalColor, 3, 10);\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 创建圆形轮廓线失败:', e);\r\n }\r\n \r\n // 创建标签\r\n // 创建标签 (使用第一个点作为标签位置)\r\n this.createLabelEntity(layer, id, centerPosition, nameStr, colors.lineFinalColor);\r\n \r\n }\r\n \r\n /**\r\n * 加载特征点实体 (复用代码)\r\n */\r\n private loadPointEntity(\r\n layer: any,\r\n item: any,\r\n type: string,\r\n is2DMode: boolean\r\n ): void {\r\n const C: any = this.CesiumNS as any;\r\n \r\n if (!item.position) {\r\n throw new Error('特征点缺少 position');\r\n }\r\n \r\n // 获取颜色配置\r\n const colors = this.getColorConfig('feature');\r\n \r\n // 生成唯一 ID\r\n const id = item.id || `${this.generateUniqueId()}`;\r\n const nameStr = item.name || '';\r\n \r\n // 点位置\r\n const position = C.Cartesian3.fromDegrees(\r\n item.position.lon,\r\n item.position.lat,\r\n item.position.height || 0\r\n );\r\n \r\n // 使用 point_marker SVG 图标 (Data URL 格式避免路径问题)\r\n const svgContent = '<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"15.9998779296875\" height=\"12.673858642578125\" viewBox=\"0 0 15.9998779296875 12.673858642578125\" fill=\"none\"><path d=\"M0 0L15.9999 0L7.99993 12.6739L0 0Z\" fill-rule=\"evenodd\" style=\"mix-blend-mode:normal\" fill=\"url(#linear_fill_127_1042)\" ></path><defs><linearGradient id=\"linear_fill_127_1042\" x1=\"8.0037841796875\" y1=\"0\" x2=\"8.0037841796875\" y2=\"12.667953491210938\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#4098FF\" /><stop offset=\"0.49000000953674316\" stop-color=\"#3FFBFB\" /><stop offset=\"0.8550000190734863\" stop-color=\"#FFFFFF\" /></linearGradient></defs></svg>';\r\n const iconSvg = 'data:image/svg+xml;base64,' + btoa(svgContent);\r\n \r\n // 使用 CallbackProperty 动态设置 heightReference,支持 2D/3D 模式切换\r\n const viewer = this.viewer;\r\n \r\n layer.entities.add({\r\n id,\r\n name: '',\r\n name_str: nameStr,\r\n shape: 'point',\r\n type: 'feature_point',\r\n position: position,\r\n billboard: {\r\n image: iconSvg, // 使用 Data URL 格式的 SVG 图标\r\n width: 25,\r\n height: 25,\r\n verticalOrigin: new C.CallbackProperty(() => {\r\n return viewer.scene.mode === C.SceneMode.SCENE2D \r\n ? C.VerticalOrigin.CENTER \r\n : C.VerticalOrigin.BOTTOM;\r\n }, false),\r\n heightReference: new C.CallbackProperty(() => {\r\n return viewer.scene.mode === C.SceneMode.SCENE2D \r\n ? C.HeightReference.NONE \r\n : C.HeightReference.CLAMP_TO_GROUND;\r\n }, false),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n },\r\n properties: {\r\n _type: 'point-marker',\r\n lon: item.position.lon,\r\n lat: item.position.lat,\r\n height: item.position.height || 0,\r\n },\r\n } as any);\r\n \r\n // 创建标签(显示名称)- 点标记需要更高的位置\r\n try {\r\n layer.entities.add({\r\n id: `${id}-label`,\r\n name: 'Point Label',\r\n position: position,\r\n label: {\r\n text: nameStr,\r\n font: 'bold 16px Microsoft YaHei, SimHei, sans-serif',\r\n fillColor: colors.lineFinalColor,\r\n outlineColor: C.Color.BLACK,\r\n outlineWidth: 1,\r\n style: C.LabelStyle.FILL_AND_OUTLINE,\r\n verticalOrigin: C.VerticalOrigin.BOTTOM,\r\n // 点标记图标高度 45px,标签需要在图标上方\r\n pixelOffset: new C.Cartesian2(0, -30),\r\n disableDepthTestDistance: Number.POSITIVE_INFINITY,\r\n heightReference: new C.CallbackProperty(() => {\r\n return viewer.scene.mode === C.SceneMode.SCENE2D \r\n ? C.HeightReference.NONE \r\n : C.HeightReference.CLAMP_TO_GROUND;\r\n }, false),\r\n },\r\n properties: { _ownerId: id, _type: 'point-label' },\r\n } as any);\r\n } catch (e) {\r\n console.warn('[PolygonEditor] 创建特征点标签失败:', e);\r\n }\r\n }\r\n}\r\n","import type * as Cesium from 'cesium';\r\nimport { globalState } from './StateManager';\r\nimport { toggle2D3D } from './toggle2D3D';\r\nimport {\r\n CZMLPathManager,\r\n type PathSample,\r\n type PathStyleOptions,\r\n} from './CZMLPathManager';\r\nimport { PolygonEditor } from './PolygonEditor';\r\n\r\nexport interface CzmlImportOptions {\r\n // Intentionally empty for now; CzmlDataSource doesn't accept clamp options like KML\r\n}\r\n\r\nexport interface CzmlExportOptions {\r\n name?: string; // Will be used as the CZML document name\r\n}\r\n\r\nexport interface ShapePointProps {\r\n id?: string;\r\n lon: number;\r\n lat: number;\r\n height?: number;\r\n name?: string;\r\n description?: string;\r\n}\r\n\r\nexport interface ShapeLineProps {\r\n id?: string;\r\n coords: Array<[number, number, number?]>; // [lon, lat, height?]\r\n name?: string;\r\n description?: string;\r\n}\r\n\r\nexport interface ShapePolygonProps {\r\n id?: string;\r\n coords: Array<[number, number, number?]>; // outer ring only (simple)\r\n name?: string;\r\n description?: string;\r\n}\r\n\r\ntype Entity = Cesium.Entity;\r\n\r\n// 经纬度 + 地形高 类型(height 为 hTerrain,单位米;保留 3 位小数,若计算为负则置 0;无法获取时为 null)\r\nexport type LonLatHeight = { lon: number; lat: number; height: number | null };\r\n\r\nexport class CZMLManager {\r\n // 选中状态管理(只记录当前选中的实体,不再保存原始材质)\r\n private currentSelectedEntity: Entity | null = null;\r\n private activePolygonSession: { stop: () => void } | null = null;\r\n private polygonSessionCleanup?: () => void;\r\n\r\n constructor(\r\n private CesiumNS: typeof Cesium,\r\n private viewer: Cesium.Viewer,\r\n ) {}\r\n\r\n private _polygonEditor?: any;\r\n private get polygonEditor() {\r\n if (!this._polygonEditor) {\r\n this._polygonEditor = new PolygonEditor(this.CesiumNS, this.viewer);\r\n }\r\n return this._polygonEditor;\r\n }\r\n\r\n // Path manager composition\r\n private _pathMgr?: CZMLPathManager;\r\n private get pathMgr() {\r\n if (!this._pathMgr) this._pathMgr = new CZMLPathManager(this.CesiumNS, this.viewer);\r\n return this._pathMgr;\r\n }\r\n\r\n async importCZML(czml: any | URL, _opts?: CzmlImportOptions) {\r\n const C = this.CesiumNS as any;\r\n const ds = await C.CzmlDataSource.load(czml);\r\n this.viewer.dataSources.add(ds);\r\n return ds;\r\n }\r\n\r\n exportCZML(entities: Entity[] | Cesium.EntityCollection, opts?: CzmlExportOptions): any[] {\r\n const C: any = this.CesiumNS as any;\r\n const now = C.JulianDate.now();\r\n const items: Entity[] = Array.isArray(entities) ? entities : (entities.values as Entity[]);\r\n\r\n const colorToRgba = (color: any, fallback: [number, number, number, number]) => {\r\n if (!color) return fallback;\r\n try {\r\n const c = color.getValue ? color.getValue(now) : color;\r\n const r = Math.round((c.red ?? 1) * 255);\r\n const g = Math.round((c.green ?? 1) * 255);\r\n const b = Math.round((c.blue ?? 1) * 255);\r\n const a = Math.round((c.alpha ?? 1) * 255);\r\n return [r, g, b, a] as [number, number, number, number];\r\n } catch {\r\n return fallback;\r\n }\r\n };\r\n\r\n const res: any[] = [{ id: 'document', name: opts?.name ?? 'Export', version: '1.0' }];\r\n\r\n for (const e of items) {\r\n const id = (e.id as string) || undefined;\r\n const name = (e.name as string) || undefined;\r\n const description = (e.description as any) || undefined;\r\n\r\n // Path entity (SampledPositionProperty + optional PathGraphics)\r\n const czmlFromPath = this.pathMgr.exportEntityToCzml(e, res);\r\n if (czmlFromPath) continue;\r\n\r\n if (e.position?.getValue && (e as any).point) {\r\n const cart = e.position.getValue(now);\r\n if (cart) {\r\n const carto = C.Cartographic.fromCartesian(cart);\r\n const lon = C.Math.toDegrees(carto.longitude);\r\n const lat = C.Math.toDegrees(carto.latitude);\r\n const h = carto.height ?? 0;\r\n const rgba = colorToRgba(e.point?.color, [255, 0, 0, 255]);\r\n res.push({\r\n id: id ?? `point-${Math.random().toString(36).slice(2)}`,\r\n name,\r\n description,\r\n position: { cartographicDegrees: [lon, lat, h] },\r\n point: { pixelSize: e.point?.pixelSize ?? 8, color: { rgba } },\r\n });\r\n }\r\n } else if (e.polyline?.positions?.getValue) {\r\n const arr = e.polyline.positions.getValue(now) as any[];\r\n if (arr && arr.length > 1) {\r\n const coords: number[] = [];\r\n for (const c of arr) {\r\n const carto = C.Cartographic.fromCartesian(c);\r\n coords.push(\r\n C.Math.toDegrees(carto.longitude),\r\n C.Math.toDegrees(carto.latitude),\r\n carto.height ?? 0,\r\n );\r\n }\r\n const matAny: any = (e.polyline as any)?.material;\r\n const rgba = colorToRgba(matAny?.color ?? matAny, [255, 255, 0, 255]);\r\n const widthProp: any = (e.polyline as any)?.width;\r\n const width = widthProp?.getValue ? widthProp.getValue(now) : (widthProp ?? 2);\r\n res.push({\r\n id: id ?? `line-${Math.random().toString(36).slice(2)}`,\r\n name,\r\n description,\r\n polyline: {\r\n positions: { cartographicDegrees: coords },\r\n width,\r\n material: { solidColor: { color: { rgba } } },\r\n },\r\n });\r\n }\r\n } else if (e.polygon?.hierarchy?.getValue) {\r\n const h = e.polygon.hierarchy.getValue(now) as any;\r\n const positions: any[] = h?.positions ?? h;\r\n if (positions && positions.length >= 3) {\r\n const coords: number[] = [];\r\n for (const c of positions) {\r\n const carto = C.Cartographic.fromCartesian(c);\r\n coords.push(\r\n C.Math.toDegrees(carto.longitude),\r\n C.Math.toDegrees(carto.latitude),\r\n carto.height ?? 0,\r\n );\r\n }\r\n const polyMat: any = (e.polygon as any)?.material;\r\n const rgba = colorToRgba(polyMat?.color ?? polyMat, [0, 255, 255, Math.round(0.4 * 255)]);\r\n res.push({\r\n id: id ?? `poly-${Math.random().toString(36).slice(2)}`,\r\n name,\r\n description,\r\n polygon: {\r\n positions: { cartographicDegrees: coords },\r\n material: { solidColor: { color: { rgba } } },\r\n // Outlines on terrain are tricky; omit here and let consumers style separately if desired\r\n },\r\n });\r\n }\r\n }\r\n }\r\n\r\n return res;\r\n }\r\n\r\n // ===== Path APIs (delegates) =====\r\n /**\r\n * 回显飞航路线:显示完整飞航路线、航点编号和起始点箭头\r\n * \r\n * 接收 Sinofly 航线路数据,自动转换为本库格式并渲染显示。\r\n * 请使用 pathMgr.renderFlightPath() 方法或直接导入 renderFlightPath 函数。\r\n * \r\n * @deprecated 请使用 pathMgr.renderFlightPath() 或直接导入 renderFlightPath 函数\r\n * @param options Sinofly 数据和配置选项\r\n * @returns 创建的 polyline 实体\r\n * \r\n * @example\r\n * ```typescript\r\n * // 推荐方式 1: 使用 pathMgr\r\n * const entity = czmlManager.pathMgr.renderFlightPath(Cesium, viewer, {\r\n * data: sinoflyData\r\n * });\r\n * \r\n * // 推荐方式 2: 直接导入函数\r\n * import { renderFlightPath } from '@jorgmoritz/gis-manager';\r\n * const entity = renderFlightPath(Cesium, viewer, {\r\n * data: sinoflyData\r\n * });\r\n * ```\r\n */\r\n renderFlightPath(options: import('./path-manager/renderFlightPath').RenderFlightPathOptions): Entity {\r\n return this.pathMgr.renderFlightPath(options);\r\n }\r\n\r\n /**\r\n * 预览模式渲染飞航路线:支持航点点击高亮\r\n * \r\n * 与 renderFlightPath 不同,此方法返回一个控制器对象,支持:\r\n * - 航点点击事件回调\r\n * - 程序化设置选中航点(高亮显示)\r\n * - 列表与地图双向联动\r\n * \r\n * @param options 预览选项\r\n * @returns 包含实体和控制器的对象\r\n */\r\n renderFlightPathPreview(\r\n options: import('./path-manager/renderFlightPath').RenderFlightPathPreviewOptions\r\n ): { entity: Entity; controller: import('./path-manager/renderFlightPath').FlightPathPreviewController } {\r\n return this.pathMgr.renderFlightPathPreview(options);\r\n }\r\n\r\n addPathSample(entityOrId: Entity | string, sample: PathSample) {\r\n return this.pathMgr.addPathSample(entityOrId, sample);\r\n }\r\n\r\n addPathSamples(entityOrId: Entity | string, samples: PathSample[]) {\r\n return this.pathMgr.addPathSamples(entityOrId, samples);\r\n }\r\n\r\n setPathSamples(entityOrId: Entity | string, samples: PathSample[]) {\r\n return this.pathMgr.setPathSamples(entityOrId, samples);\r\n }\r\n\r\n clearPathSamples(entityOrId: Entity | string) {\r\n return this.pathMgr.clearPathSamples(entityOrId);\r\n }\r\n\r\n setPathStyle(entityOrId: Entity | string, style: PathStyleOptions) {\r\n return this.pathMgr.setPathStyle(entityOrId, style);\r\n }\r\n\r\n // Interactive path (polyline) drawing & editing delegates\r\n startPathDrawing(\r\n options?: {\r\n layer?: Cesium.CustomDataSource;\r\n idPrefix?: string;\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n },\r\n onComplete?: (entity: Entity) => void,\r\n ) {\r\n return this.pathMgr.startPathDrawing(options, onComplete);\r\n }\r\n\r\n startPathEditing(\r\n entityOrId: Entity | string,\r\n options?: {\r\n layer?: Cesium.CustomDataSource;\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n },\r\n ) {\r\n return this.pathMgr.startPathEditing(entityOrId, options);\r\n }\r\n\r\n addPoint(props: ShapePointProps): Entity {\r\n const C = this.CesiumNS as any;\r\n return this.viewer.entities.add({\r\n id: props.id,\r\n name: props.name,\r\n description: props.description,\r\n position: C.Cartesian3.fromDegrees(props.lon, props.lat, props.height ?? 0),\r\n point: { pixelSize: 8, color: C.Color.RED },\r\n });\r\n }\r\n\r\n addLine(props: ShapeLineProps): Entity {\r\n const C = this.CesiumNS as any;\r\n const positions = props.coords.map(([lon, lat, h]) =>\r\n C.Cartesian3.fromDegrees(lon, lat, h ?? 0),\r\n );\r\n return this.viewer.entities.add({\r\n id: props.id,\r\n name: props.name,\r\n description: props.description,\r\n polyline: { positions, width: 2, material: C.Color.YELLOW },\r\n });\r\n }\r\n\r\n addPolygon(props: ShapePolygonProps): Entity {\r\n // Keep a non-interactive fallback that constructs a polygon entity directly\r\n const C = this.CesiumNS as any;\r\n const positions = props.coords.map(([lon, lat, h]) =>\r\n C.Cartesian3.fromDegrees(lon, lat, h ?? 0),\r\n );\r\n return this.viewer.entities.add({\r\n id: props.id,\r\n name: props.name,\r\n description: props.description,\r\n polygon: {\r\n hierarchy: positions,\r\n material: C.Color.fromCssColorString('rgba(0,255,255,0.4)'),\r\n outline: true,\r\n outlineColor: C.Color.CYAN,\r\n },\r\n } as any);\r\n }\r\n\r\n /**\r\n * 创建一个新的自定义图层用于存放多边形实体。\r\n * @param name 自定义图层名称:string,默认值为'Polygons'\r\n * @returns 自定义图层对象\r\n */\r\n createPolygonLayer(name = 'Polygons'): Cesium.CustomDataSource {\r\n const C: any = this.CesiumNS as any;\r\n const ds = new C.CustomDataSource(name);\r\n this.viewer.dataSources.add(ds);\r\n return ds;\r\n }\r\n\r\n /**\r\n * 多边形绘制会话管理接口,创建一个polygon绘制对话,允许用户通过鼠标交互绘制多边形。\r\n * @param type 图层类型 ('subarray' | 'inverter' | 'other')\r\n * @param onComplete 结果回调函数,参数为新创建的多边形实体\r\n * @returns 返回一个polygon绘制会话对象\r\n */\r\n startPolygonDrawing(\r\n type: string,\r\n onComplete?: (entity: Entity) => void,\r\n ) {\r\n this.ensurePolygonSessionHooks();\r\n this.cancelActivePolygonDrawing('start new polygon drawing');\r\n\r\n // Ensure we are in 2D mode before starting polygon drawing.\r\n // If in 3D, toggle to 2D (with position preservation). If in Columbus View (2.5D), morph to 2D as well.\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const scene: any = (this.viewer as any).scene;\r\n // const cam: any = (this.viewer as any).camera;\r\n const mode = scene?.mode;\r\n\r\n if (mode === C.SceneMode.SCENE3D) {\r\n toggle2D3D(\r\n {\r\n CesiumNS: C,\r\n viewer: this.viewer,\r\n getLastPerspectiveOrientation: () => undefined,\r\n setLastPerspectiveOrientation: () => {},\r\n },\r\n { duration: 0 },\r\n );\r\n } \r\n // else if (mode !== C.SceneMode.SCENE2D) {\r\n // // Columbus View or morphing: do a direct morph to 2D and restore camera to same lon/lat/height\r\n // let captured: { lon: number; lat: number; height: number } | undefined;\r\n // let capturedOri: { heading: number; pitch: number; roll: number } | undefined;\r\n // try {\r\n // const cart = this.CesiumNS.Cartographic.fromCartesian(cam.position);\r\n // captured = {\r\n // lon: this.CesiumNS.Math.toDegrees(cart.longitude),\r\n // lat: this.CesiumNS.Math.toDegrees(cart.latitude),\r\n // height: cart.height,\r\n // };\r\n // capturedOri = {\r\n // heading: cam.heading ?? 0,\r\n // pitch: cam.pitch ?? -0.8,\r\n // roll: cam.roll ?? 0,\r\n // };\r\n // } catch {}\r\n // const onDone = () => {\r\n // try {\r\n // if (captured) {\r\n // const dest = this.CesiumNS.Cartesian3.fromDegrees(\r\n // captured.lon,\r\n // captured.lat,\r\n // Math.max(1, captured.height),\r\n // );\r\n // (this.viewer as any).camera.setView({\r\n // destination: dest,\r\n // orientation: capturedOri,\r\n // } as any);\r\n // }\r\n // } finally {\r\n // scene.morphComplete?.removeEventListener?.(onDone);\r\n // }\r\n // };\r\n // scene.morphComplete?.addEventListener?.(onDone);\r\n // scene.morphTo2D?.(0);\r\n // }\r\n } catch {\r\n // No-op: if anything fails, still try to start drawing\r\n }\r\n\r\n let layer = null;\r\n if(type == 'subarray') {\r\n if(this.viewer.dataSources.getByName('subarray').length < 1){\r\n const data = new this.CesiumNS.CustomDataSource('subarray')\r\n this.viewer.dataSources.add(data);\r\n layer = data;\r\n }else {\r\n layer = this.viewer.dataSources.getByName('subarray')[0];\r\n }\r\n \r\n // 创建或获取 subarray 图层后,确保 inverter 图层(如果存在)始终在最上层\r\n const inverterLayers = this.viewer.dataSources.getByName('inverter');\r\n if (inverterLayers.length > 0) {\r\n const inverterLayer = inverterLayers[0];\r\n const index = this.viewer.dataSources.indexOf(inverterLayer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n // 移除并重新添加到末尾\r\n this.viewer.dataSources.remove(inverterLayer as any, false); // false 表示不销毁\r\n this.viewer.dataSources.add(inverterLayer as any);\r\n }\r\n }\r\n }else if(type == 'inverter') {\r\n if(this.viewer.dataSources.getByName('inverter').length <1) {\r\n const data = new this.CesiumNS.CustomDataSource('inverter')\r\n this.viewer.dataSources.add(data);\r\n layer = data;\r\n }\r\n else {\r\n layer = this.viewer.dataSources.getByName('inverter')[0];\r\n }\r\n \r\n // 确保 inverter 图层始终在最上层(渲染顺序最后)\r\n // 如果 inverter 图层已存在但不在最后位置,将其移到最后\r\n if (layer) {\r\n const index = this.viewer.dataSources.indexOf(layer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n // 移除并重新添加到末尾\r\n this.viewer.dataSources.remove(layer as any, false); // false 表示不销毁\r\n this.viewer.dataSources.add(layer as any);\r\n }\r\n }\r\n }else {\r\n if(this.viewer.dataSources.getByName('other').length <1) {\r\n const data = new this.CesiumNS.CustomDataSource('other')\r\n this.viewer.dataSources.add(data);\r\n layer = data;\r\n }\r\n else {\r\n layer = this.viewer.dataSources.getByName('other')[0];\r\n }\r\n \r\n // 确保 inverter 图层始终在最上层(渲染顺序最后)\r\n // 如果 inverter 图层已存在但不在最后位置,将其移到最后\r\n if (layer) {\r\n const index = this.viewer.dataSources.indexOf(layer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n // 移除并重新添加到末尾\r\n this.viewer.dataSources.remove(layer as any, false); // false 表示不销毁\r\n this.viewer.dataSources.add(layer as any);\r\n }\r\n }\r\n }\r\n\r\n const session = this.polygonEditor.startDrawing(type, layer, (entity: Entity) => {\r\n this.cancelActivePolygonDrawing();\r\n onComplete?.(entity);\r\n });\r\n\r\n if (session && typeof session.stop === 'function') {\r\n this.activePolygonSession = session;\r\n } else {\r\n this.activePolygonSession = null;\r\n }\r\n\r\n return session;\r\n }\r\n\r\n /**\r\n * 圆形绘制会话管理接口,创建一个圆形绘制对话,允许用户通过鼠标交互绘制圆形。\r\n * 使用流程:\r\n * 1. 左键点击确定圆心\r\n * 2. 移动鼠标动态调整半径\r\n * 3. 再次左键点击确定半径,完成绘制\r\n * 4. 或右键/ESC取消绘制\r\n * \r\n * @param onComplete 结果回调函数,参数为新创建的圆形实体\r\n * @returns 返回一个圆形绘制会话对象,包含 stop() 方法\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 startCircleDrawing 方法\r\n */\r\n startCircleDrawing(onComplete?: (entity: Entity) => void): any {\r\n // 确保在 2D 模式下绘制圆形\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const scene: any = (this.viewer as any).scene;\r\n const mode = scene?.mode;\r\n\r\n if (mode === C.SceneMode.SCENE3D) {\r\n // 切换到 2D 模式\r\n toggle2D3D(\r\n {\r\n CesiumNS: C,\r\n viewer: this.viewer,\r\n getLastPerspectiveOrientation: () => undefined,\r\n setLastPerspectiveOrientation: () => {},\r\n },\r\n { duration: 0 },\r\n );\r\n }\r\n } catch (e) {\r\n console.warn('[CZMLManager] 切换到 2D 模式失败:', e);\r\n }\r\n\r\n // 获取或创建 'other' 图层\r\n let layer: any;\r\n if (this.viewer.dataSources.getByName('other').length < 1) {\r\n const data = new this.CesiumNS.CustomDataSource('other');\r\n this.viewer.dataSources.add(data);\r\n layer = data;\r\n } else {\r\n layer = this.viewer.dataSources.getByName('other')[0];\r\n }\r\n\r\n // 确保 other 图层在合适的位置\r\n if (layer) {\r\n const index = this.viewer.dataSources.indexOf(layer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n this.viewer.dataSources.remove(layer as any, false);\r\n this.viewer.dataSources.add(layer as any);\r\n }\r\n }\r\n\r\n return (this.polygonEditor as any).startCircleDrawing?.(layer, onComplete);\r\n }\r\n\r\n /**\r\n * 点标记绘制会话管理接口,创建一个点标记绘制对话,允许用户通过鼠标交互连续添加点标记。\r\n * 使用流程:\r\n * 1. 左键点击地图添加点标记\r\n * 2. 可连续点击添加多个点\r\n * 3. 右键或 ESC 结束绘制\r\n * \r\n * @param iconSvg SVG 图标的 data URL 或路径\r\n * @param onComplete 每次添加点时的回调函数(可选)\r\n * @returns 返回一个点标记绘制会话对象,包含 stop() 方法\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 startPointDrawing 方法\r\n */\r\n startPointDrawing(iconSvg?: string, onComplete?: (entity: Entity) => void): any {\r\n // 确保在 2D 模式下绘制点标记\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const scene: any = (this.viewer as any).scene;\r\n const mode = scene?.mode;\r\n\r\n if (mode === C.SceneMode.SCENE3D) {\r\n // 切换到 2D 模式\r\n toggle2D3D(\r\n {\r\n CesiumNS: C,\r\n viewer: this.viewer,\r\n getLastPerspectiveOrientation: () => undefined,\r\n setLastPerspectiveOrientation: () => {},\r\n },\r\n { duration: 0 },\r\n );\r\n }\r\n } catch (e) {\r\n console.warn('[CZMLManager] 切换到 2D 模式失败:', e);\r\n }\r\n\r\n // 获取或创建 'other' 图层\r\n let layer: any;\r\n if (this.viewer.dataSources.getByName('other').length < 1) {\r\n const data = new this.CesiumNS.CustomDataSource('other');\r\n this.viewer.dataSources.add(data);\r\n layer = data;\r\n } else {\r\n layer = this.viewer.dataSources.getByName('other')[0];\r\n }\r\n\r\n // 确保 other 图层在合适的位置\r\n if (layer) {\r\n const index = this.viewer.dataSources.indexOf(layer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n this.viewer.dataSources.remove(layer as any, false);\r\n this.viewer.dataSources.add(layer as any);\r\n }\r\n }\r\n\r\n return (this.polygonEditor as any).startPointDrawing?.(layer, iconSvg, onComplete);\r\n }\r\n\r\n // New: start editing an existing polygon entity's vertices\r\n // Accepts: an Entity, or an id string, or undefined to use the last selected entity from state\r\n startPolygonEditing(entityOrId?: Entity | string | undefined | null,\r\n onComplete?: (entity: Entity) => void, ) {\r\n this.cancelActivePolygonDrawing('switch to editing');\r\n // Ensure we are in 2D mode before starting polygon editing (same as drawing)\r\n try {\r\n const C: any = this.CesiumNS as any;\r\n const scene: any = (this.viewer as any).scene;\r\n // const cam: any = (this.viewer as any).camera;\r\n const mode = scene?.mode;\r\n\r\n if (mode === C.SceneMode.SCENE3D) {\r\n toggle2D3D(\r\n {\r\n CesiumNS: this.CesiumNS,\r\n viewer: this.viewer,\r\n getLastPerspectiveOrientation: () => undefined,\r\n setLastPerspectiveOrientation: () => {},\r\n },\r\n { duration: 0 },\r\n );\r\n } \r\n // else if (mode !== C.SceneMode.SCENE2D) {\r\n // let captured: { lon: number; lat: number; height: number } | undefined;\r\n // let capturedOri: { heading: number; pitch: number; roll: number } | undefined;\r\n // try {\r\n // const cart = this.CesiumNS.Cartographic.fromCartesian(cam.position);\r\n // captured = {\r\n // lon: this.CesiumNS.Math.toDegrees(cart.longitude),\r\n // lat: this.CesiumNS.Math.toDegrees(cart.latitude),\r\n // height: cart.height,\r\n // };\r\n // capturedOri = {\r\n // heading: cam.heading ?? 0,\r\n // pitch: cam.pitch ?? -0.8,\r\n // roll: cam.roll ?? 0,\r\n // };\r\n // } catch {}\r\n // const onDone = () => {\r\n // try {\r\n // if (captured) {\r\n // const dest = this.CesiumNS.Cartesian3.fromDegrees(\r\n // captured.lon,\r\n // captured.lat,\r\n // Math.max(1, captured.height),\r\n // );\r\n // (this.viewer as any).camera.setView({\r\n // destination: dest,\r\n // orientation: capturedOri,\r\n // } as any);\r\n // }\r\n // } finally {\r\n // scene.morphComplete?.removeEventListener?.(onDone);\r\n // }\r\n // };\r\n // scene.morphComplete?.addEventListener?.(onDone);\r\n // scene.morphTo2D?.(0);\r\n // }\r\n } catch {}\r\n\r\n let entity: Entity | undefined;\r\n if (!entityOrId) {\r\n const sel = globalState.getSelected?.() as any;\r\n entity = sel?.entity as Entity | undefined;\r\n } else if (typeof entityOrId === 'string') {\r\n entity = this.viewer.entities.getById(entityOrId) as Entity | undefined;\r\n } else {\r\n entity = entityOrId;\r\n }\r\n if (!entity || !(entity as any).polygon) return undefined;\r\n const dataSource = this.getEntityDataSource(entity) as Cesium.CustomDataSource | null;\r\n if(!dataSource) return undefined;\r\n \r\n // 如果编辑的是 inverter 图层,确保它始终在最上层\r\n if (dataSource.name === 'inverter') {\r\n const index = this.viewer.dataSources.indexOf(dataSource as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n // 移除并重新添加到末尾\r\n this.viewer.dataSources.remove(dataSource as any, false); // false 表示不销毁\r\n this.viewer.dataSources.add(dataSource as any);\r\n }\r\n }\r\n \r\n // 如果编辑的是 subarray 图层,确保 inverter 图层(如果存在)在最上层\r\n if (dataSource.name === 'subarray') {\r\n const inverterLayers = this.viewer.dataSources.getByName('inverter');\r\n if (inverterLayers.length > 0) {\r\n const inverterLayer = inverterLayers[0];\r\n const index = this.viewer.dataSources.indexOf(inverterLayer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n // 移除并重新添加到末尾\r\n this.viewer.dataSources.remove(inverterLayer as any, false); // false 表示不销毁\r\n this.viewer.dataSources.add(inverterLayer as any);\r\n }\r\n }\r\n \r\n }\r\n\r\n if (dataSource.name === 'other') {\r\n const otherLayers = this.viewer.dataSources.getByName('other');\r\n if (otherLayers.length > 0) {\r\n const otherLayer = otherLayers[0];\r\n const index = this.viewer.dataSources.indexOf(otherLayer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n // 移除并重新添加到末尾\r\n this.viewer.dataSources.remove(otherLayer as any, false); // false 表示不销毁\r\n this.viewer.dataSources.add(otherLayer as any);\r\n }\r\n }\r\n \r\n }\r\n \r\n return this.polygonEditor.startEditing(entity, dataSource,onComplete);\r\n }\r\n\r\n private ensurePolygonSessionHooks(): void {\r\n if (this.polygonSessionCleanup || typeof window === 'undefined' || typeof document === 'undefined') {\r\n return;\r\n }\r\n\r\n const blurHandler = () => this.cancelActivePolygonDrawing('window blurred');\r\n const visibilityHandler = () => {\r\n if (document.hidden) {\r\n this.cancelActivePolygonDrawing('document hidden');\r\n }\r\n };\r\n\r\n window.addEventListener('blur', blurHandler);\r\n document.addEventListener('visibilitychange', visibilityHandler);\r\n\r\n this.polygonSessionCleanup = () => {\r\n window.removeEventListener('blur', blurHandler);\r\n document.removeEventListener('visibilitychange', visibilityHandler);\r\n this.polygonSessionCleanup = undefined;\r\n };\r\n }\r\n\r\n private cancelActivePolygonDrawing(reason?: string): void {\r\n if (this.activePolygonSession?.stop) {\r\n try {\r\n this.activePolygonSession.stop();\r\n if (reason) {\r\n // eslint-disable-next-line no-console\r\n console.log(`[CZMLManager] polygon session stopped: ${reason}`);\r\n }\r\n } catch (err) {\r\n // eslint-disable-next-line no-console\r\n console.warn('[CZMLManager] Failed to stop polygon session:', err);\r\n }\r\n }\r\n this.activePolygonSession = null;\r\n }\r\n\r\n /**\r\n * 删除一个 polygon 实体及其 outline\r\n * @param entityOrId 要删除的实体,或实体 ID,或 undefined 使用当前选中的实体\r\n * @param onComplete 删除完成后的回调函数\r\n * @returns 是否成功删除\r\n */\r\n startPolygonDeleting(entityOrId?: Entity | string | undefined | null, onComplete?: (entity: Entity) => void): boolean {\r\n let entity: Entity | undefined;\r\n \r\n // 解析实体\r\n if (!entityOrId) {\r\n const sel = globalState.getSelected?.() as any;\r\n entity = sel?.entity as Entity | undefined;\r\n } else if (typeof entityOrId === 'string') {\r\n entity = this.viewer.entities.getById(entityOrId) as Entity | undefined;\r\n } else {\r\n entity = entityOrId;\r\n }\r\n \r\n // 验证实体\r\n if (!entity || !(entity as any).polygon) {\r\n console.warn('[CZMLManager] Invalid entity for deletion: not a polygon');\r\n return false;\r\n }\r\n \r\n // 获取 DataSource\r\n const dataSource = this.getEntityDataSource(entity) as Cesium.CustomDataSource | null;\r\n if (!dataSource) {\r\n console.warn('[CZMLManager] Cannot find DataSource for entity:', entity.id);\r\n return false;\r\n }\r\n \r\n try {\r\n // 如果当前选中的是要删除的实体,先清除选择状态\r\n if (this.currentSelectedEntity === entity) {\r\n this.clearPolygonSelection();\r\n }\r\n \r\n // 删除 label 实体 (如果存在)\r\n const labelId = `${entity.id}-label`;\r\n const labelEntity = dataSource.entities.getById(labelId);\r\n if (labelEntity) {\r\n dataSource.entities.remove(labelEntity);\r\n }\r\n \r\n // 删除 outline 实体 (如果存在)\r\n const outlineId = `${entity.id}-outline`;\r\n const outlineEntity = dataSource.entities.getById(outlineId);\r\n if (outlineEntity) {\r\n dataSource.entities.remove(outlineEntity);\r\n }\r\n \r\n // 删除主实体\r\n const removed = dataSource.entities.remove(entity);\r\n \r\n if (removed) {\r\n // 调用完成回调\r\n if (onComplete) {\r\n try {\r\n onComplete(entity);\r\n } catch (e) {\r\n console.error('[CZMLManager] Error in onComplete callback:', e);\r\n }\r\n }\r\n \r\n return true;\r\n } else {\r\n console.warn('[CZMLManager] Failed to remove entity from DataSource');\r\n return false;\r\n }\r\n } catch (e) {\r\n console.error('[CZMLManager] Error during polygon deletion:', e);\r\n return false;\r\n }\r\n }\r\n\r\n updateEntity(id: string, patch: Partial<{ name: string; description: string }>): void {\r\n const e = this.viewer.entities.getById(id);\r\n if (!e) return;\r\n if (patch.name !== undefined) e.name = patch.name;\r\n if (patch.description !== undefined) e.description = patch.description as any;\r\n }\r\n\r\n deleteEntity(id: string): void {\r\n this.viewer.entities.removeById(id);\r\n }\r\n\r\n listEntities(): Entity[] {\r\n return this.viewer.entities.values as unknown as Entity[];\r\n }\r\n\r\n /**\r\n * 获取实体的经纬度与地形高数组(仅外环/各点/单点)。\r\n * - 地形高来自 viewer.scene.globe.getHeight(carto)\r\n * - 高度保留 3 位小数;若为负数则置为 0\r\n * - 无法获取地形高时 height 为 null\r\n *\r\n * 支持的实体类型:polygon(仅外环)、polyline、point/billboard\r\n */\r\n getEntityLonLatTerrainHeightArray(entity: any): LonLatHeight[] {\r\n const C: any = this.CesiumNS;\r\n const now = C.JulianDate.now();\r\n\r\n const toLonLatHeight = (p: any): LonLatHeight => {\r\n const carto = C.Cartographic.fromCartesian(p);\r\n const lon = C.Math.toDegrees(carto.longitude);\r\n const lat = C.Math.toDegrees(carto.latitude);\r\n let hTerrain: number | undefined;\r\n try {\r\n hTerrain = this.viewer?.scene?.globe?.getHeight?.(carto);\r\n } catch {}\r\n if (typeof hTerrain === 'number') {\r\n const fixed = Number(hTerrain.toFixed(3));\r\n const clamped = fixed < 0 ? 0 : fixed;\r\n return { lon, lat, height: clamped };\r\n }\r\n return { lon, lat, height: null };\r\n };\r\n\r\n // Polygon\r\n if (entity?.polygon?.hierarchy) {\r\n const hProp: any = entity.polygon.hierarchy;\r\n const hVal: any = typeof hProp?.getValue === 'function' ? hProp.getValue(now) : hProp;\r\n const outer: any[] = Array.isArray(hVal) ? hVal : (hVal?.positions ?? []);\r\n const points = outer.map(toLonLatHeight);\r\n // 多边形首尾闭合:如果首尾点不同,则添加第一个点到末尾\r\n if (points.length > 0) {\r\n const first = points[0];\r\n const last = points[points.length - 1];\r\n if (first.lon !== last.lon || first.lat !== last.lat || first.height !== last.height) {\r\n points.push({ ...first });\r\n }\r\n }\r\n return points;\r\n }\r\n\r\n // Polyline\r\n if (entity?.polyline?.positions) {\r\n const pProp: any = entity.polyline.positions;\r\n const pVal: any[] = typeof pProp?.getValue === 'function' ? pProp.getValue(now) : pProp;\r\n return (pVal ?? []).map(toLonLatHeight);\r\n }\r\n\r\n // Point / Billboard position\r\n if (entity?.position) {\r\n const pos: any = typeof entity.position?.getValue === 'function' ? entity.position.getValue(now) : entity.position;\r\n return pos ? [toLonLatHeight(pos)] : [];\r\n }\r\n\r\n return [];\r\n }\r\n\r\n getEntityDataSource(entity: any): Cesium.DataSource | null {\r\n if (!entity) return null;\r\n try {\r\n const owner = (entity as any)?.entityCollection?.owner;\r\n if (owner) return owner; // 通常为 CustomDataSource/CzmlDataSource\r\n } catch {}\r\n // 兜底:遍历 DataSourceCollection\r\n try {\r\n const dsCol = this.viewer?.dataSources;\r\n const len: number = typeof dsCol?.length === 'number' ? dsCol.length : 0;\r\n for (let i = 0; i < len; i++) {\r\n const ds = dsCol.get(i);\r\n if (ds?.entities?.contains?.(entity)) return ds;\r\n }\r\n } catch {}\r\n return null;\r\n}\r\n\r\n /**\r\n * 选择一个 polygon 实体并高亮显示\r\n * 新逻辑:\r\n * - 只对 subarray 和 inverter 图层的多边形生效\r\n * - 设置 checked=true,使用 type 对应的高亮颜色(faceColor 和 lineColor)\r\n * - faceColor:鲜艳的填充色(用于高亮)\r\n * - lineColor:鲜艳的轮廓线色(用于高亮)\r\n * \r\n * @param entity 要选择的实体,如果为 null 则取消当前选择\r\n * @returns 是否成功选择\r\n */\r\n selectPolygonEntity(entity: Entity | null): boolean {\r\n // 如果传入 null 或非 polygon 实体,取消当前选择\r\n if (!entity || !(entity as any).polygon) {\r\n return this.clearPolygonSelection();\r\n }\r\n \r\n // 获取实体所属图层\r\n const dataSource = this.getEntityDataSource(entity);\r\n const layerName = dataSource?.name || '';\r\n \r\n // 只对 subarray 和 inverter 图层的多边形进行高亮\r\n if (layerName !== 'subarray' && layerName !== 'inverter') {\r\n return false;\r\n }\r\n \r\n // 如果点击的是已经选中的实体,保持高亮状态\r\n if (this.currentSelectedEntity === entity) {\r\n return true; // 已经选中,无需重复操作\r\n }\r\n \r\n // 先取消之前选中实体的高亮\r\n if (this.currentSelectedEntity) {\r\n this.clearPolygonSelection();\r\n }\r\n \r\n // 保存新选中实体\r\n this.currentSelectedEntity = entity;\r\n \r\n // 设置 checked=true\r\n (entity as any).checked = true;\r\n \r\n // 获取实体的 type 和对应的颜色配置\r\n const entityType = (entity as any).type || layerName;\r\n const colors = this.polygonEditor.getColorConfig(entityType);\r\n \r\n try {\r\n // ✅ 高亮时使用 faceColor(鲜艳的填充色)\r\n (entity as any).polygon.material = colors.faceColor;\r\n \r\n // ✅ 高亮时使用 lineColor(鲜艳的轮廓线色)\r\n const entityId = (entity as any).id;\r\n const outlineId = `${entityId}-outline`;\r\n const outlineEntity = dataSource?.entities?.getById(outlineId);\r\n if (outlineEntity && (outlineEntity as any).polyline) {\r\n this.polygonEditor.applyDashedOutlineStyle(outlineEntity, colors.lineColor, 3, 10);\r\n }\r\n \r\n return true;\r\n } catch (e) {\r\n console.error('[CZMLManager] ❌ 高亮多边形失败:', e);\r\n return false;\r\n }\r\n }\r\n \r\n /**\r\n * 检查当前是否处于多边形绘制模式\r\n * @returns 如果正在绘制多边形则返回 true\r\n */\r\n isDrawingActive(): boolean {\r\n try {\r\n // 检查 polygonEditor 是否存在且有活动的 handler\r\n return !!(this._polygonEditor && (this._polygonEditor as any).handler);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n \r\n /**\r\n * 检查当前是否处于多边形编辑模式\r\n * @returns 如果正在编辑多边形则返回 true\r\n */\r\n isEditingActive(): boolean {\r\n try {\r\n // 检查 polygonEditor 是否存在且有编辑手柄\r\n const editor = this._polygonEditor as any;\r\n return !!(this._polygonEditor && editor.editHandles && editor.editHandles.length > 0);\r\n } catch {\r\n return false;\r\n }\r\n }\r\n \r\n /**\r\n * 清除当前的 polygon 选择状态\r\n * 新逻辑:\r\n * - 设置 checked=false\r\n * - 恢复为对应 type 的默认颜色(faceFinalColor 和 lineFinalColor)\r\n * - faceFinalColor:较淡的填充色(默认状态)\r\n * - lineFinalColor:较淡的轮廓线色(默认状态)\r\n * \r\n * @returns 是否成功清除\r\n */\r\n clearPolygonSelection(): boolean {\r\n if (!this.currentSelectedEntity) {\r\n // 没有选中的实体,无需操作\r\n return true;\r\n }\r\n \r\n try {\r\n const entity = this.currentSelectedEntity;\r\n \r\n // 获取实体所属图层\r\n const dataSource = this.getEntityDataSource(entity);\r\n const layerName = dataSource?.name || '';\r\n \r\n // 只处理 subarray 和 inverter 图层\r\n if (layerName === 'subarray' || layerName === 'inverter') {\r\n // 设置 checked=false\r\n (entity as any).checked = false;\r\n \r\n // 获取实体的 type 和对应的颜色配置\r\n const entityType = (entity as any).type || layerName;\r\n const colors = this.polygonEditor.getColorConfig(entityType);\r\n \r\n // ✅ 恢复为 faceFinalColor(较淡的填充色)\r\n (entity as any).polygon.material = colors.faceFinalColor;\r\n \r\n // ✅ 恢复为 lineFinalColor(较淡的轮廓线色)\r\n const entityId = (entity as any).id;\r\n const outlineId = `${entityId}-outline`;\r\n const outlineEntity = dataSource?.entities?.getById(outlineId);\r\n if (outlineEntity && (outlineEntity as any).polyline) {\r\n this.polygonEditor.applyDashedOutlineStyle(outlineEntity, colors.lineFinalColor, 3, 10);\r\n }\r\n }\r\n \r\n // 清除引用\r\n this.currentSelectedEntity = null;\r\n \r\n return true;\r\n } catch (e) {\r\n console.error('[CZMLManager] ❌ 取消高亮失败:', e);\r\n this.currentSelectedEntity = null;\r\n return false;\r\n }\r\n }\r\n \r\n /**\r\n * 获取当前选中的 polygon 实体\r\n * @returns 当前选中的实体,如果没有则返回 null\r\n */\r\n getSelectedPolygonEntity(): Entity | null {\r\n return this.currentSelectedEntity;\r\n }\r\n\r\n /**\r\n * 从点位数组创建一个多边形及其轮廓线和标签\r\n * @param options 创建选项\r\n * - layerName: 图层名称 ('subarray' 或 'inverter')\r\n * - id: 实体ID\r\n * - name: 实体名称\r\n * - points: 点位数组 [{ lon, lat, height }]\r\n * @returns 创建的主多边形实体\r\n */\r\n createPolygonFromPoints(options: {\r\n layerName: 'subarray' | 'inverter';\r\n id: string;\r\n name: string;\r\n points: Array<{ lon: number; lat: number; height?: number }>;\r\n }): Entity | null {\r\n const C = this.CesiumNS as any;\r\n const { layerName, id, name, points } = options;\r\n\r\n // 1. 获取或创建图层\r\n let layer = this.viewer.dataSources.getByName(layerName)[0];\r\n if (!layer) {\r\n layer = new C.CustomDataSource(layerName);\r\n this.viewer.dataSources.add(layer);\r\n }\r\n\r\n // 2. 调用 PolygonEditor 创建多边形 (颜色配置在 PolygonEditor 内部处理)\r\n // ⚠️ 注意:此方法需要 PolygonEditor 实现 createPolygonFromPoints 方法\r\n const entity = (this.polygonEditor as any).createPolygonFromPoints?.({\r\n layer: layer as any,\r\n id,\r\n name,\r\n points,\r\n });\r\n\r\n // 3. 如果创建的是 inverter 图层的多边形,确保 inverter 图层在最上层\r\n if (entity && layerName === 'inverter') {\r\n this.ensureInverterLayerOnTop();\r\n }\r\n\r\n return entity;\r\n }\r\n\r\n /**\r\n * 确保 inverter 图层始终在最上层\r\n */\r\n ensureInverterLayerOnTop(): void {\r\n const inverterLayers = this.viewer.dataSources.getByName('inverter');\r\n if (inverterLayers.length > 0) {\r\n const inverterLayer = inverterLayers[0];\r\n const index = this.viewer.dataSources.indexOf(inverterLayer as any);\r\n const lastIndex = this.viewer.dataSources.length - 1;\r\n if (index >= 0 && index < lastIndex) {\r\n this.viewer.dataSources.remove(inverterLayer as any, false);\r\n this.viewer.dataSources.add(inverterLayer as any);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 分析子阵和组串的层级关系,并自动重新编码\r\n * 代理到 PolygonEditor.analyzeAndEncodePolygonHierarchy()\r\n * @param targetSubarrayEntity - 可选,指定要处理的子阵实体。如果提供,则只处理该子阵及其内部组串\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 analyzeAndEncodePolygonHierarchy 方法\r\n */\r\n analyzeAndEncodePolygonHierarchy(targetSubarrayEntity?: any) {\r\n return (this.polygonEditor as any).analyzeAndEncodePolygonHierarchy?.(targetSubarrayEntity);\r\n }\r\n\r\n /**\r\n * 还原多边形的原始名称\r\n * 代理到 PolygonEditor.restoreOriginalNames()\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 restoreOriginalNames 方法\r\n */\r\n restoreOriginalNames() {\r\n return (this.polygonEditor as any).restoreOriginalNames?.();\r\n }\r\n\r\n /**\r\n * 仅分析多边形层级关系,不修改名称\r\n * 代理到 PolygonEditor.getPolygonHierarchyWithoutEncoding()\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 getPolygonHierarchyWithoutEncoding 方法\r\n */\r\n getPolygonHierarchyWithoutEncoding() {\r\n return (this.polygonEditor as any).getPolygonHierarchyWithoutEncoding?.();\r\n }\r\n\r\n /**\r\n * 导出指定子阵及其内部组串的层级结构\r\n * 代理到 PolygonEditor.exportSingleSubarrayHierarchy()\r\n * @param subarrayEntity - 要导出的子阵实体\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 exportSingleSubarrayHierarchy 方法\r\n */\r\n exportSingleSubarrayHierarchy(subarrayEntity: any) {\r\n return (this.polygonEditor as any).exportSingleSubarrayHierarchy?.(subarrayEntity);\r\n }\r\n\r\n /**\r\n * 导出指定组串的扁平结构\r\n * 代理到 PolygonEditor.exportSingleInverter()\r\n * @param inverterEntity - 要导出的组串实体\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 exportSingleInverter 方法\r\n */\r\n exportSingleInverter(inverterEntity: any) {\r\n return (this.polygonEditor as any).exportSingleInverter?.(inverterEntity);\r\n }\r\n\r\n /**\r\n * 从 JSON 数据批量创建多边形(层级结构)\r\n * 代理到 PolygonEditor.importPolygonsFromHierarchy()\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 importPolygonsFromHierarchy 方法\r\n */\r\n importPolygonsFromHierarchy(data: any) {\r\n return (this.polygonEditor as any).importPolygonsFromHierarchy?.(\r\n data,\r\n this.createPolygonFromPoints.bind(this)\r\n );\r\n }\r\n\r\n /**\r\n * 从 JSON 数据批量创建多边形(扁平结构)\r\n * 代理到 PolygonEditor.importPolygonsFromFlatStructure()\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 importPolygonsFromFlatStructure 方法\r\n */\r\n importPolygonsFromFlatStructure(data: any) {\r\n return (this.polygonEditor as any).importPolygonsFromFlatStructure?.(\r\n data,\r\n this.createPolygonFromPoints.bind(this)\r\n );\r\n }\r\n\r\n /**\r\n * 更新多边形实体的类型、颜色和标签\r\n * 代理到 PolygonEditor.updatePolygonTypeAndStyle()\r\n * @param entity 要更新的多边形实体\r\n * @param newType 新的类型 ('subarray' | 'inverter' | 'astrict' | 'rail' | 'feature')\r\n * @param customName 可选的自定义名称\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 updatePolygonTypeAndStyle 方法\r\n */\r\n updatePolygonTypeAndStyle(\r\n entity: any,\r\n newType: string,\r\n customName?: string\r\n ) {\r\n return (this.polygonEditor as any).updatePolygonTypeAndStyle?.(entity, newType, customName);\r\n }\r\n\r\n /**\r\n * 从 JSON 数据加载 other 图层 (多边形、圆形、特征点)\r\n * 代理到 PolygonEditor.loadOtherLayerFromJson()\r\n * @param data JSON 数据,包含 astrict, rail, feature, feature_point 数组\r\n * \r\n * ⚠️ 注意:此方法需要 PolygonEditor 实现 loadOtherLayerFromJson 方法\r\n */\r\n loadOtherLayerFromJson(data: {\r\n astrict?: Array<any>;\r\n rail?: Array<any>;\r\n feature?: Array<any>;\r\n feature_point?: Array<any>;\r\n }) {\r\n return (this.polygonEditor as any).loadOtherLayerFromJson?.(data);\r\n }\r\n\r\n /**\r\n * 计算多边形的周长和面积(忽略高度值)\r\n * 代理到 PolygonEditor.calculatePolygonPerimeterAndArea()\r\n * @param points 点位数组 [{ lon, lat, height }]\r\n * @returns { perimeter: 周长(米), area: 面积(平方米) }\r\n */\r\n calculatePolygonPerimeterAndArea(\r\n points: Array<{ lon: number; lat: number; height?: number }>\r\n ): { perimeter: number; area: number } {\r\n return this.polygonEditor.calculatePolygonPerimeterAndArea(points);\r\n }\r\n\r\n}\r\n","import { defineComponent, h, onMounted, onBeforeUnmount, ref, watch } from 'vue';\r\nimport type * as Cesium from 'cesium';\r\nimport { SceneManager } from '../../core/SceneManager';\r\nimport { CZMLManager } from '../../core/CZMLManager';\r\nimport { CameraManager } from '../../core/CameraManager';\r\n\r\n/**\r\n * 🎨 GisViewer 组件 - Vue3 声明式地图容器\r\n * \r\n * @example\r\n * ```vue\r\n * <template>\r\n * <GisViewer \r\n * :cesium=\"Cesium\" \r\n * :options=\"{ timeline: false, animation: false }\"\r\n * @ready=\"handleReady\"\r\n * class=\"map-container\"\r\n * style=\"width: 100%; height: 100vh;\"\r\n * />\r\n * </template>\r\n * \r\n * <script setup>\r\n * import * as Cesium from 'cesium';\r\n * import GisViewer from '@jorgmoritz/gis-manager/vue';\r\n * \r\n * const handleReady = ({ sceneManager, czmlManager, cameraManager, viewer }) => {\r\n * console.log('地图已就绪', viewer);\r\n * \r\n * // 使用 czmlManager 管理路径\r\n * czmlManager.createPath(...);\r\n * };\r\n * </script>\r\n * ```\r\n */\r\nexport default defineComponent({\r\n name: 'GisViewer',\r\n props: {\r\n /** Cesium 命名空间对象 */\r\n cesium: { \r\n type: Object as any, \r\n required: true \r\n },\r\n /** Cesium 初始化选项 */\r\n options: { \r\n type: Object as any, \r\n required: false \r\n },\r\n /** 容器 CSS 类名 */\r\n class: { \r\n type: String as any, \r\n required: false \r\n },\r\n /** 容器样式 */\r\n style: { \r\n type: Object as any, \r\n required: false \r\n },\r\n },\r\n emits: {\r\n /**\r\n * 地图初始化完成事件\r\n * @param payload - 包含所有管理器和 viewer 的对象\r\n */\r\n ready: (payload: {\r\n sceneManager: SceneManager;\r\n czmlManager: CZMLManager;\r\n cameraManager: CameraManager;\r\n viewer: Cesium.Viewer;\r\n }) => true,\r\n /**\r\n * 地图销毁事件\r\n */\r\n destroyed: () => true,\r\n /**\r\n * 初始化错误事件\r\n */\r\n error: (error: Error) => true,\r\n },\r\n setup(props: any, { emit, slots }: any) {\r\n const containerRef = ref(null) as { value: HTMLElement | null };\r\n let sceneManager: SceneManager | null = null;\r\n let czmlManager: CZMLManager | null = null;\r\n let cameraManager: CameraManager | null = null;\r\n\r\n onMounted(() => {\r\n try {\r\n if (!containerRef.value) {\r\n const error = new Error('Container element not found');\r\n emit('error', error);\r\n return;\r\n }\r\n\r\n // 创建 SceneManager\r\n sceneManager = new SceneManager(props.cesium, {\r\n container: containerRef.value,\r\n ...(props.options ?? {}),\r\n });\r\n\r\n // 创建其他管理器\r\n czmlManager = new CZMLManager(props.cesium, sceneManager.getViewer());\r\n cameraManager = new CameraManager(props.cesium, sceneManager.getViewer());\r\n\r\n // 触发 ready 事件,传递所有管理器\r\n emit('ready', {\r\n sceneManager,\r\n czmlManager,\r\n cameraManager,\r\n viewer: sceneManager.getViewer(),\r\n });\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error('Failed to initialize GIS Viewer');\r\n console.error('[GisViewer] 初始化失败:', error);\r\n emit('error', error);\r\n }\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n sceneManager?.destroy();\r\n sceneManager = null;\r\n czmlManager = null;\r\n cameraManager = null;\r\n emit('destroyed');\r\n });\r\n\r\n // 监听选项变化并应用\r\n watch(\r\n () => props.options?.sunlight,\r\n (val: any) => {\r\n if (sceneManager) {\r\n sceneManager.configureSunlight(!!val?.enabled, val?.time);\r\n }\r\n },\r\n { deep: true },\r\n );\r\n\r\n watch(\r\n () => props.options?.shadows,\r\n (val: any) => {\r\n if (sceneManager && typeof val === 'boolean') {\r\n sceneManager.setShadows(val);\r\n }\r\n },\r\n );\r\n\r\n return () =>\r\n h(\r\n 'div',\r\n { class: props.class, style: props.style },\r\n [\r\n h('div', { \r\n ref: containerRef, \r\n style: { width: '100%', height: '100%' } \r\n }), \r\n slots.default?.()\r\n ],\r\n );\r\n },\r\n});\r\n","import { ref, readonly, onMounted, onBeforeUnmount, unref } from 'vue';\r\nimport type * as Cesium from 'cesium';\r\nimport { SceneManager } from '../../core/SceneManager';\r\nimport { CZMLManager } from '../../core/CZMLManager';\r\nimport { CameraManager } from '../../core/CameraManager';\r\nimport { startPathDrawing } from '../../core/path-manager/startPathDrawing';\r\nimport { startPathEditing } from '../../core/path-manager/pathEditing';\r\nimport type { VertexDetailInfo, VertexOperationInfo } from '../../core/path-manager/editing/VertexDetailInfo';\r\n\r\n/**\r\n * GIS 查看器配置选项\r\n */\r\nexport interface GisViewerOptions {\r\n /** Cesium 初始化选项(会合并到 container 配置中) */\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * Vue Ref 类型(兼容 Vue 2 和 Vue 3)\r\n */\r\nexport interface VueRef<T> {\r\n value: T;\r\n}\r\n\r\n/**\r\n * 路径绘制选项\r\n */\r\nexport interface PathDrawingOptions {\r\n layer?: Cesium.CustomDataSource;\r\n idPrefix?: string;\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n altitudeMode?: 'absolute' | 'relativeToStart' | 'relativeToGround';\r\n climbHeight?: number;\r\n autoStartEditing?: boolean | {\r\n preview?: {\r\n enabled?: boolean;\r\n showFootprint?: boolean;\r\n fov?: number;\r\n pitch?: number;\r\n roll?: number;\r\n lengthFactor?: number;\r\n container?: HTMLElement;\r\n };\r\n };\r\n onEditingStarted?: (editSession: any) => void;\r\n onVertexSelectDetail?: (info: VertexDetailInfo) => void;\r\n onVertexDragCompleteDetail?: (info: VertexOperationInfo) => void;\r\n onVertexInsertDetail?: (info: VertexOperationInfo) => void;\r\n onVertexDeleteDetail?: (info: VertexOperationInfo) => void;\r\n}\r\n\r\n/**\r\n * 路径编辑选项\r\n */\r\nexport interface PathEditingOptions {\r\n layer?: Cesium.CustomDataSource;\r\n defaultHeight?: number;\r\n width?: number;\r\n material?: Cesium.MaterialProperty | Cesium.Color;\r\n preview?: {\r\n enabled?: boolean;\r\n container?: HTMLElement;\r\n showFootprint?: boolean;\r\n fov?: number;\r\n pitch?: number;\r\n roll?: number;\r\n lengthFactor?: number;\r\n };\r\n quickEdit?: {\r\n enabled?: boolean;\r\n climbHeight?: number;\r\n altitudeMode?: 'absolute' | 'relativeToStart' | 'relativeToGround';\r\n };\r\n onVertexSelectDetail?: (info: VertexDetailInfo) => void;\r\n onVertexDragCompleteDetail?: (info: VertexOperationInfo) => void;\r\n onVertexInsertDetail?: (info: VertexOperationInfo) => void;\r\n onVertexDeleteDetail?: (info: VertexOperationInfo) => void;\r\n}\r\n\r\n/**\r\n * 🚀 Vue3 GIS 查看器 Composable\r\n * \r\n * @param cesium - Cesium 命名空间对象\r\n * @param containerOrRef - 容器元素、CSS选择器或 Vue Ref\r\n * @param options - 初始化选项\r\n * \r\n * @example\r\n * ```vue\r\n * <script setup>\r\n * import { ref } from 'vue';\r\n * import * as Cesium from 'cesium';\r\n * import { useGisViewer } from '@jorgmoritz/gis-manager/vue';\r\n * \r\n * const mapContainer = ref(null);\r\n * const { \r\n * sceneManager, \r\n * czmlManager, \r\n * cameraManager,\r\n * isReady,\r\n * startDrawingPath,\r\n * startEditingPath \r\n * } = useGisViewer(Cesium, mapContainer);\r\n * \r\n * // 开始绘制路径\r\n * const handleDrawPath = () => {\r\n * if (!isReady.value) return;\r\n * const session = startDrawingPath.value({\r\n * autoStartEditing: true,\r\n * onVertexSelectDetail: (info) => {\r\n * console.log('选中顶点:', info.displayNumber);\r\n * }\r\n * });\r\n * };\r\n * </script>\r\n * \r\n * <template>\r\n * <div ref=\"mapContainer\" class=\"map-container\"></div>\r\n * <button @click=\"handleDrawPath\" :disabled=\"!isReady\">绘制路径</button>\r\n * </template>\r\n * ```\r\n */\r\nexport function useGisViewer(\r\n cesium: typeof Cesium,\r\n containerOrRef?: HTMLElement | string | VueRef<HTMLElement | null>,\r\n options?: GisViewerOptions\r\n) {\r\n // 内部 container ref(如果用户没有提供)\r\n const internalContainerRef = ref(null) as { value: HTMLElement | null };\r\n const sceneManagerRef = ref(null) as { value: SceneManager | null };\r\n const czmlManagerRef = ref(null) as { value: CZMLManager | null };\r\n const cameraManagerRef = ref(null) as { value: CameraManager | null };\r\n const isReady = ref(false) as { value: boolean };\r\n const error = ref(null) as { value: Error | null };\r\n\r\n // 初始化函数\r\n const initialize = () => {\r\n try {\r\n let containerElement: HTMLElement | null = null;\r\n\r\n // 解析容器\r\n if (containerOrRef) {\r\n if (typeof containerOrRef === 'string') {\r\n // CSS 选择器\r\n containerElement = document.querySelector(containerOrRef);\r\n if (!containerElement) {\r\n throw new Error(`Container element not found: ${containerOrRef}`);\r\n }\r\n } else {\r\n // HTMLElement 或 Ref\r\n containerElement = unref(containerOrRef);\r\n }\r\n } else {\r\n // 使用内部 ref\r\n containerElement = internalContainerRef.value;\r\n }\r\n\r\n if (!containerElement) {\r\n throw new Error('Container element not found');\r\n }\r\n\r\n // 创建 SceneManager\r\n const sceneManager = new SceneManager(cesium, {\r\n container: containerElement,\r\n ...(options ?? {}),\r\n });\r\n\r\n sceneManagerRef.value = sceneManager;\r\n\r\n // 创建其他管理器\r\n czmlManagerRef.value = new CZMLManager(cesium, sceneManager.getViewer());\r\n cameraManagerRef.value = new CameraManager(cesium, sceneManager.getViewer());\r\n\r\n isReady.value = true;\r\n error.value = null;\r\n } catch (err) {\r\n error.value = err instanceof Error ? err : new Error('Failed to create GIS Viewer');\r\n sceneManagerRef.value = null;\r\n czmlManagerRef.value = null;\r\n cameraManagerRef.value = null;\r\n isReady.value = false;\r\n console.error('[useGisViewer] 初始化失败:', err);\r\n }\r\n };\r\n\r\n // 销毁函数\r\n const destroy = () => {\r\n if (sceneManagerRef.value) {\r\n sceneManagerRef.value.destroy();\r\n sceneManagerRef.value = null;\r\n czmlManagerRef.value = null;\r\n cameraManagerRef.value = null;\r\n isReady.value = false;\r\n }\r\n };\r\n\r\n onMounted(() => {\r\n initialize();\r\n });\r\n\r\n onBeforeUnmount(() => {\r\n destroy();\r\n });\r\n\r\n // 包装路径绘制方法\r\n const startDrawingPath = ref((pathOptions?: PathDrawingOptions) => {\r\n if (!sceneManagerRef.value) {\r\n throw new Error('SceneManager 未初始化');\r\n }\r\n return startPathDrawing(cesium, sceneManagerRef.value.getViewer(), pathOptions);\r\n });\r\n\r\n // 包装路径编辑方法\r\n const startEditingPath = ref((\r\n entityOrId: Cesium.Entity | string,\r\n editOptions?: PathEditingOptions\r\n ) => {\r\n if (!sceneManagerRef.value) {\r\n throw new Error('SceneManager 未初始化');\r\n }\r\n return startPathEditing(cesium, sceneManagerRef.value.getViewer(), entityOrId, editOptions);\r\n });\r\n\r\n return {\r\n // 容器 ref(仅在用户未提供容器时使用)\r\n containerRef: internalContainerRef,\r\n\r\n // 核心管理器(响应式 readonly)\r\n sceneManager: readonly(sceneManagerRef),\r\n czmlManager: readonly(czmlManagerRef),\r\n cameraManager: readonly(cameraManagerRef),\r\n\r\n // 状态\r\n isReady: readonly(isReady),\r\n error: readonly(error),\r\n\r\n // 路径操作方法\r\n startDrawingPath: readonly(startDrawingPath),\r\n startEditingPath: readonly(startEditingPath),\r\n\r\n // 手动控制方法\r\n initialize,\r\n destroy,\r\n\r\n // Viewer 访问器\r\n get viewer() {\r\n return sceneManagerRef.value?.getViewer() ?? null;\r\n },\r\n } as const;\r\n}\r\n"]}
|