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

news2024/11/28 21:34:28

前言

本篇博客完全参考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 = 0
  for (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 = false
  viewer.scene.globe.showSkirts = false

  // viewer.scene.globe.clippingPlanes = null // 销毁
}

使用方法

import { areaClipping } from '@/utils/clippingToCanyon.js'

// 挖出
areaClipping(pointList, true)

// 挖除
areaClipping(pointList, false)

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

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

相关文章

算法基础课

第一讲 基础算法 快速排序 归并排序 二分 整数二分模板 关键------画一个仅有整数的一维横轴 bool check(int x) {/* ... */} // 检查x是否满足某种性质 // check()判断mid是否满足性质// 区间[l, r]被划分成[l, mid]和[mid 1, r]时使用&#xff1a; int bsearch_1(in…

数据结构--Trie字符串统计

1、“Trie树” 作用&#xff1a; 高效地存储和查找字符串集合的数据结构。 2、“Trie树” 存储字符串的形式如下&#xff1a; 用 “0” 来表示 “根节点&#xff08;root&#xff09;”。存入一个字符串时&#xff0c;会在字符串最后结尾的那个字符节点打上标记。比如&#x…

No163.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Java-多线程基础及线程安全

文章目录 1. 线程的状态1.1 观察线程的所有状态1.2 观察线程的转态和转移 2. 多线程带来的风险, 线程安全2.1 观察线程不安全2.2 线程安全的概念2.3 线程不安全的原因2.4解决上述代码的线程不安全问题 3. synchronized 关键字3.1 synchronized 的特性3.2 synchronized 使用示例…

【Leetcode】 450. 删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步骤&#xff1a; 首先…

数学小把戏 6174

Wills健身房的手牌编号就是存放衣服的柜子。 柜子是狭长的L或7型&#xff0c;竖着放刚够塞进双肩背包&#xff0c;偶尔我横过来塞进 L 型底座或7的顶柜。 尴尬来的比偶尔次数还是多一点。 在我换衣服时候&#xff0c;旁边的柜子要打开&#xff0c;压迫感陡然拉满。局促的空间…

黑马程序员 MySQL数据库入门到精通——进阶篇(1)

黑马程序员 MySQL数据库入门到精通——进阶篇&#xff08;1&#xff09; 1. 存储引擎1.1 MySQL体系结构1.2 存储引擎简介1.3 存储引擎特点1.3.1 InnoDB1.3.2 MyISAM1.3.3 Memory1.3.4 三种存储引擎对比 1.4 存储引擎选择 2. 索引2.1 索引概述&#xff08;Index Overview&#x…

css复合选择器

交集选择器 紧紧挨着 <template><div><p class"btn">Click me</p><button class"btn" ref"myButton" click"handleClick">Click me</button></div> </template> <style> but…

内存函数(memcpy、memmove、memset、memcmp)你真的懂了吗?

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言进阶之路&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅数据结构探索&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…

一键智能视频语音转文本——基于PaddlePaddle语音识别与Python轻松提取视频语音并生成文案

前言 如今进行入自媒体行业的人越来越多&#xff0c;短视频也逐渐成为了主流&#xff0c;但好多时候是想如何把视频里面的语音转成文字&#xff0c;比如&#xff0c;录制会议视频后&#xff0c;做会议纪要&#xff1b;比如&#xff0c;网课教程视频&#xff0c;想要做笔记&…

wdb_2018_2nd_easyfmt

wdb_2018_2nd_easyfmt Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8047000)32位只开了NX 这题get到一点小知识&#xff08;看我exp就知道了 int __cdecl __noreturn main(int argc, const char…

字节一面:深拷贝浅拷贝的区别?如何实现一个深拷贝?

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;我们经常需要对后端返回的数据进行处理才能渲染到页面上&#xff0c;一般我们会讲数据进行拷贝&#xff0c;在副本对象里进行处理&#xff0c;以免玷污原始数据&#xff0c…

ARP欺骗攻击实操

目录 目录 前言 系列文章列表 全文导图 1&#xff0c;ARP概述 1.1,ARP是什么&#xff1f; 1.2,ARP协议的基本功能 1.3,ARP缓存表 1.4,ARP常用命令 2&#xff0c;ARP欺骗 2.1,ARP欺骗的概述? 2.2,ARP欺骗的攻击手法 3&#xff0c;ARP攻击 3.1,攻击前的准备 3.2,…

数学建模Matlab之评价类方法

大部分方法来自于http://t.csdnimg.cn/P5zOD 层次分析法 层次分析法&#xff08;Analytic Hierarchy Process, AHP&#xff09;是一种结构决策的定量方法&#xff0c;主要用于处理复杂问题的决策分析。它将问题分解为目标、准则和方案等不同层次&#xff0c;通过成对比较和计算…

软件设计模式系列之二十——备忘录模式

备忘录模式目录 1 模式的定义2 举例说明3 结构4 实现步骤5 代码实现6 典型应用场景7 优缺点8 类似模式9 小结 备忘录模式是一种行为型设计模式&#xff0c;它允许我们在不暴露对象内部细节的情况下捕获和恢复对象的内部状态。这个模式非常有用&#xff0c;因为它可以帮助我们实…

HTML——列表,表格,表单内容的讲解

文章目录 一、列表1.1无序&#xff08;unorder&#xff09;列表1.2 有序&#xff08;order&#xff09;列表1.3 定义列表 二、表格**2.1 基本的表格标签2.2 演示 三、表单3.1 form元素3.2 input元素3.2.1 单选按钮 3.3 selcet元素 基础部分点击&#xff1a; web基础 一、列表 …

全面解析‘msvcp140.dll丢失的解决方法’这个问题

msvcp140.dll 是什么东西&#xff1f; msvcp140.dll 是 Microsoft Visual C 2015 Redistributable Package 中的一个动态链接库文件。它包含了 C运行时库中的函数和类&#xff0c;这些函数和类在开发 C应用程序时被广泛使用。msvcp140.dll 的主要作用是在 Windows 操作系统中提…

1.5.C++项目:仿mudou库实现并发服务器之socket模块的设计

项目完整版在&#xff1a; 一、socket模块&#xff1a;套接字模块 二、提供的功能 Socket模块是对套接字操作封装的一个模块&#xff0c;主要实现的socket的各项操作。 socket 模块&#xff1a;套接字的功能 创建套接字 绑定地址信息 开始监听 向服务器发起连接 获取新连接 …

WordPress外贸建站Astra免费版教程指南(2023)

在WordPress的外贸建站主题中&#xff0c;有许多备受欢迎的主题&#xff0c;如AAvada、Astra、Hello、Kadence等最佳WordPress外贸主题&#xff0c;它们都能满足建站需求并在市场上广受认可。然而&#xff0c;今天我要介绍的是一个不断颠覆建站人员思维的黑马——Astra主题。 …