117:vue+cesium 自定义绘制多边形

作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。

查看本专栏目录 - 本文是第: 117篇文章

一、示例效果图:

在这里插入图片描述

二、示例介绍

本示例在 Vue + cesium 项目中自定义绘制多边形。这里利用鼠标绘制,左键点击,一个点时候绘制一个点,两个点时候绘制一条线,三个点及以上绘制面。右键点击,去掉多边形。

三、配置说明

1)查看基础设置:https://xiaozhuanlan.com/topic/1374609285
或者同样查看:

### 实现 VueCesium 中的可编辑图形标绘功能 在 VueCesium 的组合中实现可编辑的图形标绘功能,可以通过以下方式完成。以下是详细的实现方法和代码示例。 #### 1. **初始化 Cesium 并与 Vue 集成** 在 Vue 项目中集成 Cesium,首先需要确保正确加载 Cesium 的 JavaScript 文件和 CSS 样式文件。可以使用 `vue-cli` 创建的项目,并通过 npm 安装 Cesium[^2]。 ```bash npm install cesium ``` 在 Vue 组件中引入 Cesium: ```javascript import * as Cesium from 'cesium'; import 'cesium/Build/Cesium/Widgets/widgets.css'; ``` #### 2. **创建标绘工具类** 为了实现可编辑的图形标绘功能,可以创建一个标绘工具类,用于管理标绘点、线、面等元素的添加、删除和编辑操作。 ```javascript class DrawingTool { constructor(viewer) { this.viewer = viewer; this.handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas); this.primitives = []; this.isDrawing = false; } startDraw(type) { this.isDrawing = true; this.handler.setInputAction((event) => { const cartesian = this.viewer.camera.pickEllipsoid(event.position, this.viewer.scene.globe.ellipsoid); if (cartesian) { this.primitives.push(cartesian); this.updatePrimitive(type); } }, Cesium.ScreenSpaceEventType.LEFT_CLICK); this.handler.setInputAction(() => { this.isDrawing = false; this.handler.destroy(); }, Cesium.ScreenSpaceEventType.RIGHT_CLICK); } updatePrimitive(type) { if (this.primitives.length < 2) return; this.viewer.entities.removeAll(); switch (type) { case 'point': this.primitives.forEach((pos) => { this.viewer.entities.add({ position: pos, point: { pixelSize: 10, color: Cesium.Color.RED, }, }); }); break; case 'line': this.viewer.entities.add({ polyline: { positions: this.primitives, width: 5, material: Cesium.Color.BLUE, }, }); break; case 'polygon': this.viewer.entities.add({ polygon: { hierarchy: this.primitives, material: Cesium.Color.GREEN.withAlpha(0.5), }, }); break; } } } ``` #### 3. **在 Vue 组件中集成标绘工具** 在 Vue 组件中初始化 Cesium 视图,并调用标绘工具类进行图形标绘。 ```html <template> <div id="cesiumContainer" style="width: 100%; height: 100%;"></div> </template> <script> import * as Cesium from 'cesium'; import 'cesium/Build/Cesium/Widgets/widgets.css'; export default { data() { return { viewer: null, drawingTool: null, }; }, mounted() { this.initCesium(); }, methods: { initCesium() { Cesium.Ion.defaultAccessToken = 'your_cesium_token'; // 替换为你的 Cesium Ion Token this.viewer = new Cesium.Viewer('cesiumContainer', { terrainProvider: Cesium.createWorldTerrain(), }); this.drawingTool = new DrawingTool(this.viewer); this.startDrawing('polygon'); // 示例:开始绘制多边形 }, startDrawing(type) { this.drawingTool.startDraw(type); }, }, }; </script> ``` #### 4. **保存和加载标绘数据** 为了支持保存和加载标绘数据,可以将标绘实体序列化为 JSON 格式并存储到文件中。 ```javascript saveEntitiesToFile() { const entities = this.viewer.entities.values.map(entity => Cesium.Entity.serialize(entity)); const jsonContent = JSON.stringify(entities, null, 2); const blob = new Blob([jsonContent], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'entities.json'; a.click(); URL.revokeObjectURL(url); } loadEntitiesFromFile(file) { const reader = new FileReader(); reader.onload = (event) => { const entities = JSON.parse(event.target.result); entities.forEach(entityJson => { const entity = Cesium.Entity.deserialize(entityJson); this.viewer.entities.add(entity); }); }; reader.readAsText(file); } ``` #### 5. **支持实时同步和切换** 为了支持二三维视图的实时同步和一键切换,可以在 Vue 组件中监听视图变化事件,并更新标绘数据[^3]。 ```javascript this.viewer.scene.postRender.addEventListener(() => { // 更新标绘数据以保持同步 }); ``` --- ###
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是大剑师兰特

打赏一杯可口可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值