Cesium 自定义Primitive-绘制圆

一、创作来源

        1、cesium的entity绘制圆

        2、不使用entity的情况下,使用自定义的primitive来动态绘制圆

        3、结合上一篇文章的圆,执行动态圆的更新

二、编写步骤

1、创建绘制线的类

        包括构造函数、绘图函数以及销毁函数

        

import { Viewer, ScreenSpaceEventHandler, ScreenSpaceEventType } from "cesium";
import { pickPosition } from "@/components/MilitaryPlot/utils/PlotUtils";
import CustomPolylinePrimitive from "@/components/entity/CustomPolylinePrimitive";
import CustomCirclePrimitive from "@/components/samples/CustomCirclePrimitive";
export default class DrawCircleTool {/*** 构造函数* @param {Viewer} viewer*/constructor(viewer) {/*** 地球视图* @type {Viewer}* @private*/this._viewer = viewer;/*** 线对象* @type {CustomCirclePrimitive}* @private*/this._primitive = undefined;/*** 事件* @type {ScreenSpaceEventHandler}* @private*/this._handler = undefined;}/*** 绘图*/draw() {}/*** 销毁*/destroy() {if (this._handler) {this._handler.isDestroyed() && this._handler.destroy();this._handler = null;}}
}

2、事件确认

        鼠标点击事件、移动事件

        

/*** 绘图*/draw() {this._handler = new ScreenSpaceEventHandler(this._viewer.canvas);let positions = [];let flag = this;this._handler.setInputAction((event) => {console.log("左键单机事件");}, ScreenSpaceEventType.LEFT_CLICK);this._handler.setInputAction((event) => {console.log("鼠标移动事件");}, ScreenSpaceEventType.MOUSE_MOVE);}

3、点位变动逻辑

        =>初始为空的数组

        =>点击后当为空时直接push,当有两个点时,结束编辑

        =>移动:当只有一个点时直接push,当点位数大于1的时候,先移除后push

4、代码实现

        1、屏幕坐标转地球坐标

/*** 获取地图点位* @param {Cartesian2} screenPosition 屏幕坐标* @param {Viewer} viewer 地图* @returns {Cartesian3} 地图三维坐标*/
export const pickPosition = (screenPosition, viewer) => {let ray = viewer.camera.getPickRay(screenPosition);return viewer.scene.globe.pick(ray, viewer.scene);
};

        2、鼠标事件代码

/*** 绘图*/draw() {this._handler = new ScreenSpaceEventHandler(this._viewer.canvas);let positions = [];let flag = this;this._handler.setInputAction((event) => {console.log("左键单机事件");let position = pickPosition(event.position, flag._viewer);if (position) {if (positions.length === 0) {positions.push(position);} else {positions.pop();positions.push(position);}}}, ScreenSpaceEventType.LEFT_CLICK);this._handler.setInputAction((event) => {console.log("鼠标移动事件");let position = pickPosition(event.endPosition, flag._viewer);if (position) {if (positions.length === 1) {positions.push(position);} else if (positions.length > 1) {positions.pop();positions.push(position);}}}, ScreenSpaceEventType.MOUSE_MOVE);}

          3、渲染线代码

/*** 绘图*/draw() {this._handler = new ScreenSpaceEventHandler(this._viewer.canvas);let positions = [];let flag = this;this._handler.setInputAction((event) => {console.log("左键单机事件");let position = pickPosition(event.position, flag._viewer);if (position) {if (positions.length === 0) {positions.push(position);flag._primitive = new CustomCirclePrimitive({});this._viewer.scene.primitives.add(this._primitive);} else {positions.pop();positions.push(position);flag._primitive.updateProperty({positions: [...positions],complete: false,});this._primitive = undefined;positions = [];}}}, ScreenSpaceEventType.LEFT_CLICK);this._handler.setInputAction((event) => {console.log("鼠标移动事件");let position = pickPosition(event.endPosition, flag._viewer);if (position) {if (positions.length === 1) {positions.push(position);} else if (positions.length > 1) {positions.pop();positions.push(position);}if (flag._primitive) {flag._primitive.updateProperty({positions: [...positions],complete: false,});}}}, ScreenSpaceEventType.MOUSE_MOVE);}

         4、测试

let tool = new DrawCircleTool(viewer);
tool.draw();

三、实现效果

四、代码

import { Viewer, ScreenSpaceEventHandler, ScreenSpaceEventType } from "cesium";
import { pickPosition } from "@/components/MilitaryPlot/utils/PlotUtils";
import CustomPolylinePrimitive from "@/components/entity/CustomPolylinePrimitive";
import CustomCirclePrimitive from "@/components/samples/CustomCirclePrimitive";
export default class DrawCircleTool {/*** 构造函数* @param {Viewer} viewer*/constructor(viewer) {/*** 地球视图* @type {Viewer}* @private*/this._viewer = viewer;/*** 线对象* @type {CustomCirclePrimitive}* @private*/this._primitive = undefined;/*** 事件* @type {ScreenSpaceEventHandler}* @private*/this._handler = undefined;}/*** 绘图*/draw() {this._handler = new ScreenSpaceEventHandler(this._viewer.canvas);let positions = [];let flag = this;this._handler.setInputAction((event) => {console.log("左键单机事件");let position = pickPosition(event.position, flag._viewer);if (position) {if (positions.length === 0) {positions.push(position);flag._primitive = new CustomCirclePrimitive({});this._viewer.scene.primitives.add(this._primitive);} else {positions.pop();positions.push(position);flag._primitive.updateProperty({positions: [...positions],complete: false,});this._primitive = undefined;positions = [];}}}, ScreenSpaceEventType.LEFT_CLICK);this._handler.setInputAction((event) => {console.log("鼠标移动事件");let position = pickPosition(event.endPosition, flag._viewer);if (position) {if (positions.length === 1) {positions.push(position);} else if (positions.length > 1) {positions.pop();positions.push(position);}if (flag._primitive) {flag._primitive.updateProperty({positions: [...positions],complete: false,});}}}, ScreenSpaceEventType.MOUSE_MOVE);}/*** 销毁*/destroy() {if (this._handler) {this._handler.isDestroyed() && this._handler.destroy();this._handler = null;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker-compose启动postgres数据库,实现主从备份

文章目录 1. 主库2. 从库3. 测试 1. 主库 创建pg-m 目录,并进入该目录创建docker-compose.yml文件,内容如下: version: "3.1" services:pg_master:image: postgres:15.3container_name: pg_masterenvironment:POSTGRES_PASSWORD:…

Domain Adaptation Vs. Prompt-Tuning:能否用域自适应解决大模型提示学习问题?

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 作者简介 李江梦,中国科学院软件研究所天基综合信息系统全国重点实验室助理研究员 论文简介 今天介绍的是被机器学习领域顶级学术会议ICLR 2024接收的论文:BayesPrompt: Prompting Large…

广东Lenovo SR588服务器维修升级硬盘内存

本案例描述了对联想SR588服务器进行硬件升级的过程,包括更换固态硬盘作为系统盘,以及增加内存容量至128GB。升级后,服务器性能得到显著提升,同时通过重新配置RAID阵列和操作系统的重新安装,确保了系统的稳定性和数据的…

STM32 NAND FLASH知识点

1.NAND FLASH的简介 NAND FLASH 的概念是由东芝公司在 1989 年率先提出,它内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。 NAND FLASH 存储器具有容量较大,改写速度快等优点,适用于大量数据的存储&…

MySQL EXPLAIN 性能分析工具详解

EXPLAIN 是 MySQL 中一个非常重要的性能分析工具,它用于显示 MySQL 如何执行 SQL 查询。通过 EXPLAIN,你可以查看查询的执行计划,从而理解查询是如何被优化和执行的,从而找出可能的性能瓶颈。 如何使用 EXPLAIN 使用 EXPLAIN 非…

CC++语言强制类型转换的类型

介绍 在C语言中,可以使用强制类型转换(也称为显式类型转换)来改变一个变量的类型。这通常在你需要将一个类型的值转换为不兼容的另一种类型时非常有用。 强制类型转换的语法如下: (type_name) expression其中,type_…

Unix Network Programming Episode 88

‘inetd’ Daemon On a typical Unix system, there could be many servers in existence, just waiting for a client request to arrive. Examples are FTP, Telnet, Rlogin, TFTP, and so on. With systems before 4.3BSD, each of these services had a process associate…

如何利用Flutter来写后端 服务端应用

前言 Flutter是谷歌推出的一款跨平台开发框架,现在属于此领域star最多的框架,其被广泛应用于构建前台界面,但或许很少人知道,他也可以写后端应用。 本文主角 flutter非常著名的getx库推出的get server jonataslaw/get_server:…

实验01-STP+链路聚合+VRRP实验

1.实验拓扑 2 实验需求 根据拓扑图配置IP地址。交换机之间通过STP防环为了防止SW2-SW3之间聚合的高效链路被STP 阻塞,请配置SW2 为网络中的主根,SW3为网络中的备份根桥。通过VRRP实现网关冗余,网关在SW2和SW3上,其中VLAN10的网关…

【3GPP】【核心网】【5G】5G核心网协议解析(一)(超详细)

1. 5G核心网概念 5G核心网是支撑5G移动通信系统的关键组成部分,是实现5G移动通信的重要基础设施,它负责管理和控制移动网络中的各种功能和服务。它提供了丰富的功能和服务,支持高速、低时延、高可靠性的通信体验,并为不同行业和应…

前端监控为什么采用GIF图片做埋点?

一、什么是埋点监控 前端监控是开发人员用来跟踪和维护应用程序表现层的运行状况的过程和工具。它主要包括三种类型:数据监控、性能监控和异常监控。 1、数据监控 主要是为了收集跟用户相关的数据,例如用户设备类型、浏览器版本、页面浏览量(…

GIS之深度学习05:VisualStudio安装教程

在安装CUDA前,建议先安装VisualStudio,以防报错 VisualStudio安装步骤简单,但时间较长。。。。。。 正文开始: VisualStudio官网:Visual Studio: IDE and Code Editor for Software Developers and Teams 点击右上角…

XUbuntu22.04之解决:仓库xxx没有数字签名问题(二百一十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Gitlab: PHP项目CI/CD实践

目录 1 说明 2 CI/CD 2.1 部署方式一:增量部署 2.1.1 目标服务器准备 2.2.2 Gitlab及Envoy脚本 2.2 部署方式二:镜像构建与部署 2.2.1 推送到私有化容器仓库 准备工作 脚本 要点 2.2.2 推送到hub.docker.com 准备工作 脚本 3 参考&#x…

1905_ARMv7-M的堆栈寄存器

1905_ARMv7-M的堆栈寄存器 全部学习汇总: g_arm_cores: ARM内核的学习笔记 (gitee.com) ARMv7-M实现了2种堆栈,分别是MSP和PSP。复位的时候默认是MSP,而当前是哪种可以通过CONTROL.SPSEL寄存器的bit来查看。 SP寄存器的最低2bit,S…

⭐每天一道leetcode:27.移除元素(简单;vector)

⭐今日份题目 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…

大模型基础应用框架(ReACT\SFT\RAG)创新及零售业务落地

如何将大语言模型的强大能力融入实际业务、产生业务价值,是现在很多公司关注的焦点。在零售场,大模型应用也面临很多挑战。本文分享了京东零售技数中心推出融合Agent、SFT与RAG的大模型基础应用框架,帮助业务完成大模型微调、部署和应用&…

SpringMVC之DispatcherServlet组件

目录 一、SpringMVC的核心处理流程二、DispatcherServlet1、init()方法2、doDispatch()方法3、AbstractAnnotationConfigDispatcherServletInitializer类 一、SpringMVC的核心处理流程 请求到达 DispatcherServlet DispatcherServlet 的请求处理: DispatcherServlet…

Linux 安装k8s

官网 常见的三种安装k8s方式 1.kubeadm 2.kops:自动化集群制备工具 3.kubespray: 提供了 Ansible Playbook 下面以kubeadm安装k8s kubeadm的安装是通过使用动态链接的二进制文件完成的,目标系统需要提供 glibc ##使用 ss 或者 netstat 检测端…

搞流量,就这点事!

资产还是负债?赚钱之前想明白! 如果说你有一个产品,大概率的情况是,如果产品被更多人看到,那么最终购买的人也会多一些。结果就是,你的利润更多。所以,在产品没问题的情况下,流量越多…