Compare commits
	
		
			2 Commits
		
	
	
		
			0e13c4c9ba
			...
			4827a7da46
		
	
	| Author | SHA1 | Date | 
|---|---|---|
| 
							
							
								
								 | 
						4827a7da46 | |
| 
							
							
								
								 | 
						74d661c8a7 | 
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.0 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 898 B  | 
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.6 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 1.1 KiB  | 
| 
						 | 
					@ -15,12 +15,12 @@ import { createAttackArrowPositions } from './draw/attackArrowGraphic'
 | 
				
			||||||
 * @returns Promise 绘制完成的所有点坐标数组
 | 
					 * @returns Promise 绘制完成的所有点坐标数组
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const drawAttackArrow = (deps) => {
 | 
					export const drawAttackArrow = (deps) => {
 | 
				
			||||||
  const { viewer, bus, position, status, registerAbort, globalAbort } = deps
 | 
					  const { viewer, bus, ScreenMode, position, registerAbort, globalAbort } = deps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 如果在执行其它操作,则取消
 | 
					  // 如果在执行其它操作,则取消
 | 
				
			||||||
  globalAbort()
 | 
					  globalAbort()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  status.value = 'Drawing'
 | 
					  bus.mode.value = ScreenMode.DRAW
 | 
				
			||||||
  const featurePositions = []
 | 
					  const featurePositions = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 临时多边形实体 (包含填充和边界线)
 | 
					  // 临时多边形实体 (包含填充和边界线)
 | 
				
			||||||
| 
						 | 
					@ -79,11 +79,11 @@ export const drawAttackArrow = (deps) => {
 | 
				
			||||||
    // 清理资源
 | 
					    // 清理资源
 | 
				
			||||||
    const dispose = () => {
 | 
					    const dispose = () => {
 | 
				
			||||||
      registerAbort(null) // 取消注册当前的 abort 回调
 | 
					      registerAbort(null) // 取消注册当前的 abort 回调
 | 
				
			||||||
      status.value = 'Default'
 | 
					 | 
				
			||||||
      viewer.entities.remove(tempPolygon)
 | 
					      viewer.entities.remove(tempPolygon)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
				
			||||||
 | 
					      bus.mode.value = ScreenMode.VIEW
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 取消绘制
 | 
					    // 取消绘制
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,12 +15,12 @@ import { createCurvePolygonPositions } from './draw/curvePolygonGraphic'
 | 
				
			||||||
 * @returns Promise 绘制完成的所有点坐标数组
 | 
					 * @returns Promise 绘制完成的所有点坐标数组
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const drawCurvePolygon = (deps) => {
 | 
					export const drawCurvePolygon = (deps) => {
 | 
				
			||||||
  const { viewer, bus, position, status, registerAbort, globalAbort } = deps
 | 
					  const { viewer, bus, ScreenMode, position, registerAbort, globalAbort } = deps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 如果在执行其它操作,则取消
 | 
					  // 如果在执行其它操作,则取消
 | 
				
			||||||
  globalAbort()
 | 
					  globalAbort()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  status.value = 'Drawing'
 | 
					  bus.mode.value = ScreenMode.DRAW
 | 
				
			||||||
  const featurePositions = []
 | 
					  const featurePositions = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 临时多边形实体 (包含填充和边界线)
 | 
					  // 临时多边形实体 (包含填充和边界线)
 | 
				
			||||||
| 
						 | 
					@ -74,11 +74,11 @@ export const drawCurvePolygon = (deps) => {
 | 
				
			||||||
    // 清理资源
 | 
					    // 清理资源
 | 
				
			||||||
    const dispose = () => {
 | 
					    const dispose = () => {
 | 
				
			||||||
      registerAbort(null) // 取消注册当前的 abort 回调
 | 
					      registerAbort(null) // 取消注册当前的 abort 回调
 | 
				
			||||||
      status.value = 'Default'
 | 
					 | 
				
			||||||
      viewer.entities.remove(tempPolygon)
 | 
					      viewer.entities.remove(tempPolygon)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
				
			||||||
 | 
					      bus.mode.value = ScreenMode.VIEW
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 取消绘制
 | 
					    // 取消绘制
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,12 +15,12 @@ import { createDoubleArrowPositions } from './draw/doubleArrowGraphic'
 | 
				
			||||||
 * @returns Promise 绘制完成的所有点坐标数组
 | 
					 * @returns Promise 绘制完成的所有点坐标数组
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const drawDoubleArrow = (deps) => {
 | 
					export const drawDoubleArrow = (deps) => {
 | 
				
			||||||
  const { viewer, bus, position, status, registerAbort, globalAbort } = deps
 | 
					  const { viewer, bus, ScreenMode, position, registerAbort, globalAbort } = deps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 如果在执行其它操作,则取消
 | 
					  // 如果在执行其它操作,则取消
 | 
				
			||||||
  globalAbort()
 | 
					  globalAbort()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  status.value = 'Drawing'
 | 
					  bus.mode.value = ScreenMode.DRAW
 | 
				
			||||||
  const featurePositions = []
 | 
					  const featurePositions = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 临时多边形实体 (包含填充和边界线)
 | 
					  // 临时多边形实体 (包含填充和边界线)
 | 
				
			||||||
| 
						 | 
					@ -79,11 +79,11 @@ export const drawDoubleArrow = (deps) => {
 | 
				
			||||||
    // 清理资源
 | 
					    // 清理资源
 | 
				
			||||||
    const dispose = () => {
 | 
					    const dispose = () => {
 | 
				
			||||||
      registerAbort(null) // 取消注册当前的 abort 回调
 | 
					      registerAbort(null) // 取消注册当前的 abort 回调
 | 
				
			||||||
      status.value = 'Default'
 | 
					 | 
				
			||||||
      viewer.entities.remove(tempPolygon)
 | 
					      viewer.entities.remove(tempPolygon)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
				
			||||||
 | 
					      bus.mode.value = ScreenMode.VIEW
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 取消绘制
 | 
					    // 取消绘制
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,20 +6,20 @@ import { Cartesian3, ScreenSpaceEventType } from 'cesium'
 | 
				
			||||||
 * @returns Promise 绘制完成的点坐标
 | 
					 * @returns Promise 绘制完成的点坐标
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const drawPoint = (deps) => {
 | 
					export const drawPoint = (deps) => {
 | 
				
			||||||
  const { bus, position, status, registerAbort, globalAbort } = deps
 | 
					  const { bus, ScreenMode, position, registerAbort, globalAbort } = deps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 如果在执行其它操作,则取消
 | 
					  // 如果在执行其它操作,则取消
 | 
				
			||||||
  globalAbort()
 | 
					  globalAbort()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  status.value = 'Drawing'
 | 
					  bus.mode.value = ScreenMode.DRAW
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return new Promise((resolve, reject) => {
 | 
					  return new Promise((resolve, reject) => {
 | 
				
			||||||
    // 清理资源
 | 
					    // 清理资源
 | 
				
			||||||
    const dispose = () => {
 | 
					    const dispose = () => {
 | 
				
			||||||
      registerAbort(null) // 取消注册当前的 abort 回调
 | 
					      registerAbort(null) // 取消注册当前的 abort 回调
 | 
				
			||||||
      status.value = 'Default'
 | 
					 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleDraw)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancel)
 | 
					      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancel)
 | 
				
			||||||
 | 
					      bus.mode.value = ScreenMode.VIEW
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 取消绘制
 | 
					    // 取消绘制
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,12 +14,12 @@ import {
 | 
				
			||||||
 * @returns Promise 绘制完成的所有点坐标数组
 | 
					 * @returns Promise 绘制完成的所有点坐标数组
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const drawPolygon = (deps) => {
 | 
					export const drawPolygon = (deps) => {
 | 
				
			||||||
  const { viewer, bus, position, status, registerAbort, globalAbort } = deps
 | 
					  const { viewer, bus, ScreenMode, position, registerAbort, globalAbort } = deps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 如果在执行其它操作,则取消
 | 
					  // 如果在执行其它操作,则取消
 | 
				
			||||||
  globalAbort()
 | 
					  globalAbort()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  status.value = 'Drawing'
 | 
					  bus.mode.value = ScreenMode.DRAW
 | 
				
			||||||
  const featurePositions = []
 | 
					  const featurePositions = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 临时多边形实体 (包含填充和边界线)
 | 
					  // 临时多边形实体 (包含填充和边界线)
 | 
				
			||||||
| 
						 | 
					@ -74,11 +74,11 @@ export const drawPolygon = (deps) => {
 | 
				
			||||||
    // 清理资源
 | 
					    // 清理资源
 | 
				
			||||||
    const dispose = () => {
 | 
					    const dispose = () => {
 | 
				
			||||||
      registerAbort(null) // 取消注册当前的 abort 回调
 | 
					      registerAbort(null) // 取消注册当前的 abort 回调
 | 
				
			||||||
      status.value = 'Default'
 | 
					 | 
				
			||||||
      viewer.entities.remove(tempPolygon)
 | 
					      viewer.entities.remove(tempPolygon)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
				
			||||||
 | 
					      bus.mode.value = ScreenMode.VIEW
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 取消绘制
 | 
					    // 取消绘制
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,12 +12,12 @@ import {
 | 
				
			||||||
 * @returns Promise 绘制完成的所有点坐标数组
 | 
					 * @returns Promise 绘制完成的所有点坐标数组
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const drawPolyline = (deps) => {
 | 
					export const drawPolyline = (deps) => {
 | 
				
			||||||
  const { viewer, bus, position, status, registerAbort, globalAbort } = deps
 | 
					  const { viewer, bus, ScreenMode, position, registerAbort, globalAbort } = deps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 如果在执行其它操作,则取消
 | 
					  // 如果在执行其它操作,则取消
 | 
				
			||||||
  globalAbort()
 | 
					  globalAbort()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  status.value = 'Drawing'
 | 
					  bus.mode.value = ScreenMode.DRAW
 | 
				
			||||||
  const featurePositions = []
 | 
					  const featurePositions = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 临时折线实体
 | 
					  // 临时折线实体
 | 
				
			||||||
| 
						 | 
					@ -47,11 +47,11 @@ export const drawPolyline = (deps) => {
 | 
				
			||||||
    // 清理资源
 | 
					    // 清理资源
 | 
				
			||||||
    const dispose = () => {
 | 
					    const dispose = () => {
 | 
				
			||||||
      registerAbort(null) // 取消注册当前的 abort 回调
 | 
					      registerAbort(null) // 取消注册当前的 abort 回调
 | 
				
			||||||
      status.value = 'Default'
 | 
					 | 
				
			||||||
      viewer.entities.remove(tempPolyline)
 | 
					      viewer.entities.remove(tempPolyline)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
				
			||||||
 | 
					      bus.mode.value = ScreenMode.VIEW
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 取消绘制
 | 
					    // 取消绘制
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,12 +15,12 @@ import { createStraightArrowPositions } from './draw/straightArrowGraphic'
 | 
				
			||||||
 * @returns Promise 绘制完成的所有点坐标数组
 | 
					 * @returns Promise 绘制完成的所有点坐标数组
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const drawStraightArrow = (deps) => {
 | 
					export const drawStraightArrow = (deps) => {
 | 
				
			||||||
  const { viewer, bus, position, status, registerAbort, globalAbort } = deps
 | 
					  const { viewer, bus, ScreenMode, position, registerAbort, globalAbort } = deps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 如果在执行其它操作,则取消
 | 
					  // 如果在执行其它操作,则取消
 | 
				
			||||||
  globalAbort()
 | 
					  globalAbort()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  status.value = 'Drawing'
 | 
					  bus.mode.value = ScreenMode.DRAW
 | 
				
			||||||
  const featurePositions = []
 | 
					  const featurePositions = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 临时多边形实体 (包含填充和边界线)
 | 
					  // 临时多边形实体 (包含填充和边界线)
 | 
				
			||||||
| 
						 | 
					@ -75,11 +75,11 @@ export const drawStraightArrow = (deps) => {
 | 
				
			||||||
    // 清理资源
 | 
					    // 清理资源
 | 
				
			||||||
    const dispose = () => {
 | 
					    const dispose = () => {
 | 
				
			||||||
      registerAbort(null) // 取消注册当前的 abort 回调
 | 
					      registerAbort(null) // 取消注册当前的 abort 回调
 | 
				
			||||||
      status.value = 'Default'
 | 
					 | 
				
			||||||
      viewer.entities.remove(tempPolygon)
 | 
					      viewer.entities.remove(tempPolygon)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
				
			||||||
 | 
					      bus.mode.value = ScreenMode.VIEW
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 取消绘制
 | 
					    // 取消绘制
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,12 +15,12 @@ import { createWideArrowPositions } from './draw/wideArrowGraphic'
 | 
				
			||||||
 * @returns Promise 绘制完成的所有点坐标数组
 | 
					 * @returns Promise 绘制完成的所有点坐标数组
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
export const drawWideArrow = (deps) => {
 | 
					export const drawWideArrow = (deps) => {
 | 
				
			||||||
  const { viewer, bus, position, status, registerAbort, globalAbort } = deps
 | 
					  const { viewer, bus, ScreenMode, position, registerAbort, globalAbort } = deps
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 如果在执行其它操作,则取消
 | 
					  // 如果在执行其它操作,则取消
 | 
				
			||||||
  globalAbort()
 | 
					  globalAbort()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  status.value = 'Drawing'
 | 
					  bus.mode.value = ScreenMode.DRAW
 | 
				
			||||||
  const featurePositions = []
 | 
					  const featurePositions = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 临时多边形实体 (包含填充和边界线)
 | 
					  // 临时多边形实体 (包含填充和边界线)
 | 
				
			||||||
| 
						 | 
					@ -76,11 +76,11 @@ export const drawWideArrow = (deps) => {
 | 
				
			||||||
    // 清理资源
 | 
					    // 清理资源
 | 
				
			||||||
    const dispose = () => {
 | 
					    const dispose = () => {
 | 
				
			||||||
      registerAbort(null) // 取消注册当前的 abort 回调
 | 
					      registerAbort(null) // 取消注册当前的 abort 回调
 | 
				
			||||||
      status.value = 'Default'
 | 
					 | 
				
			||||||
      viewer.entities.remove(tempPolygon)
 | 
					      viewer.entities.remove(tempPolygon)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_CLICK, handleAddPoint)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.RIGHT_CLICK, handleCancelDraw)
 | 
				
			||||||
      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
					      bus.offScreen(ScreenSpaceEventType.LEFT_DOUBLE_CLICK, handleEndDraw)
 | 
				
			||||||
 | 
					      bus.mode.value = ScreenMode.VIEW
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 取消绘制
 | 
					    // 取消绘制
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ import {
 | 
				
			||||||
  Color as CesiumColor, 
 | 
					  Color as CesiumColor, 
 | 
				
			||||||
  HeightReference,
 | 
					  HeightReference,
 | 
				
			||||||
} from 'cesium'
 | 
					} from 'cesium'
 | 
				
			||||||
import { useEventBus } from '../useEventBus'
 | 
					import { useEventBus, ScreenMode } from '../useEventBus'
 | 
				
			||||||
import { useHoverPosition } from '../useHoverPosition'
 | 
					import { useHoverPosition } from '../useHoverPosition'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 导入拆分后的类型和绘制逻辑
 | 
					// 导入拆分后的类型和绘制逻辑
 | 
				
			||||||
| 
						 | 
					@ -39,13 +39,13 @@ export const useDrawTool = (viewer) => {
 | 
				
			||||||
  const { isHover, position } = useHoverPosition(viewer)
 | 
					  const { isHover, position } = useHoverPosition(viewer)
 | 
				
			||||||
  // 获取事件总线
 | 
					  // 获取事件总线
 | 
				
			||||||
  const bus = useEventBus(viewer)
 | 
					  const bus = useEventBus(viewer)
 | 
				
			||||||
  const status = ref('Default')
 | 
					  // const status = ref('Default')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 判断辅助点是否显示
 | 
					  // 判断辅助点是否显示
 | 
				
			||||||
  watch(
 | 
					  watch(
 | 
				
			||||||
    () => [status.value, isHover.value],
 | 
					    () => [bus.mode.value, isHover.value],
 | 
				
			||||||
    ([nowStatus, hover]) => {
 | 
					    ([nowStatus, hover]) => {
 | 
				
			||||||
      if (hover && nowStatus === 'Drawing') {
 | 
					      if (hover && nowStatus === ScreenMode.DRAW) {
 | 
				
			||||||
        assistPoint.show = true
 | 
					        assistPoint.show = true
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        assistPoint.show = false
 | 
					        assistPoint.show = false
 | 
				
			||||||
| 
						 | 
					@ -92,8 +92,8 @@ export const useDrawTool = (viewer) => {
 | 
				
			||||||
  const drawDependencies = {
 | 
					  const drawDependencies = {
 | 
				
			||||||
    viewer,
 | 
					    viewer,
 | 
				
			||||||
    bus,
 | 
					    bus,
 | 
				
			||||||
 | 
					    ScreenMode,
 | 
				
			||||||
    position,
 | 
					    position,
 | 
				
			||||||
    status,
 | 
					 | 
				
			||||||
    registerAbort,
 | 
					    registerAbort,
 | 
				
			||||||
    globalAbort: abort, // 将全局 abort 函数也传递进去,方便内部调用
 | 
					    globalAbort: abort, // 将全局 abort 函数也传递进去,方便内部调用
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -137,8 +137,6 @@ export const useDrawTool = (viewer) => {
 | 
				
			||||||
    drawAttackArrow,
 | 
					    drawAttackArrow,
 | 
				
			||||||
    drawDoubleArrow,
 | 
					    drawDoubleArrow,
 | 
				
			||||||
    abort,
 | 
					    abort,
 | 
				
			||||||
    // 如果需要,可以暴露 status
 | 
					 | 
				
			||||||
    // status
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,18 @@
 | 
				
			||||||
import mitt from 'mitt'
 | 
					import mitt from 'mitt'
 | 
				
			||||||
import { Viewer, ScreenSpaceEventHandler, ScreenSpaceEventType } from 'cesium'
 | 
					import { ref } from 'vue'
 | 
				
			||||||
 | 
					import { ScreenSpaceEventHandler, ScreenSpaceEventType } from 'cesium'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 使用 Map 来缓存每个 viewer 对应的事件总线组件
 | 
					// 使用 Map 来缓存每个 viewer 对应的事件总线组件
 | 
				
			||||||
// Viewer 实例作为 Map 的键
 | 
					// Viewer 实例作为 Map 的键
 | 
				
			||||||
const viewerEventBusCache = new Map()
 | 
					const viewerEventBusCache = new Map()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 屏幕鼠标事件模式
 | 
				
			||||||
 | 
					export const ScreenMode = {
 | 
				
			||||||
 | 
					  VIEW: 1000,
 | 
				
			||||||
 | 
					  DRAW: 2000,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 消息总线,接管全局屏幕空间事件,仅作用于单个 Viewer。
 | 
					 * 消息总线,接管全局屏幕空间事件,仅作用于单个 Viewer。
 | 
				
			||||||
 * 调用该hook后,所有鼠标事件必须改为调用返回对象中的方法。
 | 
					 * 调用该hook后,所有鼠标事件必须改为调用返回对象中的方法。
 | 
				
			||||||
| 
						 | 
					@ -18,6 +25,7 @@ export const useEventBus = (viewer) => {
 | 
				
			||||||
  let cache = viewerEventBusCache.get(viewer)
 | 
					  let cache = viewerEventBusCache.get(viewer)
 | 
				
			||||||
  if (!cache) {
 | 
					  if (!cache) {
 | 
				
			||||||
    cache = {
 | 
					    cache = {
 | 
				
			||||||
 | 
					      mode: ref(ScreenMode.VIEW),
 | 
				
			||||||
      // 创建一个 mitt 实例用于处理所有屏幕空间事件
 | 
					      // 创建一个 mitt 实例用于处理所有屏幕空间事件
 | 
				
			||||||
      screenEmitter: mitt(),
 | 
					      screenEmitter: mitt(),
 | 
				
			||||||
      // 创建一个 mitt 实例用于处理自定义事件
 | 
					      // 创建一个 mitt 实例用于处理自定义事件
 | 
				
			||||||
| 
						 | 
					@ -35,19 +43,20 @@ export const useEventBus = (viewer) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // 构建返回的 EventBus 对象
 | 
					  // 构建返回的 EventBus 对象
 | 
				
			||||||
  const bus = {
 | 
					  const bus = {
 | 
				
			||||||
    // 移除 mode 属性的定义
 | 
					    mode: cache.mode,
 | 
				
			||||||
 | 
					 | 
				
			||||||
    // onScreen 直接注册到 screenEmitter
 | 
					    // onScreen 直接注册到 screenEmitter
 | 
				
			||||||
    // onScreen(event, handler) {
 | 
					    onScreen(event, handler, mode) {
 | 
				
			||||||
    //   screenEmitter.on(event, handler)
 | 
					      mode = mode || cache.mode.value
 | 
				
			||||||
    // },
 | 
					      cache.screenEmitter.on(mode + event, handler)
 | 
				
			||||||
    onScreen: cache.screenEmitter.on,
 | 
					    },
 | 
				
			||||||
 | 
					    // onScreen: cache.screenEmitter.on,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // offScreen 直接从 screenEmitter 移除
 | 
					    // offScreen 直接从 screenEmitter 移除
 | 
				
			||||||
    // offScreen(event, handler) {
 | 
					    offScreen(event, handler, mode) {
 | 
				
			||||||
    //   screenEmitter.off(event, handler)
 | 
					      mode = mode || cache.mode.value
 | 
				
			||||||
    // },
 | 
					      cache.screenEmitter.off(mode + event, handler)
 | 
				
			||||||
    offScreen: cache.screenEmitter.off,
 | 
					    },
 | 
				
			||||||
 | 
					    // offScreen: cache.screenEmitter.off,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // on 保持不变
 | 
					    // on 保持不变
 | 
				
			||||||
    // on(event, handler) {
 | 
					    // on(event, handler) {
 | 
				
			||||||
| 
						 | 
					@ -71,7 +80,7 @@ export const useEventBus = (viewer) => {
 | 
				
			||||||
      } else if (Object.values(ScreenSpaceEventType).includes(event)) {
 | 
					      } else if (Object.values(ScreenSpaceEventType).includes(event)) {
 | 
				
			||||||
        // 触发屏幕空间事件 (触发所有监听器,无模式检查)
 | 
					        // 触发屏幕空间事件 (触发所有监听器,无模式检查)
 | 
				
			||||||
        // 屏幕空间事件通常只有一个参数
 | 
					        // 屏幕空间事件通常只有一个参数
 | 
				
			||||||
        cache.screenEmitter.emit(event, args[0])
 | 
					        cache.screenEmitter.emit(cache.mode.value + event, args[0])
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        console.warn(`EventBus: 不符合规范的触发事件: ${event}`)
 | 
					        console.warn(`EventBus: 不符合规范的触发事件: ${event}`)
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@ import {
 | 
				
			||||||
} from 'cesium'
 | 
					} from 'cesium'
 | 
				
			||||||
import { computed, ref, shallowRef } from 'vue'
 | 
					import { computed, ref, shallowRef } from 'vue'
 | 
				
			||||||
import { useElementHover } from '@vueuse/core'
 | 
					import { useElementHover } from '@vueuse/core'
 | 
				
			||||||
import { useEventBus } from './useEventBus'
 | 
					import { useEventBus, ScreenMode } from './useEventBus'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 使用 Map 来缓存每个 viewer 对应的位置缓存
 | 
					// 使用 Map 来缓存每个 viewer 对应的位置缓存
 | 
				
			||||||
// Viewer 实例作为 Map 的键
 | 
					// Viewer 实例作为 Map 的键
 | 
				
			||||||
| 
						 | 
					@ -25,7 +25,7 @@ export const useHoverPosition = (viewer) => {
 | 
				
			||||||
    // const coordinate = shallowRef<Cartographic | null>(null)
 | 
					    // const coordinate = shallowRef<Cartographic | null>(null)
 | 
				
			||||||
    // 添加鼠标移动事件
 | 
					    // 添加鼠标移动事件
 | 
				
			||||||
    const bus = useEventBus(viewer)
 | 
					    const bus = useEventBus(viewer)
 | 
				
			||||||
    bus.onScreen(ScreenSpaceEventType.MOUSE_MOVE, (param) => {
 | 
					    const hoverHandler = (param) => {
 | 
				
			||||||
      screenPosition.value = param.endPosition.clone()
 | 
					      screenPosition.value = param.endPosition.clone()
 | 
				
			||||||
      position.value = viewer.scene.pickPosition(param.endPosition)
 | 
					      position.value = viewer.scene.pickPosition(param.endPosition)
 | 
				
			||||||
      bus.emit('hoverTest', {
 | 
					      bus.emit('hoverTest', {
 | 
				
			||||||
| 
						 | 
					@ -33,7 +33,10 @@ export const useHoverPosition = (viewer) => {
 | 
				
			||||||
        position: position.value,
 | 
					        position: position.value,
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
      // coordinate.value = Cartographic.fromCartesian(position.value)
 | 
					      // coordinate.value = Cartographic.fromCartesian(position.value)
 | 
				
			||||||
    })
 | 
					    }
 | 
				
			||||||
 | 
					    // 每个模式都关联事件
 | 
				
			||||||
 | 
					    bus.onScreen(ScreenSpaceEventType.MOUSE_MOVE, hoverHandler, ScreenMode.VIEW)
 | 
				
			||||||
 | 
					    bus.onScreen(ScreenSpaceEventType.MOUSE_MOVE, hoverHandler, ScreenMode.DRAW)
 | 
				
			||||||
    cache = {
 | 
					    cache = {
 | 
				
			||||||
      isHover,
 | 
					      isHover,
 | 
				
			||||||
      screenPosition,
 | 
					      screenPosition,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,74 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * @Descripttion: 雾粒子
 | 
				
			||||||
 | 
					 * @Author: 笙痞
 | 
				
			||||||
 | 
					 * @Date: 2023-01-04 18:11:32
 | 
				
			||||||
 | 
					 * @LastEditors: 笙痞77
 | 
				
			||||||
 | 
					 * @LastEditTime: 2023-05-19 09:56:16
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					import * as Cesium from "cesium";
 | 
				
			||||||
 | 
					class FogEffect {
 | 
				
			||||||
 | 
					  constructor(viewer, options) {
 | 
				
			||||||
 | 
					    if (!viewer) throw new Error("no viewer object!");
 | 
				
			||||||
 | 
					    options = options || {};
 | 
				
			||||||
 | 
					    this.visibility = Cesium.defaultValue(options.visibility, 0.1); // 能见度
 | 
				
			||||||
 | 
					    this.color = Cesium.defaultValue(
 | 
				
			||||||
 | 
					      options.color,
 | 
				
			||||||
 | 
					      new Cesium.Color(0.8, 0.8, 0.8, 0.5)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    this.viewer = viewer;
 | 
				
			||||||
 | 
					    this.init();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  init() {
 | 
				
			||||||
 | 
					    this.fogStage = new Cesium.PostProcessStage({
 | 
				
			||||||
 | 
					      name: "czm_fog",
 | 
				
			||||||
 | 
					      fragmentShader: this.fog(),
 | 
				
			||||||
 | 
					      uniforms: {
 | 
				
			||||||
 | 
					        visibility: () => {
 | 
				
			||||||
 | 
					          return this.visibility;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        fogColor: () => {
 | 
				
			||||||
 | 
					          return this.color;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    this.viewer.scene.postProcessStages.add(this.fogStage);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  destroy() {
 | 
				
			||||||
 | 
					    if (!this.viewer || !this.fogStage) return;
 | 
				
			||||||
 | 
					    this.viewer.scene.postProcessStages.remove(this.fogStage);
 | 
				
			||||||
 | 
					    const isDestroyed = this.fogStage.isDestroyed();
 | 
				
			||||||
 | 
					    // 先检查是否被销毁过,如果已经被销毁过再调用destroy会报错
 | 
				
			||||||
 | 
					    if (!isDestroyed) {
 | 
				
			||||||
 | 
					      this.fogStage.destroy();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    delete this.visibility;
 | 
				
			||||||
 | 
					    delete this.color;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  show(visible) {
 | 
				
			||||||
 | 
					    this.fogStage.enabled = visible;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fog() {
 | 
				
			||||||
 | 
					    return "uniform sampler2D colorTexture;\n\
 | 
				
			||||||
 | 
					       uniform sampler2D depthTexture;\n\
 | 
				
			||||||
 | 
					       uniform float visibility;\n\
 | 
				
			||||||
 | 
					       uniform vec4 fogColor;\n\
 | 
				
			||||||
 | 
					       in vec2 v_textureCoordinates; \n\
 | 
				
			||||||
 | 
					       out vec4 fragColor;\n\
 | 
				
			||||||
 | 
					       void main(void) \n\
 | 
				
			||||||
 | 
					       { \n\
 | 
				
			||||||
 | 
					          vec4 origcolor = texture(colorTexture, v_textureCoordinates); \n\
 | 
				
			||||||
 | 
					          float depth = czm_readDepth(depthTexture, v_textureCoordinates); \n\
 | 
				
			||||||
 | 
					          vec4 depthcolor = texture(depthTexture, v_textureCoordinates); \n\
 | 
				
			||||||
 | 
					          float f = visibility * (depthcolor.r - 0.3) / 0.2; \n\
 | 
				
			||||||
 | 
					          if (f < 0.0) f = 0.0; \n\
 | 
				
			||||||
 | 
					          else if (f > 1.0) f = 1.0; \n\
 | 
				
			||||||
 | 
					          fragColor = mix(origcolor, fogColor, f); \n\
 | 
				
			||||||
 | 
					       }\n";
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default FogEffect;
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,54 @@
 | 
				
			||||||
 | 
					import * as Cesium from "cesium";
 | 
				
			||||||
 | 
					import RainEffect from "./rain";
 | 
				
			||||||
 | 
					import SnowEffect from "./snow";
 | 
				
			||||||
 | 
					import FogEffect from "./fog";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const useWeatherParticle = (viewer) => { 
 | 
				
			||||||
 | 
					  const _viewer = viewer;
 | 
				
			||||||
 | 
					  let weather = null
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  const destroy = () => { 
 | 
				
			||||||
 | 
					    if(weather) {
 | 
				
			||||||
 | 
					      weather.destroy();
 | 
				
			||||||
 | 
					      weather = null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const rain = () => { 
 | 
				
			||||||
 | 
					    destroy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    weather = new RainEffect(_viewer, {
 | 
				
			||||||
 | 
					      tiltAngle: -0.2, //倾斜角度
 | 
				
			||||||
 | 
					      rainSize: 1.0, // 雨大小
 | 
				
			||||||
 | 
					      rainSpeed: 120.0, // 雨速
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    weather.show(true);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const snow = () => { 
 | 
				
			||||||
 | 
					    destroy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    weather = new SnowEffect(_viewer, {
 | 
				
			||||||
 | 
					      snowSize: 0.02, // ❄️大小,最好小于0.02
 | 
				
			||||||
 | 
					      snowSpeed: 60.0, // 速度
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    weather.show(true);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const fog = () => { 
 | 
				
			||||||
 | 
					    destroy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    weather = new FogEffect(_viewer, {
 | 
				
			||||||
 | 
					      visibility: 0.2, // 能见度
 | 
				
			||||||
 | 
					      color: new Cesium.Color(0.8, 0.8, 0.8, 0.3),
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    weather.show(true);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return {
 | 
				
			||||||
 | 
					    rain,
 | 
				
			||||||
 | 
					    snow,
 | 
				
			||||||
 | 
					    fog,
 | 
				
			||||||
 | 
					    destroy,
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,86 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * @Descripttion: 雨粒子效果
 | 
				
			||||||
 | 
					 * @Author: 笙痞
 | 
				
			||||||
 | 
					 * @Date: 2023-01-04 15:01:03
 | 
				
			||||||
 | 
					 * @LastEditors: 笙痞77
 | 
				
			||||||
 | 
					 * @LastEditTime: 2023-05-19 09:54:15
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					import * as Cesium from "cesium";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class RainEffect {
 | 
				
			||||||
 | 
					  constructor(viewer, options) {
 | 
				
			||||||
 | 
					    if (!viewer) throw new Error("no viewer object!");
 | 
				
			||||||
 | 
					    options = options || {};
 | 
				
			||||||
 | 
					    //倾斜角度,负数向右,正数向左
 | 
				
			||||||
 | 
					    this.tiltAngle = Cesium.defaultValue(options.tiltAngle, -0.6);
 | 
				
			||||||
 | 
					    this.rainSize = Cesium.defaultValue(options.rainSize, 0.3);
 | 
				
			||||||
 | 
					    this.rainSpeed = Cesium.defaultValue(options.rainSpeed, 60.0);
 | 
				
			||||||
 | 
					    this.viewer = viewer;
 | 
				
			||||||
 | 
					    this.init();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  init() {
 | 
				
			||||||
 | 
					    this.rainStage = new Cesium.PostProcessStage({
 | 
				
			||||||
 | 
					      name: "czm_rain",
 | 
				
			||||||
 | 
					      fragmentShader: this.rain(),
 | 
				
			||||||
 | 
					      uniforms: {
 | 
				
			||||||
 | 
					        tiltAngle: () => {
 | 
				
			||||||
 | 
					          return this.tiltAngle;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        rainSize: () => {
 | 
				
			||||||
 | 
					          return this.rainSize;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        rainSpeed: () => {
 | 
				
			||||||
 | 
					          return this.rainSpeed;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    this.viewer.scene.postProcessStages.add(this.rainStage);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  destroy() {
 | 
				
			||||||
 | 
					    if (!this.viewer || !this.rainStage) return;
 | 
				
			||||||
 | 
					    this.viewer.scene.postProcessStages.remove(this.rainStage);
 | 
				
			||||||
 | 
					    const isDestroyed = this.rainStage.isDestroyed();
 | 
				
			||||||
 | 
					    // 先检查是否被销毁过,如果已经被销毁过再调用destroy会报错
 | 
				
			||||||
 | 
					    if (!isDestroyed) {
 | 
				
			||||||
 | 
					      this.rainStage.destroy();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    delete this.tiltAngle;
 | 
				
			||||||
 | 
					    delete this.rainSize;
 | 
				
			||||||
 | 
					    delete this.rainSpeed;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  show(visible) {
 | 
				
			||||||
 | 
					    this.rainStage.enabled = visible;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  rain() {
 | 
				
			||||||
 | 
					    return "uniform sampler2D colorTexture;\n\
 | 
				
			||||||
 | 
					              in vec2 v_textureCoordinates;\n\
 | 
				
			||||||
 | 
					              uniform float tiltAngle;\n\
 | 
				
			||||||
 | 
					              uniform float rainSize;\n\
 | 
				
			||||||
 | 
					              uniform float rainSpeed;\n\
 | 
				
			||||||
 | 
					              float hash(float x) {\n\
 | 
				
			||||||
 | 
					                  return fract(sin(x * 133.3) * 13.13);\n\
 | 
				
			||||||
 | 
					              }\n\
 | 
				
			||||||
 | 
					              out vec4 fragColor;\n\
 | 
				
			||||||
 | 
					              void main(void) {\n\
 | 
				
			||||||
 | 
					                  float time = czm_frameNumber / rainSpeed;\n\
 | 
				
			||||||
 | 
					                  vec2 resolution = czm_viewport.zw;\n\
 | 
				
			||||||
 | 
					                  vec2 uv = (gl_FragCoord.xy * 2. - resolution.xy) / min(resolution.x, resolution.y);\n\
 | 
				
			||||||
 | 
					                  vec3 c = vec3(.6, .7, .8);\n\
 | 
				
			||||||
 | 
					                  float a = tiltAngle;\n\
 | 
				
			||||||
 | 
					                  float si = sin(a), co = cos(a);\n\
 | 
				
			||||||
 | 
					                  uv *= mat2(co, -si, si, co);\n\
 | 
				
			||||||
 | 
					                  uv *= length(uv + vec2(0, 4.9)) * rainSize + 1.;\n\
 | 
				
			||||||
 | 
					                  float v = 1. - sin(hash(floor(uv.x * 100.)) * 2.);\n\
 | 
				
			||||||
 | 
					                  float b = clamp(abs(sin(20. * time * v + uv.y * (5. / (2. + v)))) - .95, 0., 1.) * 20.;\n\
 | 
				
			||||||
 | 
					                  c *= v * b;\n\
 | 
				
			||||||
 | 
					                  fragColor = mix(texture(colorTexture, v_textureCoordinates), vec4(c, 1), .5);\n\
 | 
				
			||||||
 | 
					              }\n\
 | 
				
			||||||
 | 
					              ";
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default RainEffect;
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,86 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * @Descripttion: 雪花粒子类
 | 
				
			||||||
 | 
					 * @Author: 笙痞
 | 
				
			||||||
 | 
					 * @Date: 2023-01-04 14:01:07
 | 
				
			||||||
 | 
					 * @LastEditors: 笙痞77
 | 
				
			||||||
 | 
					 * @LastEditTime: 2023-05-19 09:52:52
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import * as Cesium from "cesium";
 | 
				
			||||||
 | 
					class SnowEffect {
 | 
				
			||||||
 | 
					  constructor(viewer, options) {
 | 
				
			||||||
 | 
					    if (!viewer) throw new Error("no viewer object!");
 | 
				
			||||||
 | 
					    options = options || {};
 | 
				
			||||||
 | 
					    this.snowSize = Cesium.defaultValue(options.snowSize, 0.02); // ❄️大小,最好小于0.02
 | 
				
			||||||
 | 
					    this.snowSpeed = Cesium.defaultValue(options.snowSpeed, 60.0); // 速度
 | 
				
			||||||
 | 
					    this.viewer = viewer;
 | 
				
			||||||
 | 
					    this.init();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  init() {
 | 
				
			||||||
 | 
					    this.snowStage = new Cesium.PostProcessStage({
 | 
				
			||||||
 | 
					      name: "czm_snow",
 | 
				
			||||||
 | 
					      fragmentShader: this.snow(),
 | 
				
			||||||
 | 
					      uniforms: {
 | 
				
			||||||
 | 
					        snowSize: () => {
 | 
				
			||||||
 | 
					          return this.snowSize;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        snowSpeed: () => {
 | 
				
			||||||
 | 
					          return this.snowSpeed;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    this.viewer.scene.postProcessStages.add(this.snowStage);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  destroy() {
 | 
				
			||||||
 | 
					    if (!this.viewer || !this.snowStage) return;
 | 
				
			||||||
 | 
					    this.viewer.scene.postProcessStages.remove(this.snowStage);
 | 
				
			||||||
 | 
					    const isDestroyed = this.snowStage.isDestroyed();
 | 
				
			||||||
 | 
					    // 先检查是否被销毁过,如果已经被销毁过再调用destroy会报错
 | 
				
			||||||
 | 
					    if (!isDestroyed) {
 | 
				
			||||||
 | 
					      this.snowStage.destroy();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    delete this.snowSize;
 | 
				
			||||||
 | 
					    delete this.snowSpeed;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  show(visible) {
 | 
				
			||||||
 | 
					    this.snowStage.enabled = visible;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  snow() {
 | 
				
			||||||
 | 
					    return "uniform sampler2D colorTexture;\n\
 | 
				
			||||||
 | 
					          in vec2 v_textureCoordinates;\n\
 | 
				
			||||||
 | 
					          uniform float snowSpeed;\n\
 | 
				
			||||||
 | 
					                  uniform float snowSize;\n\
 | 
				
			||||||
 | 
					          float snow(vec2 uv,float scale)\n\
 | 
				
			||||||
 | 
					          {\n\
 | 
				
			||||||
 | 
					              float time=czm_frameNumber/snowSpeed;\n\
 | 
				
			||||||
 | 
					              float w=smoothstep(1.,0.,-uv.y*(scale/10.));if(w<.1)return 0.;\n\
 | 
				
			||||||
 | 
					              uv+=time/scale;uv.y+=time*2./scale;uv.x+=sin(uv.y+time*.5)/scale;\n\
 | 
				
			||||||
 | 
					              uv*=scale;vec2 s=floor(uv),f=fract(uv),p;float k=3.,d;\n\
 | 
				
			||||||
 | 
					              p=.5+.35*sin(11.*fract(sin((s+p+scale)*mat2(7,3,6,5))*5.))-f;d=length(p);k=min(d,k);\n\
 | 
				
			||||||
 | 
					              k=smoothstep(0.,k,sin(f.x+f.y)*snowSize);\n\
 | 
				
			||||||
 | 
					              return k*w;\n\
 | 
				
			||||||
 | 
					          }\n\
 | 
				
			||||||
 | 
					          out vec4 fragColor;\n\
 | 
				
			||||||
 | 
					          void main(void){\n\
 | 
				
			||||||
 | 
					              vec2 resolution=czm_viewport.zw;\n\
 | 
				
			||||||
 | 
					              vec2 uv=(gl_FragCoord.xy*2.-resolution.xy)/min(resolution.x,resolution.y);\n\
 | 
				
			||||||
 | 
					              vec3 finalColor=vec3(0);\n\
 | 
				
			||||||
 | 
					              //float c=smoothstep(1.,0.3,clamp(uv.y*.3+.8,0.,.75));\n\
 | 
				
			||||||
 | 
					              float c=0.;\n\
 | 
				
			||||||
 | 
					              c+=snow(uv,30.)*.0;\n\
 | 
				
			||||||
 | 
					              c+=snow(uv,20.)*.0;\n\
 | 
				
			||||||
 | 
					              c+=snow(uv,15.)*.0;\n\
 | 
				
			||||||
 | 
					              c+=snow(uv,10.);\n\
 | 
				
			||||||
 | 
					              c+=snow(uv,8.);\n\
 | 
				
			||||||
 | 
					              c+=snow(uv,6.);\n\
 | 
				
			||||||
 | 
					              c+=snow(uv,5.);\n\
 | 
				
			||||||
 | 
					              finalColor=(vec3(c));\n\
 | 
				
			||||||
 | 
					              fragColor=mix(texture(colorTexture,v_textureCoordinates),vec4(finalColor,1),.5);\n\
 | 
				
			||||||
 | 
					              }\n\
 | 
				
			||||||
 | 
					              ";
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					export default SnowEffect;
 | 
				
			||||||
| 
						 | 
					@ -46,6 +46,7 @@ import * as Cesium from 'cesium';
 | 
				
			||||||
import { useDrawTool } from '@/components/CesiumMap/mixins/useDrawTool';
 | 
					import { useDrawTool } from '@/components/CesiumMap/mixins/useDrawTool';
 | 
				
			||||||
import { useEventBus } from '@/components/CesiumMap/mixins/useEventBus';
 | 
					import { useEventBus } from '@/components/CesiumMap/mixins/useEventBus';
 | 
				
			||||||
import { useMeasureTool } from '@/components/CesiumMap/mixins/useMeasureTool';
 | 
					import { useMeasureTool } from '@/components/CesiumMap/mixins/useMeasureTool';
 | 
				
			||||||
 | 
					import { useWeatherParticle } from '@/components/CesiumMap/mixins/useWeatherParticle';
 | 
				
			||||||
import { 
 | 
					import { 
 | 
				
			||||||
  drawLocation,
 | 
					  drawLocation,
 | 
				
			||||||
	drawPolyline,
 | 
						drawPolyline,
 | 
				
			||||||
| 
						 | 
					@ -100,6 +101,11 @@ import toolbarWarehouseIcon from '@/assets/icons/toolbar_warehouse.png';
 | 
				
			||||||
import toolbarWatersourceIcon from '@/assets/icons/toolbar_watersource.png';
 | 
					import toolbarWatersourceIcon from '@/assets/icons/toolbar_watersource.png';
 | 
				
			||||||
import toolbarRoadIcon from '@/assets/icons/toolbar_road.png';
 | 
					import toolbarRoadIcon from '@/assets/icons/toolbar_road.png';
 | 
				
			||||||
import toolbarKeyareaIcon from '@/assets/icons/toolbar_keyarea.png';
 | 
					import toolbarKeyareaIcon from '@/assets/icons/toolbar_keyarea.png';
 | 
				
			||||||
 | 
					// 气象效果图标
 | 
				
			||||||
 | 
					import toolbarSunnyIcon from '@/assets/icons/toolbar_sunny.png';
 | 
				
			||||||
 | 
					import toolbarRainIcon from '@/assets/icons/toolbar_rain.png';
 | 
				
			||||||
 | 
					import toolbarSnowIcon from '@/assets/icons/toolbar_snow.png';
 | 
				
			||||||
 | 
					import toolbarFogIcon from '@/assets/icons/toolbar_fog.png';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const props = defineProps({
 | 
					const props = defineProps({
 | 
				
			||||||
  viewer: {
 | 
					  viewer: {
 | 
				
			||||||
| 
						 | 
					@ -111,6 +117,7 @@ const props = defineProps({
 | 
				
			||||||
let viewer = null
 | 
					let viewer = null
 | 
				
			||||||
let drawTool = null
 | 
					let drawTool = null
 | 
				
			||||||
let measureTool = null
 | 
					let measureTool = null
 | 
				
			||||||
 | 
					let weatherParticle = null
 | 
				
			||||||
let bus = null
 | 
					let bus = null
 | 
				
			||||||
let toolbarLayer = null
 | 
					let toolbarLayer = null
 | 
				
			||||||
let primitiveList = []
 | 
					let primitiveList = []
 | 
				
			||||||
| 
						 | 
					@ -242,6 +249,32 @@ const options = ref([
 | 
				
			||||||
    id: 3,
 | 
					    id: 3,
 | 
				
			||||||
    icon: weatherIcon,
 | 
					    icon: weatherIcon,
 | 
				
			||||||
    label: '气象效果',
 | 
					    label: '气象效果',
 | 
				
			||||||
 | 
					    subtools: [ 
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 31,
 | 
				
			||||||
 | 
					        name: 'sunny',
 | 
				
			||||||
 | 
					        label: '晴天',
 | 
				
			||||||
 | 
					        icon: toolbarSunnyIcon
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 32,
 | 
				
			||||||
 | 
					        name: 'rain',
 | 
				
			||||||
 | 
					        label: '下雨',
 | 
				
			||||||
 | 
					        icon: toolbarRainIcon
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 33,
 | 
				
			||||||
 | 
					        name: 'snow',
 | 
				
			||||||
 | 
					        label: '下雪',
 | 
				
			||||||
 | 
					        icon: toolbarSnowIcon
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 34,
 | 
				
			||||||
 | 
					        name: 'fog',
 | 
				
			||||||
 | 
					        label: '起雾',
 | 
				
			||||||
 | 
					        icon: toolbarFogIcon
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    id: 4,
 | 
					    id: 4,
 | 
				
			||||||
| 
						 | 
					@ -288,7 +321,7 @@ watch(() => props.viewer, (v) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    drawTool = useDrawTool(viewer);
 | 
					    drawTool = useDrawTool(viewer);
 | 
				
			||||||
    measureTool = useMeasureTool(viewer);
 | 
					    measureTool = useMeasureTool(viewer);
 | 
				
			||||||
    // 绑定事件
 | 
					    // 绘制、测量事件参数
 | 
				
			||||||
    params = {
 | 
					    params = {
 | 
				
			||||||
      drawTool,
 | 
					      drawTool,
 | 
				
			||||||
      measureTool,
 | 
					      measureTool,
 | 
				
			||||||
| 
						 | 
					@ -296,6 +329,11 @@ watch(() => props.viewer, (v) => {
 | 
				
			||||||
      toolbarLayer,
 | 
					      toolbarLayer,
 | 
				
			||||||
      primitiveList,
 | 
					      primitiveList,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 气象效果
 | 
				
			||||||
 | 
					    weatherParticle = useWeatherParticle(viewer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 绑定事件
 | 
				
			||||||
    bus = useEventBus(viewer);
 | 
					    bus = useEventBus(viewer);
 | 
				
			||||||
    // 基础绘制部分
 | 
					    // 基础绘制部分
 | 
				
			||||||
    bus.on('toolbar_location', drawLocation);
 | 
					    bus.on('toolbar_location', drawLocation);
 | 
				
			||||||
| 
						 | 
					@ -320,6 +358,11 @@ watch(() => props.viewer, (v) => {
 | 
				
			||||||
    bus.on('toolbar_warehouse', drawWarehouse);
 | 
					    bus.on('toolbar_warehouse', drawWarehouse);
 | 
				
			||||||
    bus.on('toolbar_road', drawRoad);
 | 
					    bus.on('toolbar_road', drawRoad);
 | 
				
			||||||
    bus.on('toolbar_keyarea', drawKeyarea);
 | 
					    bus.on('toolbar_keyarea', drawKeyarea);
 | 
				
			||||||
 | 
					    // 气象效果部分
 | 
				
			||||||
 | 
					    bus.on('toolbar_sunny', () => weatherParticle && weatherParticle.destroy())
 | 
				
			||||||
 | 
					    bus.on('toolbar_rain', () => weatherParticle && weatherParticle.rain())
 | 
				
			||||||
 | 
					    bus.on('toolbar_snow', () => weatherParticle && weatherParticle.snow())
 | 
				
			||||||
 | 
					    bus.on('toolbar_fog', () => weatherParticle && weatherParticle.fog())
 | 
				
			||||||
    // 清空
 | 
					    // 清空
 | 
				
			||||||
    bus.on('toolbar_clear', toolbarClear);
 | 
					    bus.on('toolbar_clear', toolbarClear);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,7 @@
 | 
				
			||||||
import { shallowRef } from 'vue';
 | 
					import { shallowRef } from 'vue';
 | 
				
			||||||
import * as Cesium from 'cesium';
 | 
					import * as Cesium from 'cesium';
 | 
				
			||||||
import CesiumMap from '@/components/CesiumMap/index.vue';
 | 
					import CesiumMap from '@/components/CesiumMap/index.vue';
 | 
				
			||||||
import { useEventBus } from '@/components/CesiumMap/mixins/useEventBus';
 | 
					import { useEventBus, ScreenMode } from '@/components/CesiumMap/mixins/useEventBus';
 | 
				
			||||||
import Toolbar from './Toolbar';
 | 
					import Toolbar from './Toolbar';
 | 
				
			||||||
import DialogPropertyGrid from './DialogPropertyGrid';
 | 
					import DialogPropertyGrid from './DialogPropertyGrid';
 | 
				
			||||||
import { setPropertyData } from './DialogPropertyGrid/property';
 | 
					import { setPropertyData } from './DialogPropertyGrid/property';
 | 
				
			||||||
| 
						 | 
					@ -38,10 +38,7 @@ const initMap = (v) => {
 | 
				
			||||||
  console.log('地图已初始化', v);
 | 
					  console.log('地图已初始化', v);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const bus = useEventBus(viewerRef.value)
 | 
					  const bus = useEventBus(viewerRef.value)
 | 
				
			||||||
  // bus.on('hoverTest', ({ screenPosition }) => {
 | 
					  // view 模式下,点击地图要素显示属性编辑弹窗
 | 
				
			||||||
  //   console.log('hoverTest 事件触发屏幕位置:', screenPosition);
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
  // });
 | 
					 | 
				
			||||||
  bus.onScreen(Cesium.ScreenSpaceEventType.LEFT_CLICK, ({ position }) => {
 | 
					  bus.onScreen(Cesium.ScreenSpaceEventType.LEFT_CLICK, ({ position }) => {
 | 
				
			||||||
    console.log('左键点击屏幕位置:', position);
 | 
					    console.log('左键点击屏幕位置:', position);
 | 
				
			||||||
    // 如果点击的是实体,则获取该实体的属性数据
 | 
					    // 如果点击的是实体,则获取该实体的属性数据
 | 
				
			||||||
| 
						 | 
					@ -71,7 +68,7 @@ const initMap = (v) => {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  })
 | 
					  }, ScreenMode.VIEW)
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue