Cesium 绘制可编辑点

news2024/9/23 8:09:19

Cesium Point点

实现可编辑的pointEntity 实体
在这里插入图片描述


文章目录

  • Cesium Point点
  • 前言
  • 一、使用步骤
  • 二、使用方法
  • 二、具体实现
    • 1. 开始绘制
    • 2.绘制事件监听
  • 三、 完整代码


前言

支持 鼠标按下 拖动修改点,释放修改完成。


一、使用步骤

1、点击 按钮 开始 绘制,单击地图 绘制完成
2、编辑状态下(hasEdit = true)拖动修改位置,释放完成修改。
2、传入 hasEdit:true 绘制完成后自动激活编辑。默认为false
3、可以取消编辑、激活编辑

二、使用方法

引入

import Point from "@/utils/cesium/point";

const point = new Point(map)

  point.startDraw({
    // hasEdit: true,
    style: {
      pixelSize: 10,
      color: Cesium.Color.RED,
      outlineColor: Cesium.Color.WHITE,
      outlineWidth: 2,
    }
  })
// 编辑状态控制
 point.hasEdit = [boolean]

二、具体实现

主要是对 ccesium 事件监听的灵活使用

1. 开始绘制

代码如下(示例):

  startDraw(options: PolylineOptions) {
    this.clear();

    this.style = options.style;

    if (options.hasEdit) {
      this.enableEdit = options.hasEdit;
    }

    if (!this.handler) {
      this.handler = new Cesium.ScreenSpaceEventHandler(
        this.viewer.scene.canvas
      );
    }

    // @ts-ignore
    this.viewer._container.style.cursor = "crosshair"; //修改鼠标样式 ,精确选择

    this.addEventListener();
  }

2.绘制事件监听

    //鼠标 左键点击
    this.handler.setInputAction((e) => {
      const target = this.viewer.scene.pick(e.position);

      // && target.collection
      if (target && this.enableEdit && this.drawEnd) {
        this.addEditEventListen(e);
        return;
      }

      // 非编辑状态
      if (!this.editState && !this.drawEnd) {
        const point: any = this.viewer.scene.pickPosition(e.position);
        this.polylinePostions.push(point);

        // 默认开启编辑 显示编辑点
        if (this.enableEdit) {
          const editPoints: any = this.creatPoint(point);
          this.pointList.push(editPoints);
        }

        if (this.polylinePostions.length === 1) {
          this.drawPolyline();
        }
      }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);

    // 鼠标移动
    this.handler.setInputAction((e: any) => {
      if (!this.drawEntity) {
        return;
      }

      const position = this.viewer.scene.pickPosition(e.endPosition); //结束点

      this.tempPositions = this.polylinePostions.concat([position]);

      // 显示绘制提示
      const screenPosition =
        this.viewer.scene.cartesianToCanvasCoordinates(position);
      this.utils.bindWindowDom(screenPosition);
    }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

    //双击绘制完成
    this.handler.setInputAction((e: any) => {
      const tempPositions = this.tempPositions.slice(
        0,
        this.polylinePostions.length
      );

      this.drawEntity.polyline.positions = new Cesium.CallbackProperty((e) => {
        return tempPositions;
      }, false);

      this.drawEnd = true;

      if (this.enableEdit && this.drawEnd) {
        this.addEditEventListen();
        this.selectEntity = this.drawEntity;
      }

      this.removeEventListener(); // 绘制结束
    }, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);

3、编辑事件监听。

    // 显示编辑点
    if (this.enableEdit && event) {
      this.viewer.scene.screenSpaceCameraController.enableRotate = false; //锁定相机
      this.showEditPoint(event);
      this.editState = true;
    }

    this.handler.setInputAction((e: any) => {
      const target = this.viewer.scene.pick(e.position);

      if (!target) {
        this.closeEdit(); //点击其它位置 取消编辑
      }

      // 选中 编辑的点
      if (target && target.collection) {
        this.viewer.scene.screenSpaceCameraController.enableRotate = false; //固定相机

        this.editPoint = this.viewer.entities.getById(target.id.id);
        const position: any = this.editPoint?.position.getValue();

        this.index = this.polylinePostions.findIndex(
          //找出要编辑点 在 polyline的位置
          (item: Cesium.Cartesian3) =>
            item.x === position.x &&
            item.y === position.y &&
            position.z === item.z
        );

        this.addMouseMoveEvent(); //开启鼠标移动事件监听
      }
    }, Cesium.ScreenSpaceEventType.LEFT_DOWN);

    // 鼠标 左键松开 完成编辑
    this.handler.setInputAction((e: any) => {
      this.viewer.scene.screenSpaceCameraController.enableRotate = true; //解锁相机移动
      this.handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE); //移除鼠标移动监听
      this.utils.destoryTip();
    }, Cesium.ScreenSpaceEventType.LEFT_UP);

三、 完整代码

import * as Cesium from "cesium";

interface PointOptions {
  hasEdit?: boolean;
  style: Cesium.PointGraphics.ConstructorOptions;
}

export default class Point {
  private viewer: Cesium.Viewer;
  private hander: Cesium.ScreenSpaceEventHandler | any;
  
  private isEdit: boolean = false; //是否编辑
  private isEditing: boolean = false; // 是否正处于编辑状态下
  private drawEnd: boolean = false; // 是否绘制完成
  private editPoint: Cesium.PointGraphics | undefined; // 正在编辑的点矢量对象
  private isStart: boolean = false; // 是否开始编辑
  private utils = new Utils(); // 工具类
  private style: Cesium.PointGraphics.ConstructorOptions = {}; // 点矢量样式

  constructor(viewer: Cesium.Viewer) {
    this.viewer = viewer;
  }

  set hasEdit(enable: boolean) {
    this.isEdit = enable;
    if (this.isEdit) {
      this.addEditMouseEvent();
    } else {
      this.removeEditMouseEvent();
    }
  }

  startDraw(options: PointOptions) {
    this.style = options.style;

    if (!this.hander) {
      this.hander = new Cesium.ScreenSpaceEventHandler(
        this.viewer.scene.canvas
      );
    }

    if (options?.hasEdit) {
      this.isEdit = options.hasEdit;
    }

    this.drawEnd = false;
    // @ts-ignore
    this.viewer._container.style.cursor = "crosshair"; //修改鼠标样式 ,精确选择

    this.hander.setInputAction((e) => {
      this.viewer.scene.screenSpaceCameraController.enableRotate = true; //锁定相机
      // @ts-ignore
      this.viewer._container.style.cursor = "auto"; //修改鼠标样式 ,精确选择

      if (!this.isEdit) {
        this.hander.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
      }

      if (this.isStart) {
        this.isStart = false;
        this.editPoint = undefined;
      }
    }, Cesium.ScreenSpaceEventType.LEFT_UP);

    this.hander.setInputAction((e) => {
      const postion = this.viewer.scene.pickPosition(e.position);

      if (this.isEdit && this.drawEnd) {
        this.isEditing = false;
        return;
      }

      this.creatPoint(postion);
      this.drawEnd = true; //绘制完成

      if (this.isEdit && !this.isEditing && this.drawEnd) {
        // 创建鼠标 按下 鼠标移动 事件
        this.addEditMouseEvent();
        this.isEditing = true;
      }
    }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  }

  private addEditMouseEvent() {
    this.hander.setInputAction((e) => {
      const target = this.viewer.scene.pick(e.position);
      if (target) {
        this.editPoint = this.viewer.entities.getById(target.id.id);
        this.viewer.scene.screenSpaceCameraController.enableRotate = false; //锁定相机
        this.isStart = true; //开始编辑
      }
    }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
    this.mouseMoveEventLinsten();
  }

  private mouseMoveEventLinsten() {
    this.hander.setInputAction((e) => {
      const target = this.viewer.scene.pick(e.endPosition);
      const position = this.viewer.scene.pickPosition(e.endPosition);
      if (target) {
        // 显示绘制提示
        const screenPosition =
          this.viewer.scene.cartesianToCanvasCoordinates(position);
        this.utils.bindWindowDom(
          screenPosition,
          "鼠标按下 拖动修改位置<br>释放后完成修改"
        );
      } else if (!this.isStart) {
        this.utils.destoryTip();
      }

      if (this.editPoint) {
        this.editPoint.position = position;
      }
    }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  }

  private removeEditMouseEvent() {
    this.hander.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN);
    this.hander.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
    this.hander.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
  }

  private creatPoint(position: Cesium.Cartesian3) {
    this.viewer.entities.add({
      id: generateUUID(),
      position: position,
      point: {
        ...this.style,
      },
    });
  }
}


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

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

相关文章

河钢数字PMO牛红卫受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 河钢数字技术股份有限公司项目管理部PMO牛红卫受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“从技术到领导力——项目经理成长进阶之道”。大会将于10月26-27日在北京举办&…

知情人称,丹尼尔克雷格在卸任“007”以后他和蕾切尔薇兹的婚姻“产生了奇效”

丹尼尔克雷格、蕾切尔薇兹 虽然丹尼尔克雷格 (Daniel Craig) 因出演詹姆斯邦德 (James Bond) 而成为全球最耀眼的明星之一&#xff0c;实现了自己以及很多人的梦想&#xff0c;但知情人称他与蕾切尔薇兹 (Rachel Weisz) 的婚姻实际上正因此而陷入困境&#xff1b;但现在&#…

C# winforms DataGridView设置数据源自动显示表格

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

高效打造知识图谱,使用LlamaIndex Relik实现实体关联和关系抽取

大家好&#xff0c;文本信息转化为知识图谱的技术&#xff0c;自问世以来一直是研究界的宠儿。大型语言模型&#xff08;LLMs&#xff09;的兴起让这个领域受到更多关注&#xff0c;但LLMs的成本之高令人却步。然而通过对小型模型微调优化&#xff0c;可以找到一种更经济高效的…

没有 Microsoft Wi-Fi Direct Virtual Adapter #2 导致无法打开热点

我的环境 电脑打不开热点 系统 win11 64位 品牌 hp 笔记本电脑 解决方法&#xff1a; https://answers.microsoft.com/zh-hans/windows/forum/all/%E7%A7%BB%E5%8A%A8%E7%83%AD%E7%82%B9%E6%97%A0/9285620a-71d9-4671-b125-4cd607b6371a 解决 &#x1f613; 扫描一下设…

读构建可扩展分布式系统:方法与实践12分布式数据库案例

1. Redis 1.1. 2009年首次发布 1.1.1. 更注重原始性能和简单性&#xff0c;而不是数据安全性和一致性 1.2. 主要吸引力在于它能够同时充当分布式缓存和数据存储 1.3. 维护一个内存中的数据存储&#xff0c;也称为数据结构存储(data structure store) 1.4. 配置Redis将每个…

每日学习一个数据结构-Trie树(字典树)

文章目录 定义节点结构根节点插入操作查找操作删除操作特点应用示例 “Trie”树&#xff0c;又称为前缀树或字典树&#xff0c;是一种专门用于存储字符串的数据结构。它在许多应用程序中都非常有用&#xff0c;特别是在那些需要高效查找、插入和删除字符串的应用场景中。下面是…

2024年华为杯数学建模E题-高速公路应急车道启用建模-基于YOLO8的数据处理代码参考(无偿分享)

利用YOLO模型进行高速公路交通流量分析 识别效果&#xff1a; 免责声明 本文所提供的信息和内容仅供参考。尽管我尽力确保所提供信息的准确性和可靠性&#xff0c;但我们不对其完整性、准确性或及时性作出任何保证。使用本文信息所造成的任何直接或间接损失&#xff0c;本人…

记一次Meilisearch轻量级搜索引擎使用

以前使用的是mysql的全文索引、最开始还行。后续觉得就不好用了&#xff0c;但是服务器资源有限&#xff0c;没法上ES&#xff0c;只好找一个轻量级的搜索引擎、找了半天&#xff0c;决定使用这一个&#xff0c;目前效果还不错的。 参考网址 官网&#xff1a;https://www.meil…

java反射基础知识

1.java的反射机制 Java 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射…

【C语言零基础入门篇 - 16】:栈和队列

文章目录 栈和队列栈栈功能的实现源代码 队列队列功能的实现源代码 栈和队列 栈 什么是栈&#xff1a;功能受限的线性数据结构 栈的特点&#xff1a;先进后出 。例如&#xff1a;仓库进货、出货。 栈只有一个开口&#xff0c;先进去的数据在栈底&#xff08;bottom&#xf…

高版本idea开启热部署找不到compiler.automake.allow.when.app.running

高版本idea开启热部署找不到compiler.automake.allow.when.app.running 1.解决方案 设置----》高级设置 搜索 allow 勾选完成就能使用了

针对论坛系统设计测试用例

针对用户登录设计测试用例 针对站内信编写测试用例

mysql5.7小版本升级

最近因为mysql漏洞问题需要升级版本 目标&#xff1a;5.7.17升级到最新的5.7.44 提前准备&#xff1a;必须 MySQL :: Download MySQL Community Server (Archived Versions) 下载最新的5.7版本5.7.44&#xff0c;下载后&#xff0c;解压备用 ​ 方案1&#xff1a;卸载原有…

网站建设模板选择哪种

在选择网站建设模板时&#xff0c;需要考虑多个因素&#xff0c;包括网站的目的、受众、内容类型以及个性化需求等。以下是一些常见的网站建设模板类型&#xff0c;以及它们的特点&#xff0c;希望对你的选择有所帮助。 企业/商务模板&#xff1a; 企业和商务网站通常需要专业、…

python画图|把X轴标签移动到图像顶端

在前述学习过程中&#xff0c;我们一直使用的是默认的轴坐标&#xff0c;X轴往往置于图像的下端。 有时候&#xff0c;也会有将X轴标签放置在图形顶端的需求&#xff0c;今天就一起学习一下。 【1】官网教程 首先打开官网&#xff0c;可以通过下述链接一步直达&#xff1a; …

【开源免费】基于SpringBoot+Vue.JS学科竞赛管理系统(JAVA毕业设计)

本文项目编号 T 047 &#xff0c;文末自助获取源码 \color{red}{T047&#xff0c;文末自助获取源码} T047&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

小红书自动化写文以及发文机器人

&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 &#x1f601; 2. 毕业设计专栏&#xff0c;毕业季咱们不慌忙&#xff0c;几百款毕业设计等你选。 ❤️ 3. Python爬虫专栏…

【C语言零基础入门篇 - 15】:单链表

文章目录 单链表链表的基本概念单链表功能的实现单链表的初始化单链表新结点的创建单链表头插法单链表的输出单链表的查找单链表修改单链表的删除单链表所有数据结点释放源代码 单链表 链表的基本概念 一、什么是链表&#xff1f; 链表是数据结构中线性表的一种&#xff0c;其…

element ui实现全局el-dialog可拖拽

此情况适用于在已有项目中&#xff0c;想实现全局拖拽弹出框&#xff0c;而逐一添加拖拽自定义指令会过于麻烦的情况下&#xff0c;这种情况可以尝试下此方法。 话不多说&#xff0c;直接上代码&#xff1a; 1.先在src下新建一个config文件夹&#xff0c;里面再新建一个dialog…