项目中cesium使用方法

cesium方法整理

一、安装依赖

// 安装cesium
npm install cesium --save
// 安装turf工具
npm install @truf/turf --save
// 安装cesium vite插件
npm install vite-plugin-cesim --save

二、项目中引用

import * as Cesium from 'cesium'
import 'cesium/Build/Cesium/Widgets/widgets.css'
import * as turf from '@turf/turf'// 配置地图根目录
window.CESIUM_BASE_URL = '../Cesium'

三、具体方法介绍总结

1,生成地图电子底图(new Cesium.UrlTemplateImageryProvider({}))

let electronic = new Cesium.UrlTemplateImageryProvider({url: 'url',  // url 地址fileExtension: "jpg" // 类型
})

2,生成地图卫星底图( new Cesium.ArcGisMapServerImageryProvider({}) )

let satellite = new Cesium.ArcGisMapServerImageryProvider({url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'
})

3,初始实例化及相关配置( new Cesium.Viewer(id, {}) )

let viewer = new Cesium.Viewer(id, {//需要进行可视化的数据源的集合animation: false, //是否显示动画控件selectionIndicator: false,shouldAnimate: true, // 是否使用动画homeButton: false, //是否显示Home按钮fullscreenButton: false, //是否显示全屏按钮baseLayerPicker: false, //是否显示图层选择控件geocoder: false, //是否显示地名查找控件timeline: false, //是否显示时间线控件sceneModePicker: false, //是否显示投影方式控件navigationHelpButton: false, //是否显示帮助信息控件infoBox: false, //是否显示点击要素之后显示的信息requestRenderMode: true, //启用请求渲染模式scene3DOnly: false, //每个几何实例将只能以3D渲染以节省GPU内存sceneMode: (config.mode == 'earth' && Cesium.SceneMode.SCENE3D) || (config.mode == '3D' && Cesium.SceneMode.COLUMBUS_VIEW) || Cesium.SceneMode.SCENE2D, //初始场景模式 1 2D模式 2 2D循环模式 3 3D模式  Cesium.SceneModefullscreenElement: document.body, //全屏时渲染的HTML元素 暂时没发现用处imageryProvider: (config.baseLayer == 'satellite' && config.satellite) || config.electronic
});//隐藏cesium左下角logo
viewer._cesiumWidget._creditContainer.style.display = 'none';
// 开启抗锯齿
viewer.scene.postProcessStages.fxaa.enabled = true
// 相机高度最大值,限制缩小级别
let cameraHeight = 1.1e7
viewer.scene.screenSpaceCameraController.maximumZoomDistance = cameraHeight * 3;// 深度开启或关闭
viewer.scene.globe.depthTestAgainstTerrain = false;// 取消默认的双击放大时间
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);// 引起事件监听的相机变化幅度
viewer.camera.percentageChanged = 0.02;

4, 注册地图事件(new Cesium.ScreenSpaceEventHandler())

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
// 监听地图鼠标左击
handler.setInputAction((click) => leftClickEvent(click), Cesium.ScreenSpaceEventType.LEFT_DOWN)
function leftClickEvent(click) {// 鼠标左击回调函数
}
// 监听地图鼠标右击
handler.setInputAction((click) => rightClickEvent(click), Cesium.ScreenSpaceEventType.RIGHT_CLICK)
function rightClickEvent(click) {// 鼠标右击回调函数
}// 销毁句柄
handler.destroy()

5,获取鼠标点击位置(世界坐标系) (viewer.camera.getPickRay())

1、获取椭球上的点的经纬度(椭球上的点)
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(event) {// 世界坐标、笛卡尔坐标// enent.position 为屏幕坐标let cartesian = viewer.camera.pickEllipsoid(event.position);// 地理坐标 弧度let cartographic = Cesium.Cartographic.fromCartesian(cartesian);// 地理坐标 经纬度let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度let alt = cartographic.height; // 高度,椭球面height永远等于0let coordinate = {longitude: Number(lng.toFixed(6)),latitude: Number(lat.toFixed(6)),altitude: Number(alt.toFixed(2))};console.log(coordinate);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);2、获取地表面的点的经纬度(地形上的点)
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(event){// 笛卡尔3 射线的位置和方向  // event.position 屏幕坐标let ray = viewer.camera.getPickRay(event.position);// 射线与渲染的地球表面之间的交点  世界坐标、笛卡尔坐标let cartesian = viewer.scene.globe.pick(ray, viewer.scene);// 地理坐标 弧度let cartographic = Cesium.Cartographic.fromCartesian(cartesian);// 地理坐标 经纬度let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度let alt = cartographic.height; // 高度let coordinate = {longitude: Number(lng.toFixed(6)),latitude: Number(lat.toFixed(6)),altitude: Number(alt.toFixed(2))};}, Cesium.ScreenSpaceEventType.LEFT_CLICK);3、获取场景里的点的经纬度(模型上的点)let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (event) {let cartesian = viewer.scene.pickPosition(event.position);let cartographic = Cesium.Cartographic.fromCartesian(cartesian);let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度let alt = cartographic.height; // 高度let coordinate = {longitude: Number(lng.toFixed(6)),latitude: Number(lat.toFixed(6)),altitude: Number(alt.toFixed(2))};console.log(coordinate);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

6,点击获取实体对象(viewer.scene.pick(position))

// 点击获取实体对象
// e.position 屏幕坐标
let pickedObject = viewer.scene.pick(e.position)

7,点击获取entity实体( viewer.entities.getById() )

let entity = viewer.entities.getById(id)

8.弧度角度转换

// 将角度转成弧度
Cesium.Math.toRadians(degrees)
// 将弧度转成角度 
Cesium.Math.toDegrees(radians)
// 将笛卡尔坐标系中的点转换为地理坐标系中的点。
Cesium.Ellipsoid.cartesianToCartographic(cartesian)
// 将地理坐标系中的点转换为笛卡尔坐标系中的点。
Cesium.Ellipsoid.cartographicToCartesian(cartographic)

9.移动视图,设置相机飞行( viewer.camera.flyTo({}) )

// 将经纬度转成笛卡尔坐标
Cesium.Cartesian3.fromDegrees()
// 将经纬度坐标数组转成笛卡尔坐标数组
Cesium.Cartesian3.fromDegreesArray(degreesArray)viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(119.36401386990066, 31.18535721814696, 120000),orientation: {heading: Cesium.Math.toRadians(345.0),pitch: Cesium.Math.toRadians(-60.0),roll: Cesium.Math.toRadians(0.0)}
})

10. 获取实体 具体 数据( entity.properties.data.getValue() )

// 获取实体具体数据
let data = entity.properties.data.getValue()

11.地图模式改变

// 切换到2D模式
viewer.scene.morphTo2D(1)
// 切换到3D模式
viewer.scene.morphTo3D()
// 切换到哥伦布模式
viewer.scene.morphToColumbusView()// 获取中心视图 2D 3D
let centerPosition = getCenterPosition(),
// 哥伦布模式 记录之前的变化矩阵和距离
let originalView = getViewTransform(viewer)/*** @description: 获取变换矩阵和到中心点的距离* @param {*} viewObj 地图对象* @return {transform, distance} 变换矩阵,距离*/
function getViewTransform(viewObj) {let position = getCenterPosition()if (!position) return// 中心点var centerPosition = Cesium.Cartesian3.fromDegrees(position.lon, position.lat, 0)// 相机点var endLat = Cesium.Math.toDegrees(viewObj.camera.positionCartographic.latitude)var endlng = Cesium.Math.toDegrees(viewObj.camera.positionCartographic.longitude)var height = viewObj.camera.positionCartographic.height;var endPosition = Cesium.Cartesian3.fromDegrees(endlng, endLat, height)// 距离var distance = Cesium.Cartesian3.distance(centerPosition, endPosition)// 矩阵var transform = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(position.lon, position.lat));return {transform: transform,distance: distance}
}/*** @description:获取地图中心点* @return {lon, lat, height}  经度,纬度,高度*/
function getCenterPosition() {let centerResult = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(viewer.canvas.clientWidth / 2,viewer.canvas.clientHeight / 2,),)let height = viewer.camera.positionCartographic.height || 10000;if (!Cesium.defined(centerResult)) return falselet curPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(centerResult);let curLongitude = (curPosition.longitude * 180) / Math.PI;let curLatitude = (curPosition.latitude * 180) / Math.PI;return {lon: curLongitude,lat: curLatitude,height: height}
}// 监听场景转换完成事件
viewer.scene.morphComplete.addEventListener(() =>{// 延迟相机转场let timeout = setTimeout(() => {if (config.mode == '2D' || config.mode == 'earth') {if (!centerPosition) returnlet position = Cesium.Cartesian3.fromDegrees(centerPosition.lon, centerPosition.lat, centerPosition.height)viewer.camera.flyTo({destination: position,});} else {if (!originalView) returnvar heading = viewer.camera.heading;var pitch = viewer.camera.pitch;viewer.camera.lookAtTransform(originalView.transform, new Cesium.HeadingPitchRange(heading, pitch, originalView.distance));}// 解除lookAtTransform的锁定viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY)clearTimeout(timeout)}, 1000)
})

12.cesium 是否定义了对象( Cesium.defined(对象) )

Cesium.defined(对象)

13.移除所有地图底图图层,添加地图底图( viewer.imageryLayers.removeAll(), viewer.imageryLayers.addImageryProvider() )

// 移除所有图层
viewer.imageryLayers.removeAll()
// 添加底图
viewer.imageryLayers.addImageryProvider(electronic)

14.卷帘图,把视图分割成两部分,每部分加载不同的底图

/*** @description: 卷帘图:把视图分割成两部分,每部分加载不同的底图*/
function initJuanlian() {// 添加卷帘对比图let layers = viewer.imageryLayers;let leftMap = layers.addImageryProvider(config.electronic)let rightMap = layers.addImageryProvider(config.satellite);// 设置位置左右放置leftMap.splitDirection = Cesium.SplitDirection.LEFT;rightMap.splitDirection = Cesium.SplitDirection.RIGHT// 分割占比let slider = document.getElementById('juanlian');slider.style.display = 'block';viewer.scene.splitPosition = (slider.offsetLeft) / (slider.parentElement.offsetWidth);// 事件let handler = new Cesium.ScreenSpaceEventHandler(slider);let moveActive = false;handler.setInputAction(function () {moveActive = true;}, Cesium.ScreenSpaceEventType.LEFT_DOWN);handler.setInputAction(function () {moveActive = true;}, Cesium.ScreenSpaceEventType.PINCH_START);handler.setInputAction((e) => sliderMove(e, moveActive), Cesium.ScreenSpaceEventType.MOUSE_MOVE);handler.setInputAction((e) => sliderMove(e, moveActive), Cesium.ScreenSpaceEventType.PINCH_MOVE);handler.setInputAction(function () {moveActive = false;}, Cesium.ScreenSpaceEventType.LEFT_UP);handler.setInputAction(function () {moveActive = false;}, Cesium.ScreenSpaceEventType.PINCH_END);
}/*** @description: 分割线移动* @param {*} movement * @param {*} moveActive */
function sliderMove(movement, moveActive) {if (!moveActive) {return;}let slider = document.getElementById('juanlian');let relativeOffset = movement.endPosition.x;let splitPosition = (slider.offsetLeft + relativeOffset) / slider.parentElement.offsetWidth;slider.style.left = 100.0 * splitPosition + '%';viewer.scene.splitPosition = splitPosition;
}

15.视图放大

/*** @description: 视图放大*/
function zoomInView() {var position = viewer.camera.positionCartographic;viewer.camera.moveForward(position.height * 0.5)
}

16.视图缩小

/*** @description: 视图缩小*/
function zoomOutView() {var position = viewer.camera.positionCartographic;viewer.camera.moveBackward(position.height * 0.5)
}

17.移除实体(viewer.entities.remove(entity))

// 移除实体
viewer.entities.remove(entity)

18.创建CustomDataSource集合( new Cesium.CustomDataSource(name) )

// 创建 CustomDataSource 集合
let drawCollection = new Cesium.CustomDataSource(name)
// viewer.dataSources添加集合
viewer.dataSources.add(drawCollection)

19.添加线

/*** @description: 添加线* @param {*} positions */
function addLine(positions) {let line = new Cesium.Entity({name: '直线',type: 'polyline',polyline: {positions: new Cesium.CallbackProperty(() => positions, false),width: 2,material: Cesium.Color.fromCssColorString("#1565c2").withAlpha(1),clampToGround: true,classificationType: Cesium.ClassificationType.BOTH},})// 添加到集合let _line = drawCollection.entities.add(line);return _line
}

20.两点之间的距离( Cesium.Cartesian3.distance( points, points ) )

// 两点间的距离
// points 笛卡尔坐标 
// distance 单位为米
let distance = Cesium.Cartesian3.distance(points,points)

21.算法 计算一个点是否在多边形里

/**
* 计算一个点是否在多边形里
* @param {Object} pt 标注点
* @param {Object} poly 多边形数组
*/
function isInsidePolygon(pt, poly) {for (var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)((poly[i].lat <= pt.lat && pt.lat < poly[j].lat) || (poly[j].lat <= pt.lat && pt.lat < poly[i].lat)) &&(pt.lng < (poly[j].lng - poly[i].lng) * (pt.lat - poly[i].lat) / (poly[j].lat - poly[i].lat) + poly[i].lng) &&(c = !c);return c;
}

22.经纬度转屏幕坐标

/*** 经纬度转屏幕坐标* @param {*} latlng 经纬度* @return cartesian2-屏幕坐标*/
function latlngToWindowCoordinates(latlng) {let cartesian3 = Cesium.Cartesian3.fromDegrees(latlng.lon, latlng.lat, 0)let cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene, cartesian3);return cartesian2
}

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

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

相关文章

【privateGPT】使用privateGPT训练您自己的LLM

了解如何在不向提供商公开您的私人数据的情况下训练您自己的语言模型 使用OpenAI的ChatGPT等公共人工智能服务的主要担忧之一是将您的私人数据暴露给提供商的风险。对于商业用途&#xff0c;这仍然是考虑采用人工智能技术的公司最大的担忧。 很多时候&#xff0c;你想创建自己…

【GOLANG】使用插件 Goanno 的方式来对方法、接口、结构体注释模板配置

直接 使用插件 Goanno 的方式来对方法、接口、结构体注释模板配置 1、简单安装 Goanno 插件 File->Settings->Plugins , 搜索 Goanno Normal Method 配置内容如下&#xff1a; // Title ${function_name} // Description ${todo} // Author mumu ${date} ${time} // Par…

技能分析:这就是人们写在简历上的内容

您希望您的技能部分听起来像其他人一样吗&#xff1f;另一方面&#xff0c;您是否想遗漏一项顶级技能&#xff0c;因为许多其他简历也列出了它&#xff1f;在脱颖而出和涵盖雇主寻求的所有技能之间找到平衡可能是一个挑战。 优秀的简历技能部分会考虑到每个雇主所寻求的特质。…

海云安亮相2023北京国际金融安全论坛,助力金融企业数字化转型降本增效

近日&#xff0c;2023北京国际金融安全论坛暨金融科技标准认证生态大会在北京金融安全产业园成功举办。深圳海云安网络安全技术有限公司&#xff08;以下简称“海云安”&#xff09;受邀参展亮相此次大会。海云安作为国内领先的金融科技服务商&#xff0c;展示了开发安全系列产…

C#中的集合

一、集合的概念 数组可以保存多个对象&#xff0c;但在某些情况下无法确定到底需要保存多少个对象&#xff0c;由于数组的长度不可变&#xff0c;因此数组将不再适用。 如何保存数目不确定的对象呢&#xff1f; 为了保存这些数目不确定的对象&#xff0c;C#中提供了一系列特殊…

Unity坦克大战开发全流程——开始场景——排行榜数据逻辑

开始场景——排行榜数据逻辑 排行榜单条数据 排行榜列表 然后在数据管理类中声明一个对应的字段 初始化数据 然后再在上一节课所编写的UpdatePanelInfo函数中处理数据更新的逻辑 时间换算算法 然后再在数据管理类中编写一个在排行榜中添加数据的方法以提供给外部 直到当前RankI…

【BERT】深入理解BERT模型1——模型整体架构介绍

前言 BERT出自论文&#xff1a;《BERT&#xff1a;Pre-training of Deep Bidirectional Transformers for Language Understanding》 2019年 近年来&#xff0c;在自然语言处理领域&#xff0c;BERT模型受到了极为广泛的关注&#xff0c;很多模型中都用到了BERT-base或者是BE…

搜索算法和推荐算法、广告算法的区别

广告和推荐算法的技术框架比较相似&#xff0c;在线计算时都分为召回&#xff08;candidates generating&#xff09;和排序&#xff08;candidates ranking&#xff09;两个阶段&#xff08;这似乎是计算资源有限条件下&#xff0c;所有检索问题的通用架构&#xff09;。 在某…

2024年网络安全竞赛-页面信息发现任务解析

页面信息发现任务说明: 服务器场景:win20230305(关闭链接)在渗透机中对服务器信息收集,将获取到的服务器网站端口作为Flag值提交;访问服务器网站页面,找到主页面中的Flag值信息,将Flag值提交;访问服务器网站页面,找到主页面中的脚本信息,并将Flag值提交;访问服务器…

RabbitMQ详解

RabbitMQ 概念 RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 AMQP &#xff1a;Advanced Message Queue&#xff0c;高级消息队列协议。它是应用层协议的一个开放标准&#xff0c;为面向消息的中间件设计&#xff0c;基于此协议的客户端与消息中间件可传递消息&a…

2023年全国网络安全行业职业技能大赛数据安全管理员操作技能赛题(样题)

2023年全国网络安全行业职业技能大赛数据安全管理员操作技能赛题(样题) 2023年全国网络安全行业职业技能大赛数据安全管理员操作技能赛题(样题) 第一部分&#xff1a;数据安全防护(30%) 第二部分&#xff1a;数据安全管理(30%) 第三部分&#xff1a;数据安全处置(40%) 项目介绍…

C#常用类

一、C#常用类 C#中有一些具有特定功能的类&#xff0c;例如操作字符串的类、用于操作日期的类、生成随机数的类 字符串的基本特征 1、字符串的不可变性 字符串对象一旦创建&#xff0c;就无法对其进行修改。 .NET框架的底层提供了一种机制&#xff0c;当一个字符串已经被创建…

React Native 从类组件到函数组件

1. 发展趋势 React Native社区中的趋势是朝向使用函数组件&#xff08;Functional Components&#xff09;和Hooks的方向发展&#xff0c;而不是使用类组件&#xff08;Class Components&#xff09;。 React Native自推出Hooks API以来&#xff0c;函数组件和Hooks的使用变得…

【JavaEE】多线程(7) -- 线程池的概念和简单实现

目录 1.线程池是什么 2.标准库中的线程池 2.1ThreadPoolExecutor 2.2构造方法参数介绍 2.3拒绝策略(面试易考) 2.4Executor的使用 3.实现线程池 1.线程池是什么 线程池是一种用来管理线程的机制&#xff0c;它可以有效地控制线程的创建、复用和销毁&#xff0c;从而提高程…

程序的编译、链接

目录 前言&#xff1a; 前置知识回顾 宏 宏定义常量 宏定义语句 宏定义函数 条件编译 应用场景 编译过程概览 预编译阶段 编译阶段 汇编阶段 链接阶段 前言&#xff1a; 在ANSI C的任何一种实现中&#xff0c;存在两种不同的环境&#xff0c;第1种是翻译环境&#x…

EE Vocabulary(电气工程词汇库)

前言 整理了一些EE&#xff08;电子工程&#xff09;和CS&#xff08;计算机&#xff09;专业的学生们阅读英文文献或写论文常用的一些词汇。 仓库GitHub地址&#xff1a;https://github.com/Phillweston/EE_Vocabulary 内容 仓库包含以下格式的电气工程词汇&#xff1a; …

GPT-5、开源、更强的ChatGPT!OpenAI公布2024年计划

年终岁尾&#xff0c;正值圣诞节热闹气氛的OpenAI写下了2024年的发展清单。 OpenAI联合创始人兼首席执行官Sam Altman在社交平台公布&#xff0c;AGI&#xff08;稍晚一些&#xff09;、GPT-5、更好的语音模型、更高的费率限制&#xff1b; 更好的GPTs&#xff1b;更好的推理…

代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II、 55. 跳跃游戏、45.跳跃游戏II

122.买卖股票的最佳时机II 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;贪心算法也能解决股票问题&#xff01;LeetCode&#xff1a;122.买卖股票最佳时机II_哔哩哔哩_bi…

大数据- Hadoop入门

目录 &#x1f436;2.1 hadoop的简介 1. 概述 2. 什么是分布式&#xff1f; 3. Hadoop的指代 &#x1f436;2.2 hadoop的发展历程 &#x1f436;2.3 hadoop的版本介绍 &#x1f436;2.4 hadoop的常用端口号 &#x1f436;2.5 hadoop的设计目的 &#x1f436;2.6 hadoo…

Java集合/泛型篇----第二篇

系列文章目录 文章目录 系列文章目录前言一、说说List,Set,Map三者的区别二、Array与ArrayList有什么不一样?三、Map有什么特点四、集合类存放于 Java.util 包中, 主要有几 种接口前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…