Cesium 自定义Primitive - 圆

news2024/11/24 3:15:26

一、创作思路

        1、创建一个自定义CustomPrimitive

        2、然后根据两个点,生成圆

        3、方便后期绘制圆

二、实现代码

        1、在vue的包中加入turf.

        npm install @turf/turf

        1、创建一个CustomCirclePrimitive类,并加入更新的代码

export default class CustomCirclePrimitive {
  constructor(options) {
    this._props = options;
    /**
     * 渲染列表
     * @type {*[]}
     * @private
     */
    this._primitiveCollection = [];

    this._dynamicPrimitive = undefined;
  }
  updateProperty(options) {
    this._props = {
      ...this._props,
      ...options,
    };
  }
  /**
   * 更新
   * @param frameState
   */
  update(frameState) {
    this._primitiveCollection.forEach((primitive) => {
      primitive && !primitive.isDestroyed() && primitive.update(frameState);
    });
    if (this._dynamicPrimitive) {
      this._dynamicPrimitive.update(frameState);
    }
  }
  destroy() {
    this._primitiveCollection.forEach((primitive) => {
      primitive && !primitive.isDestroyed() && primitive.destroy();
    });
    this._primitiveCollection = undefined;
    if (this._dynamicPrimitive) {
      this._dynamicPrimitive.destroy();
    }
    this._dynamicPrimitive = undefined;
  }
}

        2、编写更新代码

updateProperty(options) {
    this._props = {
      ...this._props,
      ...options,
    };
    let positions = this._props.positions;
    let complete = this._props.complete;
    if (positions.length > 1) {
      let dynamicPrimitive = this._dynamicPrimitive;
      if (dynamicPrimitive) {
        dynamicPrimitive.destroy();
        dynamicPrimitive = null;
        this._dynamicPrimitive = null;
      }
      let primitive = this.initCirclePrimitive(positions);
      if (complete) {
        this._primitiveCollection.push(primitive);
      } else {
        this._dynamicPrimitive = primitive;
      }
    }
  }

        3、编写绘制圆的代码

        设定第一个点为中心点,第二个点为半径上面的点

        半径为第一个点到第二个点的距离

initCirclePrimitive(positions) {
    let centerP = positions[0];
    let radiusP = positions[1];
    let radius = getDistance(centerP, radiusP);
    let circlePositions = getCircle(centerP, radius);
    let instance = new GeometryInstance({
      geometry: new GroundPolylineGeometry({
        positions: circlePositions,
        width: 4,
      }),
    });
    return new GroundPolylinePrimitive({
      geometryInstances: instance,
      appearance: new PolylineMaterialAppearance({
        material: new Material({
          fabric: {
            type: "Color",
            uniforms: {
              color: Color.fromCssColorString("#ff0000"),
            },
          },
        }),
      }),
      asynchronous: false,
    });
  }

        4、额外的算法代码

        

const ellipsoid = Ellipsoid.WGS84;
/**
 * 将世界坐标系转换为球面坐标系
 * @param {Cartesian3} position
 * @return {{alt: number, lon: number, lat: number}}
 */
export const Cartesian3ToWgs84 = (position) => {
  let cartographic = ellipsoid.cartesianToCartographic(position);
  let lon = CesiumMath.toDegrees(cartographic.longitude);
  let lat = CesiumMath.toDegrees(cartographic.latitude);
  let alt = cartographic.height;
  return {
    lon,
    lat,
    alt,
  };
};
/**
 * 计算分段的距离
 * @param {Cartesian3} startPoint 起点
 * @param {Cartesian3} endPoint 终点
 * @return {number} 平面距离
 */
export const getDistance = (startPoint, endPoint) => {
  let start84 = Cartesian3ToWgs84(startPoint);
  let end84 = Cartesian3ToWgs84(endPoint);
  let startPosition = point([start84.lon, start84.lat]);
  let endPosition = point([end84.lon, end84.lat]);
  let startToEnd = distance(startPosition, endPosition, options);
  return startToEnd * 1000;
};
/**
 * 根据半径和中心点,获取圆形
 * @param center
 * @param radius
 * @return {Cartesian3[]}
 */
export const getCircle = (center, radius) => {
  let center84 = Cartesian3ToWgs84(center);
  let centerP = [center84.lon, center84.lat];
  let circleInfo = circle(centerP, radius / 1000.0, options);
  return circleInfo.geometry.coordinates[0].map((item) => {
    return Cartesian3.fromDegrees(item[0], item[1]);
  });
};

        5、测试代码

        

let primitive = new CustomCirclePrimitive();
      viewer.scene.primitives.add(primitive);
      let lon = 106;
      let count = 0;
      let lat = 26;
      let centerP = Cartesian3.fromDegrees(lon, lat);
      let interval = setInterval(() => {
        let lonTemp = lon + count * 0.00001;
        let nextP = Cartesian3.fromDegrees(lonTemp, lat);
        primitive.updateProperty({
          positions: [centerP, nextP],
          complete: count === 11,
        });
        if (count > 10) {
          clearInterval(interval);
        }
        count++;
      }, 1000);

三、实现效果

四、代码

import {
  Cartesian3,
  Color,
  GeometryInstance,
  GroundPolylineGeometry,
  GroundPolylinePrimitive,
  Material,
  PolylineMaterialAppearance,
} from "cesium";
import {
  getCircle,
  getDistance,
} from "@/components/MilitaryPlot/utils/PlotUtils";

export default class CustomCirclePrimitive {
  constructor(options) {
    this._props = options;
    /**
     * 渲染列表
     * @type {*[]}
     * @private
     */
    this._primitiveCollection = [];

    this._dynamicPrimitive = undefined;
  }
  updateProperty(options) {
    this._props = {
      ...this._props,
      ...options,
    };
    let positions = this._props.positions;
    let complete = this._props.complete;
    if (positions.length > 1) {
      let dynamicPrimitive = this._dynamicPrimitive;
      if (dynamicPrimitive) {
        dynamicPrimitive.destroy();
        dynamicPrimitive = null;
        this._dynamicPrimitive = null;
      }
      let primitive = this.initCirclePrimitive(positions);
      if (complete) {
        this._primitiveCollection.push(primitive);
      } else {
        this._dynamicPrimitive = primitive;
      }
    }
  }
  initCirclePrimitive(positions) {
    let centerP = positions[0];
    let radiusP = positions[1];
    let radius = getDistance(centerP, radiusP);
    let circlePositions = getCircle(centerP, radius);
    let instance = new GeometryInstance({
      geometry: new GroundPolylineGeometry({
        positions: circlePositions,
        width: 4,
      }),
    });
    return new GroundPolylinePrimitive({
      geometryInstances: instance,
      appearance: new PolylineMaterialAppearance({
        material: new Material({
          fabric: {
            type: "Color",
            uniforms: {
              color: Color.fromCssColorString("#ff0000"),
            },
          },
        }),
      }),
      asynchronous: false,
    });
  }
  /**
   * 更新
   * @param frameState
   */
  update(frameState) {
    this._primitiveCollection.forEach((primitive) => {
      primitive && !primitive.isDestroyed() && primitive.update(frameState);
    });
    if (this._dynamicPrimitive) {
      this._dynamicPrimitive.update(frameState);
    }
  }
  destroy() {
    this._primitiveCollection.forEach((primitive) => {
      primitive && !primitive.isDestroyed() && primitive.destroy();
    });
    this._primitiveCollection = undefined;
    if (this._dynamicPrimitive) {
      this._dynamicPrimitive.destroy();
    }
    this._dynamicPrimitive = undefined;
  }
}

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

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

相关文章

面试问答之Spring进阶

文章目录 🐒个人主页:信计2102罗铠威🏅JavaEE系列专栏📖前言:🎀说说你对Spring的认识与理解🐕Bean的分类🐕 BeanFactory 接口和ApplicationContex 接口 的区别🐕SpringBe…

Text-to-SQL任务中的思维链(Chain-of-thought)探索

导语 在探索LLM在解决Text-to-SQL任务中的潜能时,本文提出了一种创新的‘问题分解’Prompt格式,结合每个子问题的表列信息,实现了与顶尖微调模型(RASATPICARD)相媲美的性能。 会议:EMNLP 2023链接&#x…

Python给图片加水印

受到“手动给证件加文字太麻烦”的感触,想用Python来实现给图片加水印,这不方便多了。 这里使用PIL模块: from PIL import Image from PIL import ImageFont from PIL import ImageDrawimg_t Image.open(cat.jpg) img_size_t img_t.size…

力扣hot100:560.和为K的子数组(前缀和+哈希表)

分析: 这个题目乍一看,数据大小用暴力解法大概率会超时,可能想用双指针,但是问题出现在 可能存在负数,也就是说即使是找到了一个答案,后面也可能存在负数和正数抵消,又是答案,因此不…

【教程】uni-app iOS打包解决profile文件与私钥证书不匹配问题

摘要 当在uni-app中进行iOS打包时,有时会遇到profile文件与私钥证书不匹配的问题。本文将介绍如何解决这一问题,以及相关的技术细节和操作步骤。 引言 在uni-app开发过程中,iOS打包是一个常见的操作。然而,有时会出现profile文…

Seata 2.x 系列【2】数据库事务

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列Seata 版本 2.0.0 源码地址:https://gitee.com/pearl-organization/study-seata-demo 文章目录 数据库事务什么是事务事务的作用数据库事务模型显式事…

基于Java springboot+VUE+redis实现的前后端分类版网上商城项目

基于Java springbootVUEredis实现的前后端分类版网上商城项目 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言…

linux上的xtrabackup更换版本

linux上安装的xtrabackup版本为8.0版本,与当前库的版本不一致,如何更换xtrabackup的版本 xtrabackup --version xtrabackup version 8.0.35-30 based on MySQL server 8.0.35 Linux (x86_64) (revision id: 6beb4b49)如何下载 首先到percona的官网去下…

Excel中怎么求排名

使用Rank函数 1.在需要显示排名的单元格内,输入“RANK(数值,数值列表,排序方式)” 2.将“数值”替换为需要计算排名的单元格的地址,例如E2单元格。 3.将“数值列表”替换为排名的数值范围,例…

vue接入百度地图获取经纬度

通过城市名称和城市中心经纬度来获取当前所在地图,当前经纬度中心获取可以通过后端获取 静态文件包,替换baidu.html中的ak值,ak值通过百度地图官方网站申请 申请:百度地图API申请步骤 - 知乎 代码示例文件: 链接&a…

【Linux基础(一)】设备和文件IO

学习分享 1、Linux中的设备管理1.1、设备管理的特点1.2、设备分类1.3、设备工作原理1.4、Linux设备操作1.5、系统调用和系统API等区别 2、文件IO2.1、C库的文件操作2.2、文件描述符2.3、特殊文件描述符2.4、系统调用2.4.1、open系统调用4-12.4.2、open系统调用4-22.4.3、write系…

【李沐精读系列】BERT精读

论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 参考:BERT论文逐段精读、李沐精读系列、李宏毅版BERT讲解 一、介绍 BERT(Bidirectional EncoderRepresentation Transformer,双向Transformer编码器…

【C++】类与对象(上篇)

一.类的引入 C与C语言比较起来,C引入了一个新的概念,叫做类。那么在C中,类又是什么呢? 在C中,类与C语言中的结构体相似,但不同的是,C中的类中,不仅可以定义变量,还能定义…

时间复杂度考点总结

【2022统考真题】下列程序段的时间复杂度是( )。 int sum0; for(int il;i<n;i*2) for(int j0;j<i;j) sum; 这道题容易错选为C,正确答案是B 解答&#xff1a;i1时循环1次&#xff0c;i2时循环2次&#xff0c;i4时循环4次&#xff0c;所以循环次数…

wy的leetcode刷题记录_Day82

wy的leetcode刷题记录_Day82 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2024-3-6 前言 目录 wy的leetcode刷题记录_Day82声明前言2917. 找出数组中的 K-or 值题目介绍思路代码收获 143. 重排链表题目介绍思路代码收获 146. LRU 缓存…

【C/C++】结构体内存对齐 ----- 面试必考(超详细解析,小白一看就懂!!!)

目录 一、前言 二、引出 ---- 结构体内存对齐 &#x1f34e;结构体偏移量计算&#xff1a;offsetof &#x1f95d;结构体内存对齐详解 &#x1f4a6;规则介绍&#xff08;重点&#xff01;&#xff01;&#xff09; &#x1f4a6;例题解析 三、习题演练 &#x1f34d;练习① …

Vue.js+SpringBoot开发森林火灾预警系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟雾传感器模块2.4 温度传感器模块2.5 历史记录模块2.6 园区数据模块 三、系统设计3.1 用例设计3.1.1 森林园区基础系统用例设计3.1.2 森林预警数据用例设计 3.2 数据库设计3.2.1 烟雾…

JAVA毕业设计633—基于Java+ssm的医院挂号系统(源代码+数据库+11000字论文+开题)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于Javassm的医院挂号系统(源代码数据库11000字论文开题)633 一、系统介绍 本系统分为管理员、医生、用户三种角色 1、用户&#xff1a; 注册、登录、医生预约、评价、收藏、健…

【EI会议征稿通知】第四届人工智能,大数据与算法国际学术会议 (CAIBDA 2024)

第四届人工智能&#xff0c;大数据与算法国际学术会议 (CAIBDA 2024) 2024 4th International Conference on Artificial Intelligence, Big Data and Algorithms 由河南省科学院、河南大学主办&#xff0c;河南省科学院智慧创制研究所、河南大学学术发展部、河南大学人工智能…

循环神经网络(RNN)算法详解

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 引言 在之前的博文中&#xff0c;我们探讨了全连接神经网络&#xff08;FCNN&#xff09;和卷积神经网络&#xff08;CNN&#xff09;的结构&am…