Cesium 展示——新增需求和分析

文章目录

  • 二三维视图的打点飞线,二三维实现联动
    • 需求
    • 分析
  • 模型点击事件
    • 需求
    • 分析
  • 二三维标绘图标,依比例和不依比例缩放
    • 需求
    • 分析
      • 二维标绘图标
        • 依比例缩放
        • 不依比例缩放
      • 三维标绘图标
        • 依比例缩放
        • 不依比例缩放
  • 经纬度和地名互查
    • 需求
    • 分析
      • 经纬度转地名
      • 地名转经纬度
  • 提供一部分三维模型示例,加载在图片
    • 需求
    • 分析
  • 鹰眼联动,内容同步
    • 需求
    • 分析

二三维视图的打点飞线,二三维实现联动

需求

二三维视图的打点飞线,二三维实现联动

分析

该需求需要实现打点飞线,即实现对点线的制作,实现打点飞线

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><title>Cesium Example</title><script src="https://cesium.com/downloads/cesiumjs/releases/1.83/Build/Cesium/Cesium.js"></script><style>@import url("https://cesium.com/downloads/cesiumjs/releases/1.83/Build/Cesium/Widgets/widgets.css");html,body,#cesiumContainer {width: 100%;height: 100%;margin: 0;padding: 0;overflow: hidden;}</style></head><body><div id="cesiumContainer"></div><script>// 初始化 Cesium 场景const viewer = new Cesium.Viewer("cesiumContainer");// 创建飞线路径const positions = [Cesium.Cartesian3.fromDegrees(-75, 35, 250000),Cesium.Cartesian3.fromDegrees(-125, 35, 250000),Cesium.Cartesian3.fromDegrees(-125, 45, 250000),];const redLine = viewer.entities.add({polyline: {positions: positions,width: 5,material: Cesium.Color.RED,},});// 创建点for (let i = 0; i < positions.length; i++) {viewer.entities.add({position: positions[i],point: {pixelSize: 10,color: Cesium.Color.YELLOW,},});}// 设置相机视角viewer.camera.flyTo({destination: Cesium.Cartesian3.fromDegrees(-100, 40, 5000000),});</script></body>
</html>

模型点击事件

需求

实现对模型的点击事件

分析

当在 Cesium 场景中加载了一个或多个模型时,可以通过添加点击事件来捕获用户点击模型的操作。以下是一个示例,演示如何为 Cesium 模型添加点击事件:

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><title>Cesium Example</title><script src="https://cesium.com/downloads/cesiumjs/releases/1.83/Build/Cesium/Cesium.js"></script><style>@import url("https://cesium.com/downloads/cesiumjs/releases/1.83/Build/Cesium/Widgets/widgets.css");html,body,#cesiumContainer {width: 100%;height: 100%;margin: 0;padding: 0;overflow: hidden;}</style></head><body><div id="cesiumContainer"></div><script>// 初始化 Cesium 场景const viewer = new Cesium.Viewer("cesiumContainer");// 加载模型const modelEntity = viewer.entities.add({name: "model",position: Cesium.Cartesian3.fromDegrees(-75, 40),model: {uri: "path/to/your/model.gltf",},});// 添加点击事件viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {const pickedObject = viewer.scene.pick(movement.position);if (Cesium.defined(pickedObject) &&pickedObject.id === modelEntity) {console.log("模型被点击了!");}}, Cesium.ScreenSpaceEventType.LEFT_CLICK);</script></body>
</html>
  • 在这个示例中,我们首先初始化了 Cesium 场景,并加载了一个模型。然后,我们为场景的左击事件添加了一个处理函数。在处理函数中,通过使用 viewer.scene.pick() 方法来获取用户点击的对象。如果被点击的对象的 ID 与模型实体的 ID 匹配,就会在控制台输出一条消息。

  • 请注意,path/to/your/model.gltf 部分应该替换为你自己模型文件的路径。此外,还可以根据需要修改模型的位置、添加更多的模型,以及在点击事件处理函数中执行其他操作。

  • 这个示例演示了如何在 Cesium 中为模型添加点击事件,并在用户点击模型时触发相应的操作

二三维标绘图标,依比例和不依比例缩放

需求

二三维标绘图标,依比例和不依比例缩放

分析

在Cesium中,实现依比例和不依比例缩放的方法略有不同。下面我将分别介绍在Cesium中如何实现依比例和不依比例缩放。

二维标绘图标

依比例缩放

在Cesium中,二维标绘通常使用Billboard来表示图标。要实现依比例缩放,可以设置Billboard的scale属性来指定缩放比例。

var viewer = new Cesium.Viewer('cesiumContainer');var billboard = viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(longitude, latitude),billboard: {image: 'path/to/image.png',scale: 1.0, // 初始缩放比例// 其他属性...}
});viewer.zoomTo(viewer.entities);

上面的代码创建了一个位于指定经纬度位置的Billboard,并设置了初始的缩放比例为1.0。当调整地图的缩放级别时,Billboard会自动按照相应比例进行缩放,从而保持图标的原始比例。

不依比例缩放

如果想实现不依比例缩放,可以直接改变Billboard的width和height属性,而不是使用scale属性。

var viewer = new Cesium.Viewer('cesiumContainer');var billboard = viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(longitude, latitude),billboard: {image: 'path/to/image.png',width: 32, // 初始宽度height: 16, // 初始高度// 其他属性...}
});viewer.zoomTo(viewer.entities);

上述代码中,width和height分别设置了初始的宽度和高度。在地图缩放时,Billboard的宽度和高度将以不同的比例进行调整,从而导致图标的形状发生变化。

三维标绘图标

依比例缩放

在Cesium中,三维标绘通常使用Model来加载和显示模型。要实现依比例缩放,可以设置Model的scale属性来指定缩放比例。

var viewer = new Cesium.Viewer('cesiumContainer');var modelEntity = viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(longitude, latitude, height),model: {uri: 'path/to/model.gltf',scale: 1.0, // 初始缩放比例// 其他属性...}
});viewer.zoomTo(viewer.entities);

上面的代码加载了一个指定位置的模型,并设置了初始的缩放比例为1.0。当调整地图的缩放级别时,模型会按照相应比例进行缩放,保持原始比例。

不依比例缩放

如果想实现不依比例缩放,可以直接改变Model的scale属性中的各个轴的缩放比例。

var viewer = new Cesium.Viewer('cesiumContainer');var modelEntity = viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(longitude, latitude, height),model: {uri: 'path/to/model.gltf',scale: new Cesium.Cartesian3(2, 1, 0.5), // 初始缩放比例// 其他属性...}
});viewer.zoomTo(viewer.entities);

上述代码中,scale属性使用了一个Cartesian3对象来设置初始的缩放比例。可以根据需要调整各个轴的缩放比例,从而实现不依比例缩放效果。

综上所述,在Cesium中实现依比例和不依比例缩放主要通过设置Billboard和Model的scale属性来实现。

经纬度和地名互查

需求

经纬度和地名互查

分析

  • 要在Cesium中实现经纬度和地名的互查,可以使用Cesium的Geocoder组件来实现。

经纬度转地名

  • 要将经纬度转换为地名,可以使用Geocoder的geocode方法。该方法接受一个Cartographic对象作为参数,其中包含了经度和纬度信息。下面是一个示例代码:
var viewer = new Cesium.Viewer('cesiumContainer');var geocoder = new Cesium.Geocoder({container: 'geocoderContainer'
});viewer.extend(Cesium.viewerCesiumInspectorMixin); // 添加Inspector插件
viewer.extend(Cesium.viewerCesium3DTilesInspectorMixin); // 添加3DTiles Inspector插件geocoder.viewModel.searchText = "40.7128, -74.0060"; // 设置经纬度viewer.geocoder.viewModel.search(); // 调用search方法进行查询
  • 上述代码中,我们创建了一个Geocoder实例,并将其绑定到指定的HTML容器中(这里使用了id为geocoderContainer的容器)。然后,通过设置searchText属性,我们传入了一个经纬度坐标"40.7128, -74.0060"。最后,调用search方法进行查询。

  • 当查询成功后,可以通过监听geocodeComplete事件,获取查询结果并获取地名信息。示例如下:

geocoder.viewModel.geocodeComplete.addEventListener(function(geocodeResult) {var result = geocodeResult.results[0];if (result) {var displayName = result.displayName;console.log(displayName); // 输出地名信息}
});
  • 上述代码中,监听了geocodeComplete事件,并通过geocodeResult.results[0]获取到查询结果的第一个地名信息。然后,可以使用displayName属性来获取地名信息,并进行后续操作。

地名转经纬度

  • 要将地名转换为经纬度,同样可以使用Geocoder的geocode方法,但这次传入的参数是地名字符串。以下是示例代码:
var viewer = new Cesium.Viewer('cesiumContainer');var geocoder = new Cesium.Geocoder({container: 'geocoderContainer'
});viewer.extend(Cesium.viewerCesiumInspectorMixin); // 添加Inspector插件
viewer.extend(Cesium.viewerCesium3DTilesInspectorMixin); // 添加3DTiles Inspector插件geocoder.viewModel.searchText = "New York City"; // 设置地名viewer.geocoder.viewModel.search(); // 调用search方法进行查询
  • 上述代码中,我们设置了searchText属性为"New York City",即要查询的地名。然后,调用search方法进行查询。

  • 同样,可以在geocodeComplete事件中获取查询结果并获取经纬度信息。示例如下:

geocoder.viewModel.geocodeComplete.addEventListener(function(geocodeResult) {var result = geocodeResult.results[0];if (result) {var position = result.position;console.log(position); // 输出经纬度信息}
});
  • 上述代码中,我们通过geocodeResult.results[0]获取到查询结果的第一个地名信息,然后使用position属性获取经纬度信息,并进行后续操作。

  • 综上所述,在Cesium中实现经纬度和地名的互查可以通过使用Geocoder组件的geocode方法实现。可以根据需要传入经纬度或地名字符串作为参数,并监听geocodeComplete事件获取查询结果。

提供一部分三维模型示例,加载在图片

需求

提供一部分三维模型示例,加载在图片

分析

  • 在Cesium中,可以通过Cesium.Model来加载三维模型,并通过Cesium.Billboard来加载图片。下面是一个简单的示例代码,演示了如何在Cesium中实现加载三维模型并将其与图片一起展示:
// 初始化Cesium Viewer
var viewer = new Cesium.Viewer('cesiumContainer');// 加载三维模型
var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(-75.62898254394531, 40.02804946899414, 0.0)
);
var model = viewer.scene.primitives.add(Cesium.Model.fromGltf({url : 'path_to_your_3d_model.gltf',modelMatrix : modelMatrix,scale : 200.0
}));// 加载图片
var imageUrl = 'path_to_your_image.jpg';
var billboard = viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(-75.62898254394531, 40.02804946899414, 0.0),billboard: {image: imageUrl,scale: 1.0}
});
  • 在上述代码中,我们首先初始化了Cesium Viewer,并加载了一个三维模型和一张图片。对于三维模型,我们使用Cesium.Model.fromGltf方法加载了一个GLTF格式的模型,并通过modelMatrix设置了其位置、旋转和缩放。对于图片,我们创建了一个Cesium.Billboard实体,并通过image属性设置了图片的URL,然后将该实体添加到了Viewer中。

  • 通过上述示例代码,可以在Cesium中实现加载三维模型并将其与图片一起展示。

鹰眼联动,内容同步

需求

鹰眼联动,内容同步

分析

在Cesium中实现鹰眼联动可以通过两个视图之间的相机位置和操控进行同步。下面是一个示例代码,演示了如何在Cesium中实现鹰眼联动:

// 初始化主视图
var mainViewer = new Cesium.Viewer('mainContainer');// 初始化鹰眼视图
var overviewViewer = new Cesium.Viewer('overviewContainer', {animation: false,baseLayerPicker: false,fullscreenButton: false,geocoder: false,homeButton: false,infoBox: false,sceneModePicker: false,selectionIndicator: false,timeline: false,navigationHelpButton: false,navigationInstructionsInitiallyVisible: false,shouldAnimate: false
});// 主视图相机变化时更新鹰眼视图
mainViewer.camera.changed.addEventListener(function() {updateOverviewView();
});// 鹰眼视图点击时更新主视图
overviewViewer.canvas.addEventListener('click', function(event) {var clickedPosition = overviewViewer.scene.pickPosition(event.position);if (Cesium.defined(clickedPosition)) {mainViewer.camera.flyTo({destination : clickedPosition});}
});// 更新鹰眼视图
function updateOverviewView() {var mainCamera = mainViewer.camera;var overviewCamera = overviewViewer.camera;// 更新鹰眼视图相机位置和方向overviewCamera.setView({destination: mainCamera.position,orientation: {heading: mainCamera.heading,pitch: Cesium.Math.toRadians(-90),roll: 0.0}});// 更新鹰眼视图操控器var scene = overviewViewer.scene;scene.screenSpaceCameraController.minimumZoomDistance = mainCamera.minimumZoomDistance;scene.screenSpaceCameraController.maximumZoomDistance = mainCamera.maximumZoomDistance;scene.screenSpaceCameraController.enableRotate = mainCamera.enableRotate;scene.screenSpaceCameraController.enableTranslate = mainCamera.enableTranslate;scene.screenSpaceCameraController.enableZoom = mainCamera.enableZoom;scene.screenSpaceCameraController.enableTilt = mainCamera.enableTilt;
}// 加载示例模型,仅为演示效果
mainViewer.entities.add({position: Cesium.Cartesian3.fromDegrees(-75.62898254394531, 40.02804946899414, 0.0),model: {uri: 'path_to_your_3d_model.gltf'}
});
  • 在上述代码中,我们初始化了主视图和鹰眼视图。主视图和鹰眼视图分别对应两个不同的<div>容器(分别是mainContainer和overviewContainer)。然后,我们通过监听主视图相机的changed事件,实现主视图相机变化时更新鹰眼视图。

  • 在更新鹰眼视图的函数updateOverviewView中,我们首先获取主视图相机的位置和方向,然后将其设置到鹰眼视图的相机中。接着,我们更新鹰眼视图的操控器,使其与主视图保持一致。

  • 最后,我们通过给鹰眼视图的canvas添加点击事件监听器,实现在鹰眼视图中点击某个位置时更新主视图相机。

  • 请注意,在示例代码中我们加载了一个示例模型,仅用于演示效果。你需要将路径’path_to_your_3d_model.gltf’替换为你实际使用的模型路径。

  • 通过以上示例代码,可以在Cesium中实现鹰眼联动,实现两个视图之间的相机位置和操控的同步。

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

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

相关文章

编织魔法——我与计算机的不解之缘

一、为什么当初选择计算机行业 小时候&#xff0c;我就对电脑充满了好奇。每次看到屏幕上闪烁的光标&#xff0c;我都觉得那是一种神秘的召唤。当我第一次听说“程序员”这个词&#xff0c;我就知道那是我梦寐以求的职业。因为&#xff0c;我梦想成为神奇的码农&#xff0c;我想…

基于HTML 实现的示波器-含完整源码

完整资料下载连接 基于HTML 实现的示波器-含jshtmlcss完整源码 改源码是在桌面 PC 上设计的&#xff0c;分辨率为 1920 x 1080 像素&#xff0c;但宽高像素比为 1.4 到 1.6 的任何分辨率都将产生良好的图像。它适用于以下浏览器的最新版本&#xff1a;Internet Explorer、Edge、…

Smart Git报警unable to unlink old

问题现象 文件改错了&#xff0c;想丢弃修改&#xff0c;结果Smart Git提示这个 解决思路 问一下chat GPT 他提供的234明显是错误答案&#xff0c;1和5都是删除文件&#xff0c;于是把这个文件删了&#xff0c;在丢弃删除操作看看&#xff0c;然后就还原文件了。

高效且实用的表单配置方式:低代码表单上传文件后即刻回显

在现代业务处理流程中&#xff0c;表单上传文件功能的实现已经变得日益重要。而对于用户在上传文件后能够即时看到文件名称的需求&#xff0c;更是对于表单设计的一个基本期望。为了满足这一期望&#xff0c;JVS低代码表单提供了一种高效且实用的配置方式&#xff0c;使得文件名…

以满足全球日益增长的能源需求

在&#xff0c;以满足全球日益增长的能源需求。我们以创新为动力&#xff0c;推出太阳能发电纸系列&#xff0c;将绿色能源与现代科技完美结合&#xff0c;开启了一个全新的绿色能源时代。 太阳能发电纸系列它以创新的设计和高效的功能&#xff0c;将太阳能发电技术推向了一个…

MySql 知识点汇总

目录 MySql 知识点汇总1、基础概念1、数据库三范式是什么?2、MySql的事务是什么?3、事务的 ACID 特性是什么?4、并发事务带来哪些问题?5、事务的四个隔离级别及其区别?6、Mysql中有哪几种锁?7、MySql 索引了解8、MySql默认引擎的区别2、MySQL优化方面1、索引知识点:1>…

【C++11(一)】右值引用以及列表初始化

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; C11 1. 前言2. 统一的列表初始化3. initializer…

SPM/SCM 流量跟踪体系

SPM SPM&#xff08;shopping page mark&#xff0c;导购页面标记&#xff09; 是淘宝社区电商业务&#xff08;xTao&#xff09;为外部合作伙伴&#xff08;外站&#xff09;提供的跟踪引导成交效果数据的解决方案 注&#xff1a;也有解释 SPM 为超级位置模型(Super Position…

ant Design of vue 实现table每栏动态根据条件设置背景颜色(table栏每一栏颜色自定义)

效果图&#xff1a; 注意效果图中&#xff0c;table的表格每一栏颜色都要不一样 代码实现&#xff1a; 页面结构&#xff1a; <a-table :columns"columns" :loading"tableLoading" :data-source"tableData" rowKeyid size"middle&quo…

Spring 向页面传值以及接受页面传过来的参数的方式

一、从页面接收参数 Spring MVC接收请求提交的参数值的几种方法&#xff1a; 使用HttpServletRequest获取。 RequestMapping("/login.do") public String login(HttpServletRequest request){ String name request.getParameter("name") String pa…

5-20V升降压转12V2A自动升降压芯片:AH6971高效、稳定、安全

5-20V升降压转12V2A自动升降压芯片&#xff1a;高效、稳定、安全 随着科技的飞速发展&#xff0c;各种电子设备对电源的要求越来越高。一款高效、稳定、安全的电源芯片成为众多工程师亟待解决的问题。今天&#xff0c;我们就来为大家介绍一款5-20V升降压转12V2A的自动升降压芯…

最近在对接电商供应链,说说开放平台API接口

B2B电商开放平台的设计需要从以下几面去思考&#xff1a; 开放平台API接口的接入&#xff0c;主要是从功能需求的角度&#xff0c;设计满足业务需求的接口及对应的字段&#xff1b; 平台与商家之间信息的对接&#xff0c;对接的方法有哪些&#xff1f;对接过程中需要可能会遇到…

GPU深度学习性能的三驾马车:Tensor Core、内存带宽与内存层次结构

编者按&#xff1a;近年来&#xff0c;深度学习应用日益广泛&#xff0c;其需求也在快速增长。那么&#xff0c;我们该如何选择合适的 GPU 来获得最优的训练和推理性能呢&#xff1f; 今天&#xff0c;我们为大家带来的这篇文章&#xff0c;作者的核心观点是&#xff1a;Tensor…

NET Core迁移前工作

前段时间迁移.NET Core做了大量的试水和评估&#xff0c;今天整理一下分享给大家。大致有以下几个部分&#xff1a; 1. .NET Core的由来 2. 为什么要迁移.NET Core 3. .NET Core3.X主要特性 4. .NET Standard和.NET Core 5. .NET Core Roadmap&版本选择 接下来&#…

Linux4.8、环境变量续

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言 如果对环境变量没有基本的理解&#xff0c;那么建议先看完这篇文章&#xff1a;环境变量https://blog.csdn.net/m0_74824254/article/details/134661113?spm1001.2014.3001.5501 环境变量与本地变量区别 使用export设…

代码随想录算法训练营第五十三天

1143.最长公共子序列 稍微思考即可通过&#xff0c;但是dp状态转移方程并不明确&#xff0c;靠感觉写的。解答和我想的也差不多。 1035.不相交的线 就是最长公共子序列的抽象版本&#xff0c;解答方式一模一样&#xff0c;不过对于抽象问题&#xff0c;要能将其对应为做过的…

pyspark读取数据库性能优化

当数据量很大时&#xff0c;读取方式 dbtable写sql语句 dbtable和query配置不能同时存在&#xff0c;选一种即可。里面都可以直接写sql语句 jdbcDF spark.read.format("jdbc")\.option("driver",driver)\.option("url",url)\.option("d…

自动化测试的成本高效果差,那么自动化测试的意义在哪呢?

有人问&#xff1a;自动化测试的成本高效果差&#xff0c;那么自动化测试的意义在哪呢&#xff1f; 我觉得这个问题带有很强的误导性&#xff0c;是典型的逻辑陷阱之一。“自动化测试的成本高效果差”是真的吗&#xff1f;当然不是。而且我始终相信&#xff0c;回答问题的最…

COMP4121Advanced Algorithms

COMP4121Advanced Algorithms WeChat&#xff1a;yj4399_ Sina Visitor System

【Linux】 OpenSSH_9.3p1 升级到 OpenSSH_9.5p1(亲测无问题,建议收藏)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…