【WebGIS实例】(11)Cesium自定义区域裁剪(挖除挖出)

news/2023/12/3 12:23:36/文章来源:https://blog.csdn.net/ReBeX/article/details/133433075

前言

本篇博客完全参考cesium-地面裁剪(多个剪切面)_cesium clippingplane-CSDN博客,感谢孙霸天大佬提供的实现方法。在此博客的基础上,本篇博客做了以下工作:

  1. 修复点位集合逆时针和顺时针导致不同的结果的问题
  2. 新增了挖出的实现方案
  3. 创建裁切面部分添加了大量注释

挖出
挖出
挖除
挖除
注: 仅支持凸多边形的裁剪。

代码

其实就是一个方法,接收两个参数:坐标点集合和裁剪类型。

坐标点集合数据示例

const pointList = [{"x": 831378.7404354169,"y": -4856690.379372356,"z": 4036359.538261747},{"x": 3334347.320785613,"y": -4763032.687230717,"z": 2613474.0729391705},{"x": 133401.66014090632,"y": -6152120.724266897,"z": 1671946.9335355863}
]

核心代码

import { viewer } from '@/utils/createCesium.js' // 引入地图对象
import * as Cesium from 'cesium'/*** Calculates the area clipping of a set of points.** @param {Array} points - The points to calculate the area clipping for.* @param {boolean} [type=false] - The type of area clipping: false:保留多边形外,挖除 ; true:保留多边形内,挖出* @return {void} This function does not return a value.*/
export function areaClipping(points, type = false) {// 获取点坐标,计算const pointsCoor = points.map(({ x, y, z }) => new Cesium.Cartesian3(x, y, z))let sum = 0for (let i = 0; i < pointsCoor.length; i++) {const pointA = pointsCoor[i]const pointB = pointsCoor[(i + 1) % pointsCoor.length]const crossProduct = Cesium.Cartesian3.cross(pointA, pointB, new Cesium.Cartesian3()) // 计算pointA和pointB两个向量的叉乘sum += crossProduct.z}if (sum > 0 && type) { // 逆时针points.reverse()} else if (sum < 0 && !type) { // 顺时针points.reverse()}const clippingPlanes = [] // 存储ClippingPlane集合for (let i = 0; i < points.length; ++i) {const nextIndex = (i + 1) % points.length// 计算两个坐标点的分量和,取中点。const midpoint = Cesium.Cartesian3.add(points[i], points[nextIndex], new Cesium.Cartesian3())Cesium.Cartesian3.multiplyByScalar(midpoint, 0.5, midpoint)// up 是指从地球中心(原点)到 midpoint 的向量,即一个指向地球正上方的单位向量。const up = Cesium.Cartesian3.normalize(midpoint, new Cesium.Cartesian3())// 计算points[nextIndex]和midpoint的差值,得到一个表示从 points[nextIndex] 指向 midpoint 的向量const right = Cesium.Cartesian3.subtract(points[nextIndex], midpoint, new Cesium.Cartesian3())Cesium.Cartesian3.normalize(right, right) // 计算单位向量// 通过叉乘及归一化得到单位法向量const normal = Cesium.Cartesian3.cross(right, up, new Cesium.Cartesian3())Cesium.Cartesian3.normalize(normal, normal) // 计算单位向量const originCenteredPlane = new Cesium.Plane(normal, 0.0)const distance = Cesium.Plane.getPointDistance(originCenteredPlane, midpoint) // 计算平面到中点的距离// 最后,我们得到一个平面,这个平面垂直于地球表面clippingPlanes.push(new Cesium.ClippingPlane(normal, distance))}// 为地球添加裁剪面viewer.scene.globe.clippingPlanes = new Cesium.ClippingPlaneCollection({planes: clippingPlanes,enabled: true,modelMatrix: Cesium.Matrix4.IDENTITY,unionClippingRegions: type, // 内 || 外edgeColor: Cesium.Color.YELLOW,edgeWidth: 1.0})viewer.scene.globe.backFaceCulling = falseviewer.scene.globe.showSkirts = false// viewer.scene.globe.clippingPlanes = null // 销毁
}

使用方法

import { areaClipping } from '@/utils/clippingToCanyon.js'// 挖出
areaClipping(pointList, true)// 挖除
areaClipping(pointList, false)

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

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

相关文章

A1048 Find Coins(测试点1)

Sample Input 1: 8 15 1 2 8 7 2 4 11 15 Sample Output 1: 4 11 Sample Input 2: 7 14 1 8 7 2 4 11 15 Sample Output 2: No Solution idea 测试点1&#xff1a;m比i小的情况处理小细节&#xff1a;i m/2时&#xff0c;注意i的出现次数必须大于一次 solution #in…

嵌入式学习笔记(37) S5PV210的PWM定时器

7.3.1为什么叫PWM定时器 (1)叫定时器说明它本质上的原理是定时器。 (2)叫PWM定时器&#xff0c;是因为这个定时器天然是用来产生PWM波形的。 7.3.2 PWM定时器介绍 (1)S5PV210有5个PWM定时器。其中0、1、2、3各自对应一个外部GPIO&#xff0c;可以通过这些对应的GPIO产生PWM…

RabbitMQ的工作模式——WorkQueues模式

1.工作队列模式 生产者代码 public class Producer_WorkQueues1 {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost("172.16.98.133&qu…

unity 鼠标标记 左键长按生成标记右键长按清除标记,对象转化为子物体

linerender的标记参考 unity linerenderer在Game窗口中任意画线_游戏内编辑linerender-CSDN博客 让生成的标记转化为ARMarks游戏对象的子物体 LineMark.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class LineMark : MonoBeh…

WebGL笔记:绘制矩形面的几种方式以及封装封装多边形对象来绘制不同图形

绘制矩形面 可以绘制的面只有三角面&#xff0c;要绘制矩形面的话&#xff0c;只能用两个三角形去拼 1 &#xff09; 使用 三角带 TRIANGLE_STRIP 绘制矩形 回顾一下之前的规律&#xff1a; 第一个三角形&#xff1a;v0>v1>v2第偶数个三角形&#xff1a;以上一个三角形…

【深度学习_TensorFlow】卷积神经网络(CNN)

写在前面 这篇文章的行文思路如下&#xff1a; 先根据视频了解卷积和卷积神经网络的整体框架 接着了解卷积神经网络构建过程中的一些重要操作&#xff0c;包括内积、填充、池化。 然后介绍卷积层如何实现。 最后用卷积神经网络的开山之作&#xff08;LeNet-5&#xff09;来…

视频异常检测:Human Kinematics-inspired Skeleton-based Video Anomaly Detection

论文作者&#xff1a;Jian Xiao,Tianyuan Liu,Genlin Ji 作者单位&#xff1a;Nanjing Normal University;The Hong Kong Polytechnic University 论文链接&#xff1a;http://arxiv.org/abs/2309.15662v1 内容简介&#xff1a; 1&#xff09;方向&#xff1a;视频异常检测…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 D: 合并数列

[蓝桥杯 2023 国 B] 合并数列 【问题描述】 小明发现有很多方案可以把一个很大的正整数拆成若干正整数的和。他采取了其中两种方案&#xff0c;分别将他们列为两个数组 { a 1 , a 2 , ⋯ a n } \{a_1, a_2, \cdots a_n\} {a1​,a2​,⋯an​} 和 { b 1 , b 2 , ⋯ b m } \{b…

强化学习到底是什么?它是怎么运维的

https://mp.weixin.qq.com/s/LL3HfU2iNlmSqaTX_3J7fQ 强化学习是一种行为学习模型,由算法提供数据分析反馈,引导用户逐步获取最佳结果。 来源丨Towards Data Science 作者丨Jair Ribeiro 编译丨科技行者 强化学习属于机器学习中的一个子集,它使代理能够理解在特定环境中…

【STL巨头】set、map、multiset、multimap的介绍及使用

set、map、multiset、multimap的介绍及使用 一、关联式容器二、键值对键值对概念定义 三、setset的介绍set的使用set的模板参数列表set的构造set的迭代器set的容量emptysize set的修改操作insertfind && erasecountlower_bound 和 upper_bound Multiset的用法 四、mapm…

vue前端项目中添加独立的静态资源

如果想要在vue项目中放一些独立的静态资源&#xff0c;比如html文件或者用于下载的业务模板或其他文件等&#xff0c;需要在vue打包的时候指定一下静态资源的位置和打包后的目标位置。 使用的是 copy-webpack-plugin 插件&#xff0c;如果没有安装则需要先安装一下&#xff0c;…

ChatGPT必应联网功能正式上线

今日凌晨发现&#xff0c;ChatGPT又支持必应联网了&#xff01;虽然有人使用过newbing这个阉割版的联网GPT4&#xff0c;但官方版本确实更加便捷好用啊&#xff01; 尽管 ChatGPT 此前已经展现出了其他人工智能模型无可比拟的智能&#xff0c;但由于其训练数据的限制&#xff…

excel筛选后求和

需要对excel先筛选&#xff0c;后对“完成数量”进行求和。初始表格如下&#xff1a; 一、选中表内任意单元格&#xff0c;按ctrlshiftL&#xff0c;开启筛选 二、根据“部门”筛选&#xff0c;比如选择“一班” 筛选完毕后&#xff0c;选中上图单元格&#xff0c;然后按alt后&…

使用U3D、pico开发VR(二)——添加手柄摇杆控制移动

一、将unity 与visual studio 相关联 1.Edit->Preference->External tool 选择相应的版本 二、手柄遥控人物转向和人物移动 1.添加Locomotion System组件 选择XR Origin&#xff1b; 2.添加Continuous Move Provider&#xff08;Action-based&#xff09;组件 1>…

volatile关键字以及使用场景

在多线程环境下&#xff0c;如果编程不当&#xff0c;可能会出现程序运行结果混乱的问题。 出现这个原因主要是&#xff0c;JMM 中主内存和线程工作内存的数据不一致&#xff0c;以及多个线程执行时无序&#xff0c;共同导致的结果。 同时也提到引入synchronized同步锁&#x…

八、3d场景的区域光墙

在遇到区域展示的时候我们就能看到炫酷的区域选中效果&#xff0c;那么代码是怎么编辑的呢&#xff0c;今天咱们就好好说说&#xff0c;下面看实现效果。 思路&#xff1a; 首先&#xff0c;光墙肯定有多个&#xff0c;那么必须要创建一个新的js文件来作为他的原型对象。这个光…

抖音开放平台第三方代小程序开发,一整套流程

大家好&#xff0c;我是小悟 抖音小程序第三方平台开发着力于解决抖音生态体系内的小程序管理问题&#xff0c;一套模板&#xff0c;随处部署。能尽可能地减少服务商的开发成本&#xff0c;服务商只用开发一套小程序代码作为模板就可以快速批量的孵化出大量的商家小程序。 第…

NLP中token总结

Token 可以被理解为文本中的最小单位。在英文中&#xff0c;一个 token 可以是一个单词&#xff0c;也可以是一个标点符号。在中文中&#xff0c;通常以字或词作为 token。ChatGPT 将输入文本拆分成一个个 token&#xff0c;使模型能够对其进行处理和理解 在自然语言处理&#…

从零开始学习 Java:简单易懂的入门指南之IO字节流(三十)

IO流之字节流 1. IO概述1.1 什么是IO1.2 IO的分类1.3 IO的流向说明图解1.4 顶级父类们 2. 字节流2.1 一切皆为字节2.2 字节输出流【OutputStream】2.3 FileOutputStream类构造方法写出字节数据数据追加续写写出换行 2.4 字节输入流【InputStream】2.5 FileInputStream类构造方法…

leetCode 122.买卖股票的最佳时机 II 动态规划 + 状态转移 + 状态压缩

122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&…