Merge pull request 'dev-cbwu' (#6) from dev-cbwu into dev
Reviewed-on: WuChengbo/GCSGUI#6pull/8/head
						commit
						6221bca0c0
					
				| @ -0,0 +1,26 @@ | |||||||
|  | /* | ||||||
|  |  * @Author: cbwu 504-wuchengbo@htsdfp.com | ||||||
|  |  * @Date: 2024-04-13 10:36:06 | ||||||
|  |  * @LastEditors: cbwu | ||||||
|  |  * @LastEditTime: 2024-04-13 11:14:53 | ||||||
|  |  * @Description: | ||||||
|  |  */ | ||||||
|  | import { Color, Cartesian2 } from 'cesium' | ||||||
|  | export interface 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 //偏移量
 | ||||||
|  |   image?: string //图片url
 | ||||||
|  |   imageWidth?: number //图片宽
 | ||||||
|  |   imageHeight?: number //图片高
 | ||||||
|  | } | ||||||
| @ -0,0 +1,160 @@ | |||||||
|  | /* | ||||||
|  |  * @Author: cbwu 504-wuchengbo@htsdfp.com | ||||||
|  |  * @Date: 2024-04-11 13:53:40 | ||||||
|  |  * @LastEditors: cbwu | ||||||
|  |  * @LastEditTime: 2024-04-12 15:18:40 | ||||||
|  |  * @Description: 绘制多边形 | ||||||
|  |  */ | ||||||
|  | import { | ||||||
|  |   Viewer, | ||||||
|  |   ScreenSpaceEventHandler, | ||||||
|  |   Cartesian3, | ||||||
|  |   Color, | ||||||
|  |   ScreenSpaceEventType, | ||||||
|  |   Entity, | ||||||
|  |   CallbackProperty, | ||||||
|  |   PolylineDashMaterialProperty, | ||||||
|  | } from 'cesium' | ||||||
|  | import { cartesian2ToCartesian3 } from '@/utils/map/coordinate' | ||||||
|  | import { PolygonEntity } from '../geometry/polygonEntity' | ||||||
|  | import { PointEntity } from '@/utils/map/geometry/pointEntity' | ||||||
|  | import EditGeometry from '@/utils/map/draw/editGeometry' | ||||||
|  | 
 | ||||||
|  | export class DrawPolygon { | ||||||
|  |   viewer: Viewer | ||||||
|  |   handler: ScreenSpaceEventHandler | ||||||
|  |   polygon: PolygonEntity | null | ||||||
|  |   positions: Cartesian3[] = [] | ||||||
|  |   trackingLine: Entity | null | ||||||
|  |   trackingLinePositions: Cartesian3[] = [] | ||||||
|  |   bMove: boolean = false | ||||||
|  |   bLongClick: boolean = false | ||||||
|  |   constructor(viewer: Viewer) { | ||||||
|  |     this.viewer = viewer | ||||||
|  |     this.handler = new ScreenSpaceEventHandler(viewer.scene.canvas) | ||||||
|  |     this.polygon = null | ||||||
|  |     this.trackingLine = null | ||||||
|  |   } | ||||||
|  |   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, | ||||||
|  |     ) | ||||||
|  |   } | ||||||
|  |   //左单击回调事件
 | ||||||
|  |   private leftClickCallBack = ( | ||||||
|  |     event: ScreenSpaceEventHandler.PositionedEvent, | ||||||
|  |   ) => { | ||||||
|  |     const pickedObject = this.viewer.scene.pick(event.position) | ||||||
|  |     // console.log(pickedObject)
 | ||||||
|  |     if (pickedObject) { | ||||||
|  |       //点击同一位置,返回
 | ||||||
|  |       if ( | ||||||
|  |         pickedObject.id.id === | ||||||
|  |         this.polygon?.controlPointsID[this.positions.length - 1] | ||||||
|  |       ) { | ||||||
|  |         console.log('********click the same point') | ||||||
|  |         return | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     console.log('****************leftClick!') | ||||||
|  |     const cartesian3 = cartesian2ToCartesian3(this.viewer, event.position) | ||||||
|  |     if (cartesian3 != undefined) { | ||||||
|  |       if (this.positions.length <= 2) { | ||||||
|  |         this.positions.push(cartesian3) | ||||||
|  |         this.trackingLinePositions.push(cartesian3) | ||||||
|  |       } else { | ||||||
|  |         this.polygon!.modifyPoint(cartesian3, -1) | ||||||
|  |         this.polygon!.showControlPoint(-1, true) | ||||||
|  |         //多创建一个点,用于鼠标移动实时变化
 | ||||||
|  |         this.polygon!.addPoint(cartesian3, -1) | ||||||
|  |         this.polygon!.showControlPoint(-1, false) | ||||||
|  | 
 | ||||||
|  |         this.trackingLinePositions[2] = 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) { | ||||||
|  |         if (this.positions.length === 1) { | ||||||
|  |           //更新追踪线坐标
 | ||||||
|  |           this.trackingLinePositions[1] = cartesian3 | ||||||
|  |           // this.positions[1] = cartesian3
 | ||||||
|  |           if (!this.trackingLine) { | ||||||
|  |             //创建追踪线对象
 | ||||||
|  |             this.trackingLine = this.createTrackingLine( | ||||||
|  |               this.trackingLinePositions, | ||||||
|  |             ) | ||||||
|  |             this.viewer.entities.add(this.trackingLine) | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |         if (this.positions.length === 2) { | ||||||
|  |           //移除追踪直线
 | ||||||
|  |           if (this.trackingLine) { | ||||||
|  |             this.viewer.entities.remove(this.trackingLine) | ||||||
|  |           } | ||||||
|  |           this.positions.push(cartesian3) | ||||||
|  |           console.log( | ||||||
|  |             '*********PositionsLength:' + this.positions.length.toString(), | ||||||
|  |           ) | ||||||
|  |           //创建多边形
 | ||||||
|  |           if (!this.polygon) { | ||||||
|  |             this.polygon = new PolygonEntity(this.positions) | ||||||
|  |             this.viewer.dataSources.add(this.polygon) | ||||||
|  |             // 实时移动不显示控制点
 | ||||||
|  |             this.polygon.showControlPoint(-1, false) | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |         //实时改变多边形
 | ||||||
|  |         if (this.positions.length >= 3) { | ||||||
|  |           this.polygon!.modifyPoint(cartesian3, -1) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         this.viewer.scene.requestRender() //刷新
 | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |   //左双击回调事件
 | ||||||
|  |   private leftDoubleClickCallBack = ( | ||||||
|  |     event: ScreenSpaceEventHandler.PositionedEvent, | ||||||
|  |   ) => { | ||||||
|  |     if (!this.polygon) return | ||||||
|  |     console.log('**************************** double click') | ||||||
|  |     this.bMove = false | ||||||
|  |     //移除多余的点
 | ||||||
|  |     this.polygon.removePoint(-1) | ||||||
|  |     this.polygon.removePoint(-1) | ||||||
|  |   } | ||||||
|  |   //创建追踪线
 | ||||||
|  |   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,56 @@ | |||||||
|  | /* | ||||||
|  |  * @Author: cbwu 504-wuchengbo@htsdfp.com | ||||||
|  |  * @Date: 2024-04-11 09:26:56 | ||||||
|  |  * @LastEditors: cbwu | ||||||
|  |  * @LastEditTime: 2024-04-13 10:45:27 | ||||||
|  |  * @Description: 封装的Polygon对象 | ||||||
|  |  */ | ||||||
|  | import { | ||||||
|  |   Entity, | ||||||
|  |   Cartesian3, | ||||||
|  |   Color, | ||||||
|  |   CallbackProperty, | ||||||
|  |   PolygonHierarchy, | ||||||
|  | } from 'cesium' | ||||||
|  | import { BaseGeometry } from './baseGeometry' | ||||||
|  | import { EntityOptions } from '@/types/entityoptions' | ||||||
|  | export class PolygonEntity extends BaseGeometry { | ||||||
|  |   static ID: number = 0 | ||||||
|  |   //   positions: Cartesian3[] = []
 | ||||||
|  |   controlPointsID: string[] = [] | ||||||
|  |   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[], options?: EntityOptions) { | ||||||
|  |     super() | ||||||
|  |     this.positions = ptArr | ||||||
|  |     this.options = { ...this.options, ...options } | ||||||
|  |     this.geometry = new Entity({ | ||||||
|  |       show: this.options.show, | ||||||
|  |       name: this.options.name, | ||||||
|  |       polygon: { | ||||||
|  |         hierarchy: new CallbackProperty(() => { | ||||||
|  |           return new PolygonHierarchy(this.positions) | ||||||
|  |         }, false), | ||||||
|  |         material: this.options.fillColor, //填充颜色
 | ||||||
|  |         fill: this.options.fill, //是否填充
 | ||||||
|  |         outline: true, | ||||||
|  |         // outlineWidth: this.options.width, //线宽
 | ||||||
|  |         outlineColor: this.options.color, //线颜色
 | ||||||
|  |       }, | ||||||
|  |     }) | ||||||
|  |     this.entities.add(this.geometry) | ||||||
|  |     // 添加控制点
 | ||||||
|  |     ptArr.forEach((pt, index) => { | ||||||
|  |       this.createControlPoint(pt, index) | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     PolygonEntity.ID++ | ||||||
|  |   } | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in New Issue