Merge remote-tracking branch 'origin/dev' into devzpx
# Conflicts: # src/components/map/SceneViewer.vue # src/global.d.ts # src/utils/map/coordinate.ts # src/utils/map/geometry.tspull/3/head
						commit
						3e32f4387e
					
				| @ -0,0 +1,7 @@ | ||||
| /* | ||||
|  * @Author: cbwu 504-wuchengbo@htsdfp.com | ||||
|  * @Date: 2024-03-27 09:51:04 | ||||
|  * @LastEditors: cbwu | ||||
|  * @LastEditTime: 2024-03-27 09:51:07 | ||||
|  * @Description: 绘制点类 | ||||
|  */ | ||||
| @ -0,0 +1,197 @@ | ||||
| /* | ||||
|  * @Author: cbwu 504-wuchengbo@htsdfp.com | ||||
|  * @Date: 2024-03-27 08:43:44 | ||||
|  * @LastEditors: cbwu | ||||
|  * @LastEditTime: 2024-04-02 13:33:25 | ||||
|  * @Description: 绘制Polyline类 | ||||
|  */ | ||||
| import { | ||||
|   Viewer, | ||||
|   ScreenSpaceEventHandler, | ||||
|   Cartesian3, | ||||
|   Color, | ||||
|   ScreenSpaceEventType, | ||||
|   Entity, | ||||
|   CallbackProperty, | ||||
|   PolylineDashMaterialProperty, | ||||
| } from 'cesium' | ||||
| import { cartesian2ToCartesian3 } from '@/utils/map/coordinate' | ||||
| // import { PointEntity, PolylineEntity } from '@/utils/map/geometry'
 | ||||
| import { PolylineEntity } from '../geometry/polylineEntity' | ||||
| import { PointEntity } from '@/utils/map/geometry/pointEntity' | ||||
| import EditGeometry from '@/utils/map/draw/editGeometry' | ||||
| type EntityOptions = { | ||||
|   id?: string | ||||
|   name?: string | ||||
|   show?: boolean | ||||
|   pixelSize?: number | ||||
|   color?: Color | ||||
|   fillColor?: Color | ||||
|   fill?: boolean | ||||
|   width?: number | ||||
|   outlineWidth?: number | ||||
| } | ||||
| export default class CreatePolyline { | ||||
|   viewer: Viewer | ||||
|   handler: ScreenSpaceEventHandler | ||||
|   polyline: PolylineEntity | null | ||||
|   dashLine: Entity | null | ||||
|   trackingLine: Entity | null | ||||
|   trackingLinePositions: Cartesian3[] = [] | ||||
|   controlPoints: Entity[] | null | ||||
|   modifyPoint: any = null | ||||
|   clickedGeometry: Entity | null = null | ||||
|   moveSelectedPoint: PointEntity | null = null | ||||
|   positions: Cartesian3[] = [] | ||||
|   bMove: boolean = false | ||||
|   bLongClick: boolean = false | ||||
|   clickTimeout: any | ||||
|   // layer: CustomDataSource
 | ||||
|   defaultStyle: EntityOptions = { | ||||
|     // id: 'Polyline' + String(PolylineEntity.id),
 | ||||
|     // name: 'Polyline' + String(PolylineEntity.id + 1),
 | ||||
|     show: true, | ||||
|     width: 2, | ||||
|     color: Color.GREEN, | ||||
|   } | ||||
|   constructor(viewer: Viewer, options?: EntityOptions) { | ||||
|     this.viewer = viewer | ||||
|     this.handler = new ScreenSpaceEventHandler(this.viewer.scene.canvas) | ||||
|     this.polyline = null | ||||
|     this.trackingLine = null | ||||
|     this.dashLine = null | ||||
| 
 | ||||
|     this.controlPoints = [] | ||||
|     this.defaultStyle = { ...this.defaultStyle, ...options } | ||||
|   } | ||||
|   // 开始绘制
 | ||||
|   public start() { | ||||
|     // 左单击加点
 | ||||
|     this.handler.setInputAction( | ||||
|       this.leftClickCallBack, | ||||
|       ScreenSpaceEventType.LEFT_CLICK, | ||||
|     ) | ||||
|     // 移动动态绘制
 | ||||
|     this.handler.setInputAction( | ||||
|       this.moveCallBack, | ||||
|       ScreenSpaceEventType.MOUSE_MOVE, | ||||
|     ) | ||||
|     // 左双击结束
 | ||||
|     this.handler.setInputAction( | ||||
|       this.leftDoubleClickCallBack, | ||||
|       ScreenSpaceEventType.LEFT_DOUBLE_CLICK, | ||||
|     ) | ||||
|     // 右击回退上一步
 | ||||
|     this.handler.setInputAction( | ||||
|       this.rightClickCallBack, | ||||
|       ScreenSpaceEventType.RIGHT_CLICK, | ||||
|     ) | ||||
|   } | ||||
|   public end() { | ||||
|     this.handler.removeInputAction(ScreenSpaceEventType.LEFT_CLICK) | ||||
|   } | ||||
|   //左单击回调事件
 | ||||
|   private leftClickCallBack = ( | ||||
|     event: ScreenSpaceEventHandler.PositionedEvent, | ||||
|   ) => { | ||||
|     const pickedObject = this.viewer.scene.pick(event.position) | ||||
|     // console.log(pickedObject)
 | ||||
|     if (pickedObject) { | ||||
|       //点击同一位置,返回
 | ||||
|       if ( | ||||
|         pickedObject.id.id === | ||||
|         this.polyline?.controlPointsID[this.positions.length - 1] | ||||
|       ) { | ||||
|         return | ||||
|         // console.log('********click the same point')
 | ||||
|       } | ||||
|     } | ||||
|     const cartesian3 = cartesian2ToCartesian3(this.viewer, event.position) | ||||
|     if (cartesian3 != undefined) { | ||||
|       if (!this.polyline) { | ||||
|         this.polyline = new PolylineEntity(this.positions) | ||||
|         this.dashLine = this.createTrackingLine(this.positions) | ||||
|         this.viewer.entities.add(this.dashLine) | ||||
|         this.viewer.dataSources.add(this.polyline) | ||||
|       } | ||||
|       this.polyline.addPoint(cartesian3) | ||||
|       this.trackingLinePositions[0] = cartesian3 | ||||
|       this.bMove = true | ||||
| 
 | ||||
|       this.viewer.scene.requestRender() //刷新
 | ||||
|     } | ||||
|   } | ||||
|   // 移动回调事件
 | ||||
|   private moveCallBack = (event: ScreenSpaceEventHandler.MotionEvent) => { | ||||
|     if (this.bMove) { | ||||
|       const cartesian3 = cartesian2ToCartesian3(this.viewer, event.endPosition) | ||||
|       if (cartesian3 != undefined) { | ||||
|         //更新追踪线坐标
 | ||||
|         this.trackingLinePositions[1] = cartesian3 | ||||
|         if (!this.trackingLine) { | ||||
|           //创建追踪线对象
 | ||||
|           this.trackingLine = this.createTrackingLine( | ||||
|             this.trackingLinePositions, | ||||
|           ) | ||||
|           this.viewer.entities.add(this.trackingLine) | ||||
|         } | ||||
|       } | ||||
|       this.viewer.scene.requestRender() //刷新
 | ||||
|     } | ||||
|   } | ||||
|   // 左双击回调事件
 | ||||
|   private leftDoubleClickCallBack = ( | ||||
|     event: ScreenSpaceEventHandler.PositionedEvent, | ||||
|   ) => { | ||||
|     // 清除可能已经设置的单击定时器
 | ||||
|     // clearTimeout(this.clickTimeout)
 | ||||
|     if (!this.polyline) return | ||||
|     console.log('**************************** double click') | ||||
|     this.bMove = false | ||||
|     const cartesian3 = cartesian2ToCartesian3(this.viewer, event.position) | ||||
|     if (cartesian3 != undefined) { | ||||
|       // 移除追踪线
 | ||||
|       if (!this.trackingLine) { | ||||
|         this.viewer.entities.remove(this.trackingLine!) | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     this.clearEvent() | ||||
|     console.log('end:' + this.positions.length.toString()) | ||||
|     console.log(this.positions) | ||||
|     //结束绘制进入编辑模式
 | ||||
|     this.polyline.removeControlPoints() | ||||
|     const editTool = new EditGeometry(this.viewer, this.polyline.geometry!) | ||||
|     editTool.start() | ||||
|   } | ||||
|   //   右击回调事件
 | ||||
|   private rightClickCallBack = () => { | ||||
|     if (!this.controlPoints) return | ||||
|     if (this.controlPoints.length > 1) { | ||||
|       const lastPoint = this.positions.pop() | ||||
|       this.positions[this.positions.length - 1] = lastPoint! | ||||
|       this.viewer.entities.remove(this.controlPoints.pop() as Entity) | ||||
|     } | ||||
|   } | ||||
|   clearEvent() { | ||||
|     this.handler.removeInputAction(ScreenSpaceEventType.LEFT_CLICK) | ||||
|     this.handler.removeInputAction(ScreenSpaceEventType.MOUSE_MOVE) | ||||
|     this.handler.removeInputAction(ScreenSpaceEventType.LEFT_DOUBLE_CLICK) | ||||
|   } | ||||
| 
 | ||||
|   createTrackingLine(positions: Cartesian3[]) { | ||||
|     return new Entity({ | ||||
|       polyline: { | ||||
|         positions: new CallbackProperty(() => { | ||||
|           return positions | ||||
|         }, false), | ||||
|         width: 2, | ||||
|         material: new PolylineDashMaterialProperty({ | ||||
|           color: Color.GREEN, | ||||
|           dashLength: 15, //短划线长度
 | ||||
|         }), | ||||
|         clampToGround: true, | ||||
|       }, | ||||
|     }) | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,249 @@ | ||||
| /* | ||||
|  * @Author: cbwu 504-wuchengbo@htsdfp.com | ||||
|  * @Date: 2024-03-27 11:06:45 | ||||
|  * @LastEditors: cbwu | ||||
|  * @LastEditTime: 2024-04-02 11:05:20 | ||||
|  * @Description: 编辑几何体类。操作逻辑 | ||||
|  */ | ||||
| import { | ||||
|   Viewer, | ||||
|   ScreenSpaceEventHandler, | ||||
|   PointGraphics, | ||||
|   PolylineGraphics, | ||||
|   Cartesian3, | ||||
|   ConstantProperty, | ||||
|   ScreenSpaceEventType, | ||||
|   Entity, | ||||
|   ConstantPositionProperty, | ||||
|   defined, | ||||
| } from 'cesium' | ||||
| import { cartesian2ToCartesian3 } from '@/utils/map/coordinate' | ||||
| import { getClosestPoint, isOnLineSegment } from '@/utils/map/geocomputation' | ||||
| import { PointEntity } from '@/utils/map/geometry/pointEntity' | ||||
| export default class EditGeometry { | ||||
|   viewer: Viewer | ||||
|   editHandler: ScreenSpaceEventHandler | ||||
|   geometry: Entity //要编辑的几何对象
 | ||||
|   oldPositions: Cartesian3[] = [] //存储未修改前的坐标
 | ||||
|   positions: Cartesian3[] = [] //要编辑的几个对象坐标
 | ||||
|   controlPointsID: string[] = [] | ||||
|   controlPoint: PointEntity | null = null | ||||
|   clickedGeometry: Entity | null = null | ||||
|   clickDownPosition: Cartesian3 | null = null | ||||
|   moveSelectedPoint: PointEntity | null = null | ||||
|   bDrag: boolean = false //拖动标识
 | ||||
|   bLongClick: boolean = false //长按标识
 | ||||
|   clickTimeout: any | ||||
| 
 | ||||
|   constructor(viewer: Viewer, editGeometry: Entity) { | ||||
|     this.viewer = viewer | ||||
|     this.editHandler = new ScreenSpaceEventHandler(this.viewer.scene.canvas) | ||||
|     this.geometry = editGeometry | ||||
|     this.positions = editGeometry.polyline?.positions?.getValue( | ||||
|       this.viewer.clock.currentTime, | ||||
|     ) | ||||
|     this.oldPositions = this.positions | ||||
|     // 创建控制点
 | ||||
|     this.positions.forEach((value, index) => { | ||||
|       this.createPoint(value, index) | ||||
|     }) | ||||
|   } | ||||
|   public start() { | ||||
|     this.editHandler.setInputAction( | ||||
|       this.leftDownClickCallBack, | ||||
|       ScreenSpaceEventType.LEFT_DOWN, | ||||
|     ) | ||||
|     this.editHandler.setInputAction( | ||||
|       this.moveCallBack, | ||||
|       ScreenSpaceEventType.MOUSE_MOVE, | ||||
|     ) | ||||
|     this.editHandler.setInputAction( | ||||
|       this.leftUpClickCallBack, | ||||
|       ScreenSpaceEventType.LEFT_UP, | ||||
|     ) | ||||
|   } | ||||
|   //左键点击回调
 | ||||
|   private leftClickCallBack = ( | ||||
|     event: ScreenSpaceEventHandler.PositionedEvent, | ||||
|   ) => { | ||||
|     const pickedObject = this.viewer.scene.pick(event.position) | ||||
|     // 点中控制点
 | ||||
|     if ( | ||||
|       defined(pickedObject) && | ||||
|       defined(pickedObject.id) && | ||||
|       pickedObject.id.point instanceof PointGraphics | ||||
|     ) { | ||||
|       console.log('You clicked a point entity.') | ||||
|       this.controlPoint = pickedObject.id | ||||
|       console.log(this.controlPoint?.subId) | ||||
|       this.bDrag = true | ||||
|       this.forbidDrawWorld(true) | ||||
|     } | ||||
|   } | ||||
|   //左键按下回调
 | ||||
|   private leftDownClickCallBack = ( | ||||
|     event: ScreenSpaceEventHandler.PositionedEvent, | ||||
|   ) => { | ||||
|     // 清除可能已经设置的单击定时器
 | ||||
|     clearTimeout(this.clickTimeout) | ||||
|     // 判断是不是长按
 | ||||
|     this.clickTimeout = setTimeout(() => { | ||||
|       this.bLongClick = true | ||||
|     }, 100) | ||||
|     const pickedObject = this.viewer.scene.pick(event.position) | ||||
|     //点中实体对象
 | ||||
|     if (defined(pickedObject) && defined(pickedObject.id)) { | ||||
|       // 记录点击的几何对象及位置
 | ||||
|       this.clickedGeometry = pickedObject.id | ||||
|       this.clickDownPosition = this.viewer.scene.pickPosition(event.position) | ||||
|       // // 判断是否同一实体
 | ||||
|       // if (this.geometry != pickedObject.id) {
 | ||||
|       //   this.geometry = pickedObject.id
 | ||||
|       //   if (
 | ||||
|       //     pickedObject instanceof PolylineGraphics &&
 | ||||
|       //     pickedObject.positions
 | ||||
|       //   ) {
 | ||||
|       //     this.oldPositions = this.geometry!.polyline!.positions?.getValue(
 | ||||
|       //       this.viewer.clock.currentTime,
 | ||||
|       //     )
 | ||||
|       //   }
 | ||||
|       // }
 | ||||
|       // 点中控制点
 | ||||
|       if (pickedObject.id.point instanceof PointGraphics) { | ||||
|         console.log('You clicked a point entity.') | ||||
|         this.controlPoint = pickedObject.id | ||||
|         console.log(this.controlPoint?.subId) | ||||
|         this.bDrag = true | ||||
|         this.forbidDrawWorld(true) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   //移动回调
 | ||||
|   private moveCallBack = (event: ScreenSpaceEventHandler.MotionEvent) => { | ||||
|     const pickedObject = this.viewer.scene.pick(event.endPosition) | ||||
|     // 悬停控制点放大
 | ||||
|     if ( | ||||
|       pickedObject && | ||||
|       pickedObject.id && | ||||
|       pickedObject.id.point instanceof PointGraphics | ||||
|     ) { | ||||
|       if (pickedObject.id.point instanceof PointGraphics) { | ||||
|         if ( | ||||
|           this.moveSelectedPoint == null || | ||||
|           this.moveSelectedPoint.id !== pickedObject.id.id | ||||
|         ) { | ||||
|           this.moveSelectedPoint = pickedObject.id | ||||
|           this.moveSelectedPoint!.point!.pixelSize = new ConstantProperty( | ||||
|             this.moveSelectedPoint!.options.pixelSize! + 2, | ||||
|           ) | ||||
|           // console.log(this.moveSelectedPoint)
 | ||||
|         } | ||||
|         this.viewer.scene.requestRender() //刷新
 | ||||
|       } | ||||
|     } else { | ||||
|       // 离开控制点恢复原始大小
 | ||||
|       if (this.moveSelectedPoint) { | ||||
|         this.moveSelectedPoint!.point!.pixelSize = new ConstantProperty( | ||||
|           this.moveSelectedPoint!.options.pixelSize! - 2, | ||||
|         ) | ||||
|         this.moveSelectedPoint = null | ||||
|         this.viewer.scene.requestRender() //刷新
 | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     if (!this.controlPoint || !this.bDrag) return | ||||
|     console.log('************************left down') | ||||
|     const cartesian3 = cartesian2ToCartesian3(this.viewer, event.endPosition) | ||||
|     if (cartesian3) { | ||||
|       // 修改节点坐标
 | ||||
|       this.modifyPoint(cartesian3, this.controlPoint.subId) | ||||
|       // this.geometry?.modifyPoint(cartesian3, this.controlPoint.subId)
 | ||||
|       this.viewer.scene.requestRender() //刷新
 | ||||
|     } | ||||
|   } | ||||
|   //左键松开回调
 | ||||
|   private leftUpClickCallBack = ( | ||||
|     event: ScreenSpaceEventHandler.PositionedEvent, | ||||
|   ) => { | ||||
|     clearTimeout(this.clickTimeout) | ||||
|     // 单击添加点
 | ||||
|     if ( | ||||
|       !this.bLongClick && | ||||
|       this.clickedGeometry?.polyline instanceof PolylineGraphics | ||||
|     ) { | ||||
|       console.log('点中线,加点') | ||||
|       this.addPoint() | ||||
|     } | ||||
|     this.bLongClick = false | ||||
|     this.bDrag = false | ||||
|     this.forbidDrawWorld(false) | ||||
|   } | ||||
|   // 左键双击回调
 | ||||
|   private leftDoubleClickCallBack = ( | ||||
|     event: ScreenSpaceEventHandler.PositionedEvent, | ||||
|   ) => { | ||||
|     // this.geometry.
 | ||||
|   } | ||||
|   // Viewer操作控制
 | ||||
|   forbidDrawWorld(isForbid: boolean) { | ||||
|     this.viewer.scene.screenSpaceCameraController.enableRotate = !isForbid | ||||
|     this.viewer.scene.screenSpaceCameraController.enableTilt = !isForbid | ||||
|     this.viewer.scene.screenSpaceCameraController.enableTranslate = !isForbid | ||||
|     this.viewer.scene.screenSpaceCameraController.enableInputs = !isForbid | ||||
|   } | ||||
|   // 添加点
 | ||||
|   addPoint() { | ||||
|     for (let i = 0; i < this.positions.length - 1; ++i) { | ||||
|       if ( | ||||
|         isOnLineSegment( | ||||
|           this.positions[i], | ||||
|           this.positions[i + 1], | ||||
|           this.clickDownPosition!, | ||||
|         ) | ||||
|       ) { | ||||
|         // 修改线坐标
 | ||||
|         const pt = getClosestPoint( | ||||
|           this.positions[i], | ||||
|           this.positions[i + 1], | ||||
|           this.clickDownPosition!, | ||||
|         ) | ||||
|         this.positions.splice(i + 1, 0, pt) | ||||
|         // 新建控制点
 | ||||
|         this.createPoint(pt, i + 1) | ||||
|         // 修改控制点的subid
 | ||||
|         for (let index = i + 2; index < this.controlPointsID.length; ++index) { | ||||
|           const point = this.geometry.entityCollection.getById( | ||||
|             this.controlPointsID[index], | ||||
|           ) as PointEntity | ||||
|           point!.subId = point!.subId + 1 | ||||
|         } | ||||
|         return | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   /** | ||||
|    * 修改某点的坐标 | ||||
|    * @param pos 修改点的坐标 | ||||
|    * @param index 修改点的位置 | ||||
|    */ | ||||
|   modifyPoint(pos: Cartesian3, index: number) { | ||||
|     // 修改线坐标
 | ||||
|     this.positions.splice(index, 1, pos) | ||||
|     // 修改控制点坐标
 | ||||
|     this.controlPoint!.position = new ConstantPositionProperty(pos) | ||||
|   } | ||||
|   /** | ||||
|    * 新加一个点 | ||||
|    * @param pos 点的坐标 | ||||
|    * @param index 插入的位置,0起步 | ||||
|    */ | ||||
|   createPoint(pos: Cartesian3, index: number) { | ||||
|     // if (this.geometry) {
 | ||||
|     const point = new PointEntity(pos) | ||||
|     point.parent = this.geometry | ||||
|     point.subId = index | ||||
|     this.geometry.entityCollection.add(point) | ||||
|     this.controlPointsID.splice(index, 0, point.id) | ||||
|     // }
 | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,185 @@ | ||||
| /* | ||||
|  * @Author: cbwu 504-wuchengbo@htsdfp.com | ||||
|  * @Date: 2024-03-15 08:43:26 | ||||
|  * @LastEditors: cbwu | ||||
|  * @LastEditTime: 2024-03-26 14:20:32 | ||||
|  * @FilePath: \GCSMap\src\utils\drawer.ts | ||||
|  * @Description: 矢量要素绘制工具类 | ||||
|  */ | ||||
| import { | ||||
|   Viewer, | ||||
|   ScreenSpaceEventHandler, | ||||
|   ScreenSpaceEventType, | ||||
|   CustomDataSource, | ||||
|   Cartesian3, | ||||
|   CallbackProperty, | ||||
|   PolygonHierarchy, | ||||
|   Color, | ||||
| } from 'cesium' | ||||
| import { cartesian2ToCartesian3 } from '@/utils/map/coordinate' | ||||
| import { | ||||
|   PointEntity, | ||||
|   PolylineEntity, | ||||
|   PolygonEntity, | ||||
| } from '@/utils/map/geometry' | ||||
| class Drawer { | ||||
|   viewer: Viewer | ||||
|   type: string | ||||
|   handler: ScreenSpaceEventHandler | ||||
|   layer: CustomDataSource | ||||
|   polyline: PolylineEntity | null | ||||
|   polygon: PolygonEntity | null | ||||
|   positions: Cartesian3[] = [] | ||||
|   n_Points: number | ||||
|   bMove: boolean | ||||
|   clickTimeout: any | ||||
|   constructor(viewer: Viewer, type: string) { | ||||
|     this.viewer = viewer | ||||
|     this.type = type | ||||
|     this.handler = new ScreenSpaceEventHandler(this.viewer.canvas) | ||||
|     this.polyline = null | ||||
|     this.polygon = null | ||||
|     this.n_Points = 0 | ||||
|     this.bMove = false | ||||
|     this.positions = [] | ||||
|     this.clickTimeout = null | ||||
|     if (viewer.dataSources.getByName(type).length === 0) { | ||||
|       this.layer = new CustomDataSource(type) | ||||
|       viewer.dataSources.add(this.layer) | ||||
|     } else { | ||||
|       this.layer = viewer.dataSources.getByName(type)[0] | ||||
|     } | ||||
|   } | ||||
|   // 开始绘制
 | ||||
|   public start() { | ||||
|     // 左单击加点
 | ||||
|     this.handler.setInputAction( | ||||
|       this.leftClickCallBack, | ||||
|       ScreenSpaceEventType.LEFT_CLICK, | ||||
|     ) | ||||
|     // 移动动态绘制
 | ||||
|     this.handler.setInputAction( | ||||
|       this.moveCallBack, | ||||
|       ScreenSpaceEventType.MOUSE_MOVE, | ||||
|     ) | ||||
|     // 左双击结束
 | ||||
|     this.handler.setInputAction( | ||||
|       this.leftDoubleClickCallBack, | ||||
|       ScreenSpaceEventType.LEFT_DOUBLE_CLICK, | ||||
|     ) | ||||
|   } | ||||
|   public end() { | ||||
|     this.handler.removeInputAction(ScreenSpaceEventType.LEFT_CLICK) | ||||
|   } | ||||
|   //左单击回调事件
 | ||||
|   private leftClickCallBack = ( | ||||
|     event: ScreenSpaceEventHandler.PositionedEvent, | ||||
|   ) => { | ||||
|     // 清除可能已经设置的单击定时器
 | ||||
|     clearTimeout(this.clickTimeout) | ||||
|     console.log('**************************** click') | ||||
|     // 设置一个新的定时器,用于判断是单击还是双击
 | ||||
|     this.clickTimeout = setTimeout(() => { | ||||
|       console.log('**************************** run') | ||||
|       const cartesian3 = cartesian2ToCartesian3(this.viewer, event.position) | ||||
|       if (cartesian3 != undefined) { | ||||
|         if (this.bMove) { | ||||
|           this.positions.pop() | ||||
|           this.bMove = false | ||||
|         } | ||||
|         this.positions.push(cartesian3) | ||||
|         this.createGeometry(this.type) | ||||
|         // 创建控制点
 | ||||
|         const point = new PointEntity( | ||||
|           this.positions[this.positions.length - 1], | ||||
|           { | ||||
|             color: Color.WHITE, | ||||
|             pixelSize: 6, | ||||
|           }, | ||||
|         ) | ||||
|         point.parent = this.polygon! | ||||
|         this.layer.entities.add(point) | ||||
| 
 | ||||
|         this.viewer.scene.requestRender() //刷新
 | ||||
|       } | ||||
|     }, 100) | ||||
|   } | ||||
|   // 移动回调事件
 | ||||
|   private moveCallBack = (event: ScreenSpaceEventHandler.MotionEvent) => { | ||||
|     const cartesian3 = cartesian2ToCartesian3(this.viewer, event.endPosition) | ||||
|     if (cartesian3 != undefined) { | ||||
|       if (this.positions.length >= 1) { | ||||
|         if (!this.bMove) { | ||||
|           this.positions.push(cartesian3) | ||||
|           this.bMove = true | ||||
|         } else { | ||||
|           this.positions[this.positions.length - 1] = cartesian3 | ||||
|         } | ||||
|         if (this.type === 'Polygon') { | ||||
|           // 多边形创建临时线
 | ||||
|           if (this.positions.length === 2) { | ||||
|             this.createGeometry('Polyline') | ||||
|           } | ||||
|           if (this.positions.length > 2) { | ||||
|             this.polyline!.show = false | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|       this.viewer.scene.requestRender() //刷新
 | ||||
|     } | ||||
|   } | ||||
|   // 左双击回调事件
 | ||||
|   private leftDoubleClickCallBack = ( | ||||
|     event: ScreenSpaceEventHandler.PositionedEvent, | ||||
|   ) => { | ||||
|     // 清除可能已经设置的单击定时器
 | ||||
|     clearTimeout(this.clickTimeout) | ||||
|     console.log('**************************** double click') | ||||
|     const cartesian3 = cartesian2ToCartesian3(this.viewer, event.position) | ||||
|     if (cartesian3 != undefined) { | ||||
|       this.positions.pop() | ||||
|       this.positions.push(cartesian3) | ||||
|     } | ||||
| 
 | ||||
|     this.clearEvent() | ||||
|     console.log('end:' + this.positions.length.toString()) | ||||
|     console.log(this.positions) | ||||
|   } | ||||
|   clearEvent() { | ||||
|     this.handler.removeInputAction(ScreenSpaceEventType.LEFT_CLICK) | ||||
|     this.handler.removeInputAction(ScreenSpaceEventType.MOUSE_MOVE) | ||||
|     this.handler.removeInputAction(ScreenSpaceEventType.LEFT_DOUBLE_CLICK) | ||||
|   } | ||||
|   // 创建几何体
 | ||||
|   createGeometry(type: string) { | ||||
|     switch (type) { | ||||
|       case 'Polyline': | ||||
|         if (this.polyline == null) { | ||||
|           this.polyline = new PolylineEntity( | ||||
|             new CallbackProperty(() => { | ||||
|               return this.positions | ||||
|             }, false), | ||||
|           ) | ||||
|           this.layer.entities.add(this.polyline) | ||||
|           // this.viewer.entities.add(this.polyline)
 | ||||
|         } | ||||
|         break | ||||
|       case 'Polygon': | ||||
|         if (this.polygon == null) { | ||||
|           this.polygon = new PolygonEntity( | ||||
|             new CallbackProperty(() => { | ||||
|               return new PolygonHierarchy(this.positions) | ||||
|             }, false), | ||||
|           ) | ||||
|           this.layer.entities.add(this.polygon) | ||||
|           // this.viewer.entities.add(this.polygon)
 | ||||
|           console.log('Polygon created!') | ||||
|         } | ||||
|         break | ||||
|       default: | ||||
|         break | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export { Drawer } | ||||
| @ -1,142 +0,0 @@ | ||||
| /* | ||||
|  * @Author: cbwu 504-wuchengbo@htsdfp.com | ||||
|  * @Date: 2024-03-20 08:55:59 | ||||
|  * @LastEditors: cbwu | ||||
|  * @LastEditTime: 2024-03-26 09:00:46 | ||||
|  * @Description:几何类型类 | ||||
|  */ | ||||
| import { | ||||
|   Entity, | ||||
|   Cartesian3, | ||||
|   Color, | ||||
|   PrimitiveCollection, | ||||
|   PointPrimitiveCollection, | ||||
|   PolylineGeometry, | ||||
|   PointGraphics, | ||||
|   Property, | ||||
|   PolylineGraphics, | ||||
|   PolygonGraphics, | ||||
| } from 'cesium' | ||||
| type EntityOptions = { | ||||
|   id?: string | ||||
|   name?: string | ||||
|   show?: boolean | ||||
|   pixelSize?: number | ||||
|   color?: Color | ||||
|   fillColor?: Color | ||||
|   fill?: boolean | ||||
|   width?: number | ||||
|   outlineWidth?: number | ||||
| } | ||||
| // 点
 | ||||
| class PointEntity extends Entity { | ||||
|   static id: number = 0 | ||||
|   options: EntityOptions = { | ||||
|     id: 'Point' + String(PointEntity.id), | ||||
|     name: 'Point' + String(PointEntity.id + 1), | ||||
|     show: true, | ||||
|     pixelSize: 10, | ||||
|     color: Color.GREEN, | ||||
|     outlineWidth: 0, | ||||
|   } | ||||
|   constructor(position: Cartesian3, options?: EntityOptions) { | ||||
|     super({ | ||||
|       // id: options?.id || String(PointEntity.id),
 | ||||
|       position: position, | ||||
|     }) | ||||
|     this.options = { ...this.options, ...options } | ||||
|     this.name = this.options.name | ||||
|     this.point = new PointGraphics({ ...this.options }) | ||||
|     PointEntity.id++ | ||||
|   } | ||||
| } | ||||
| // 线
 | ||||
| class PolylineEntity extends Entity { | ||||
|   static id: number = 0 | ||||
|   options: EntityOptions = { | ||||
|     id: 'Polyline' + String(PolylineEntity.id), | ||||
|     name: 'Polyline' + String(PolylineEntity.id + 1), | ||||
|     show: true, | ||||
|     width: 2, | ||||
|     color: Color.GREEN, | ||||
|   } | ||||
|   constructor(ptArr: Cartesian3[] | Property, options?: EntityOptions) { | ||||
|     super({ | ||||
|       // id: options?.id || String(PolylineEntity.id),
 | ||||
|     }) | ||||
|     this.options = { ...this.options, ...options } | ||||
|     this.name = this.options.name | ||||
|     this.polyline = new PolylineGraphics({ | ||||
|       positions: ptArr, | ||||
|       show: this.options.show, | ||||
|       width: this.options.width, | ||||
|       material: this.options.color, | ||||
|     }) | ||||
|     PolylineEntity.id++ | ||||
|   } | ||||
| } | ||||
| // 多边形
 | ||||
| class PolygonEntity extends Entity { | ||||
|   static id: number = 0 | ||||
|   options: EntityOptions = { | ||||
|     id: 'Polygon' + String(PolygonEntity.id), | ||||
|     name: 'Polygon' + String(PolygonEntity.id + 1), | ||||
|     show: true, | ||||
|     width: 2, | ||||
|     color: Color.RED, | ||||
|     fillColor: Color.RED.withAlpha(0.5), | ||||
|     fill: true, | ||||
|   } | ||||
|   constructor(ptArr: Cartesian3[] | Property, options?: EntityOptions) { | ||||
|     super({ | ||||
|       // id: options?.id || String(PolygonEntity.id),
 | ||||
|     }) | ||||
|     this.options = { ...this.options, ...options } | ||||
|     this.name = this.options.name | ||||
|     this.polygon = new PolygonGraphics({ | ||||
|       show: this.options.show, | ||||
|       hierarchy: ptArr, | ||||
|       material: this.options.fillColor, //填充颜色
 | ||||
|       fill: this.options.fill, //是否填充
 | ||||
|       outlineWidth: this.options.width, //线宽
 | ||||
|       outlineColor: this.options.color, //线颜色
 | ||||
|     }) | ||||
|     PolygonEntity.id++ | ||||
|   } | ||||
| } | ||||
| // 线
 | ||||
| class Polyline extends PrimitiveCollection { | ||||
|   constructor(ptArr: Cartesian3[]) { | ||||
|     super() | ||||
|     this.add(this.createPoints(ptArr)) | ||||
|     this.add(this.createPolyline(ptArr)) | ||||
|     // this.id
 | ||||
|   } | ||||
|   private createPoints(posArr: Cartesian3[]) { | ||||
|     const points = new PointPrimitiveCollection() | ||||
|     for (const pos in posArr) { | ||||
|       points.add({ | ||||
|         position: pos, | ||||
|         color: Color.RED, | ||||
|         pixelSize: 10, | ||||
|       }) | ||||
|     } | ||||
|     return points | ||||
|   } | ||||
|   private createPolyline(posArr: Cartesian3[]) { | ||||
|     return new PolylineGeometry({ | ||||
|       positions: posArr, | ||||
|       width: 2, | ||||
|       colors: new Array(posArr.length).fill(Color.fromCssColorString('green')), | ||||
|     }) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // 坐标点
 | ||||
| type coordPoint = { | ||||
|   lon: number | string, | ||||
|   lat: number | string, | ||||
|   alt?: number | ||||
| } | ||||
| export { PointEntity, Polyline, PolylineEntity, PolygonEntity } | ||||
| export type { coordPoint } | ||||
| @ -0,0 +1,69 @@ | ||||
| /* | ||||
|  * @Author: cbwu 504-wuchengbo@htsdfp.com | ||||
|  * @Date: 2024-03-28 16:35:33 | ||||
|  * @LastEditors: cbwu | ||||
|  * @LastEditTime: 2024-03-30 22:06:23 | ||||
|  * @Description: 封装的点几何类 | ||||
|  */ | ||||
| import { | ||||
|   Entity, | ||||
|   Cartesian3, | ||||
|   Color, | ||||
|   PointGraphics, | ||||
|   PositionProperty, | ||||
|   LabelGraphics, | ||||
|   Cartesian2, | ||||
|   CallbackProperty, | ||||
|   Property, | ||||
| } from 'cesium' | ||||
| type EntityOptions = { | ||||
|   id?: string | ||||
|   name?: string | ||||
|   show?: boolean | ||||
|   pixelSize?: number | ||||
|   outlineColor?: Color | ||||
|   color?: Color | ||||
|   fillColor?: Color | ||||
|   fill?: boolean | ||||
|   width?: number | ||||
|   outlineWidth?: number | ||||
|   text?: string | ||||
|   font?: string | ||||
|   pixelOffset?: Cartesian2 | ||||
| } | ||||
| // 点
 | ||||
| class PointEntity extends Entity { | ||||
|   static ID: number = 0 | ||||
|   public subId: number = 0 //用于作为其他几何体的控制点时标记节点号
 | ||||
|   options: EntityOptions = { | ||||
|     id: 'Point' + String(PointEntity.ID), | ||||
|     name: 'Point' + String(PointEntity.ID + 1), | ||||
|     show: true, | ||||
|     pixelSize: 10, | ||||
|     color: Color.GREEN, | ||||
|     outlineWidth: 0, | ||||
|   } | ||||
|   constructor(position: Cartesian3, options?: EntityOptions) { | ||||
|     super({ | ||||
|       position: position, | ||||
|     }) | ||||
|     this.options = { ...this.options, ...options } | ||||
|     //点对象
 | ||||
|     this.point = new PointGraphics({ | ||||
|       pixelSize: this.options.pixelSize, | ||||
|       color: this.options.color, | ||||
|       outlineColor: this.options.outlineColor, | ||||
|       outlineWidth: this.options.outlineWidth, | ||||
|     }) | ||||
|     // 标注对象
 | ||||
|     this.label = new LabelGraphics({ | ||||
|       text: this.options.text, | ||||
|       font: this.options.font, | ||||
|       pixelOffset: this.options.pixelOffset, | ||||
|     }) | ||||
| 
 | ||||
|     PointEntity.ID++ | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export { PointEntity, type EntityOptions } | ||||
| @ -0,0 +1,48 @@ | ||||
| /* | ||||
|  * @Author: cbwu 504-wuchengbo@htsdfp.com | ||||
|  * @Date: 2024-03-28 16:49:02 | ||||
|  * @LastEditors: cbwu | ||||
|  * @LastEditTime: 2024-04-01 17:04:55 | ||||
|  * @Description: 封装的Polyline类 | ||||
|  */ | ||||
| import { Entity, Cartesian3, Color, CallbackProperty } from 'cesium' | ||||
| import { BaseGeometry } from './baseGeometry' | ||||
| import { type EntityOptions } from './pointEntity' | ||||
| export class PolylineEntity extends BaseGeometry { | ||||
|   static ID: number = 0 | ||||
|   //   positions: Cartesian3[] = []
 | ||||
|   controlPointsID: string[] = [] | ||||
|   options: EntityOptions = { | ||||
|     // id: 'Polyline' + String(PolylineEntity.ID),
 | ||||
|     name: 'Polyline' + String(PolylineEntity.ID + 1), | ||||
|     show: true, | ||||
|     width: 3, | ||||
|     color: Color.GREEN, | ||||
|   } | ||||
|   constructor(ptArr: Cartesian3[], options?: EntityOptions) { | ||||
|     super() | ||||
|     this.options = { ...this.options, ...options } | ||||
|     // console.log(this.options)
 | ||||
|     this.positions = ptArr | ||||
|     // console.log(this.positions)
 | ||||
|     // 创建线实体对象
 | ||||
|     this.geometry = new Entity({ | ||||
|       name: this.options.name, | ||||
|       polyline: { | ||||
|         positions: new CallbackProperty(() => { | ||||
|           return this.positions | ||||
|         }, false), | ||||
|         show: this.options.show, | ||||
|         width: this.options.width, | ||||
|         material: this.options.color, | ||||
|       }, | ||||
|     }) | ||||
|     this.entities.add(this.geometry) | ||||
|     // 添加控制点
 | ||||
|     ptArr.forEach((pt, index) => { | ||||
|       this.createPoint(pt, index) | ||||
|     }) | ||||
| 
 | ||||
|     PolylineEntity.ID++ | ||||
|   } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue