1.0.2 • Published 1 year ago
cesium-draw-js v1.0.2
基于 draw-helper1.6 封装的 cesium 绘制方法
绘制图形如下
基础图形如下图,坐标查询,空间距离,贴地距离和面积量算等实时计算功能不保存图形数据
使用如下
- 安装 cesium-draw-js 包
npm i cesium-draw-js
- 引入 tooltip 和 确认取消弹框
绘制时添加的操作提示需要在页面中添加如下 dom
<!-- 绘制时的提示框,内部样式自己定义 -->
<div id="mouse-tooltip" />
<!-- 绘制停止时的确认取消框,样式自己定义,确认和取消方法引用参考第7点 -->
<div id="drawPopConfirmLayer" />
- 引入 turf.min.js 文件
缓冲区和面积量算需要引入 turf.min.js 文件,如果不用到这两个绘制功能,不需要引入
<script
type="text/javascript"
src="/node_modules/cesium-draw-js/dist/turf.min.js"
></script>
- 引入绘制方法
以绘制折线为例,执行以下代码就可以在你的 cesium 地图上开始绘制你的线条了
import { DrawFunc } from 'cesium-draw-js';
import type { LineOptions } from 'cesium-draw-js';
const viewer: Viewer = undefined; // 自己的 cesium.viewer
const options: LineOptions = {}; // 参数配置,可以更改线条的宽度,材料等
const drawGraph = new DrawFunc.DrawGraphLine(viewer, options);
drawGraph.startDraw();
- 所有绘制方法的 options 参数
所有绘制方法 options 参数都有 3 个公共参数,分别为 layerId、dragIconLight 和 dragIcon
| | | options |
| ------------------------ | -------- | --------------------------------------------------------------------------------------------------- |
| DrawGraphPoint | 点 | |
| DrawGraphLine | 折线 | polylineWidth、material |
| DrawGraphCircle | 圆形 | material、radiusLineMaterial、fill、outline、outlineWidth、outlineColor、lineWidth、outlineMaterial |
| DrawGraphPolygon | 多边形 | material、outlineMaterial、fill、outlineWidth、outline |
| DrawGraphRectangle | 矩形 | material、outlineMaterial、fill、outlineWidth、outline |
| DrawGraphBuffer | 缓冲区 | material、lineMaterial、lineWidth、radius、line、fill |
| DrawGraphStraightArrow | 直线箭头 | material、outlineMaterial、fill、outlineWidth、outline |
| DrawGraphAttactArrow | 攻击箭头 | material、outlineMaterial、fill、outlineWidth、outline |
| DrawGraphPincerArrow | 钳击箭头 | material、outlineMaterial、fill、outlineWidth、outline |
| DrawGraphPosMeasure | 坐标查询 | |
| DrawGraphSpaceDisMeasure | 空间距离 | polylineWidth、material |
| DrawGraphStickDisMeasure | 贴地距离 | polylineWidth、material |
| DrawGraphAreaMeasure | 面积量算 | material、outlineMaterial、fill、outlineWidth、outline |
options 参数介绍
参数名 类型 描述 layerId string 识别参数,放到 entity 中跟其它非绘制 entity 做区分 dragIconLight string 鼠标点击处绘制的点的图片 dragIcon string 图形线条中心的点的图片 fill boolean 是否显示实体及其子项 outline boolean 指定图形是否带有轮廓 outlineWidth number 指定图形轮廓宽度属性 outlineColor Color 指定图形轮廓 Color 属性 extrudedHeight number 指定多边形的拉伸面相对于椭圆体表面的高度 polylineWidth string 单纯线条图形的线条宽度 radius string 缓冲区半径 line boolean 是否显示线条 lineWidth string 普通线条宽度 绘制方法的内部执行方法
DrawGraphBuffer 由于需要支持实时设置缓存区半径参数,所以添加了 dialogVisible 和 saveConfig 两个方法,如果不想实时更改缓冲区半径,可以将 dialogVisible 自定义为 DrawGraphBuffer 中的 saveConfig
描述 options startDraw 开始绘制 reEnterModify 重新进入编辑 drawOldData 取消修改,绘制修改前数据并清除所有监听 clearDrawing 清除绘制数据并清除所有监听 saveDraw 保存绘制的图形,返回保存的数据并清除所有监听 dialogVisible DrawGraphBuffer 特有,右键结束绘制时调用,需要自定义方法,主要是希望打开一个 dialog 支持输入缓存区半径 saveConfig DrawGraphBuffer 特有,右键结束绘制时需要填入缓存区半径,保存缓冲区半径后调用 saveConfig 并结束绘制 radius clearHandler 清除所有 handler 监听 clear 清除所有绘制相关
编辑和删除
编辑和删除通过暴露的方法就可以实现,根据个人情况开发,可以参考下面的写法
/**
* let layerId = 'xxx' //你自己设定的layerId
* let viewer = new Viewer() // viewer 是你的 cesium 上的 viewer 应用
* let drawGraph = new DrawGraphLine(viewer,{}) // drawGraph 是你的绘制 class
*/
// 给绘制的图形绑定点击事件
function bindGloveEvent() {
handler = new ScreenSpaceEventHandler(viewer.scene.canvas)
handler.setInputAction((movement: any) => {
const pick = viewer.scene.pick(movement.position)
if (defined(pick)) {
const obj = pick?.id
if (!obj || !obj.layerId || flag.value === OPERATE_STATUS.NONE)
return
if (flag.value === OPERATE_STATUS.EDIT) // 编辑状态
enterDrawEditing(obj.timeStampId, obj.drawType)
else if (flag.value === OPERATE_STATUS.DELETE) // 删除状态
clearEntityById(obj.timeStampId)
}
}, ScreenSpaceEventType.LEFT_CLICK)
}
function clearEntityById(timeStampId: number) {
const entityList = viewer.entities.values
if (!entityList || entityList.length < 1)
return
for (let i = 0; i < entityList.length; i++) {
const entity: DrawEntity = entityList[i]
if (entity.layerId === layerId && entity.timeStampId === timeStampId) {
viewer.entities.remove(entity)
i--
}
}
}
function enterDrawEditing(timeStampId: number, drawType: string) {
// 先移除entity
clearEntityById(timeStampId)
drawGraph?.reEnterModify(drawedShape[timeStampId], timeStampId)
}