Cesium 实战-最新版(1.104.0)通过异步方式初始化地球,加载影像以及高程图层

news2024/12/29 14:02:42

Cesium 实战-最新版(1.104.0)通过异步方式初始化地球,加载影像以及高程图层

    • 遇到问题
    • 初始化底图
    • 初始化高程(监听载入完成事件,开启关闭高程)
    • 初始化 3dtile

Cesium 最新版(1.104.0)变动还是挺大的,尤其是涉及图层的渲染加载,差不多是重构级别的变化。

Cesium 1.104.0 开始支持并建议使用异步的方式加载渲染图层。


以下是 官方更新 主要说明:

大意是:为了更好的异步流和图层渲染错误处理,自 1.104.0 开始,readyPromise 模式被弃用,并且从 1.107.0 开始会移除此方法

因此,为了体验新版功能,最好还是及时更新影像、高程等初始化方法。

在这里插入图片描述
受影响的主要是图层相关、地形相关、3dtile 相关,如下:

在这里插入图片描述


本文主要介绍一下,新版 cesium(1.104.0)如何加载影像图、高程数据以及 3dtile 数据。

本文包括:遇到问题、初始化底图、初始化高程(监听载入完成事件,切换高程)、初始化 3dtile 四部分。

提示:想快速了解新版如何 加载图层和高程,可以直接跳转至 初始化底图和初始化高程 查看!


遇到问题

看完官方更新之后,想着直接按照官方示例来修改就行,结果也是遇到一些问题。

由于作者使用的是 TMS 资源,因此之前是使用 new Cesium.TileMapServiceImageryProvider() 的方式来加载图层。

但是现在官方建议是使用 Cesium.TileMapServiceImageryProvider.fromUrl 来加载图层。

在这里插入图片描述

1. 第一个问题:初始化地图时,不能直接使用 imageryProvider 加载图层。

作者本来以为直接替换就行,结果可想而知:图层不会进行渲染!

在这里插入图片描述

在这里插入图片描述

原因也比较简单,因为 imageryProvider 需要的是 ImageryProvider 对象,

TileMapServiceImageryProvider.fromUrl 创建的是 Promise.<TileMapServiceImageryProvider> 对象,因此图层不会渲染。

在这里插入图片描述
在这里插入图片描述

2. 第二个问题:跟图层一样,terrainProvider 直接使用 CesiumTerrainProvider.fromUrl 替换也会出问题。

地形高程不会加载,并且地图会变黑!

原因同加载图层,这里不过多解释。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

还有个需要注意的地方,如果想做版本(1.104.0之前版本)兼容,terrainProviderterrain 属性只能设置一个,否则会提示错误!

在这里插入图片描述

3. 第三个问题:设置开启关闭地形高程问题。

按照以前的方式:

const terrainProvider = viewer.terrainProvider;
// 关闭高程
viewer.terrainProvider = new Cesium.EllipsoidTerrainProvider();
// 开启高程
viewer.terrainProvider = terrainProvider ;

新版环境下,关闭地形比较容易,但是开启有变化,几乎把错都试遍了,比如(以下均不可取,新版方法见下文):

const url = '地形服务地址'

// 创建地形高程对象
const terrain = new Cesium.Terrain(Cesium.CesiumTerrainProvider.fromUrl(url));
const terrainProvider= new Cesium.CesiumTerrainProvider(url));

viewer.terrain = terrainProvider;

viewer.terrain = terrain;

viewer.terrainProvider = terrain;

viewer.terrainProvider = terrain.provider;


初始化底图

Cesium 提供了使用 Promise.<TileMapServiceImageryProvider> 加载图层对象的方法,通过此方法可以直接加载图层。

核心代码(关键是 Cesium.ImageryLayer.fromProviderAsync):

const url = '图层地址'

const baseLayer = new Cesium.ImageryLayer.fromProviderAsync(Cesium.TileMapServiceImageryProvider.fromUrl(url,{
    // 最小级别
    minimumLevel: 1,
    // 最大级别
    maximumLevel: 18,
}))
// 设置监听事件
baseLayer.readyEvent.addEventListener(provider => {
     console.log(`已经创建 provider! `);
     provider.errorEvent.addEventListener(error => {
         console.log(`加载瓦片出错!原因:`, error);
     });
});
const viewer = new Cesium.Viewer("cesiumContainer", {
    // Use OpenStreetMaps
    baseLayer: baseLayer,
    // Show Columbus View map with Web Mercator projection
    mapProjection: new Cesium.WebMercatorProjection()
  });

除此之外,也可以通过设置异步方法(async function)来创建 imageryProvider 对象,提供给 viewer 进行初始化。


初始化高程(监听载入完成事件,开启关闭高程)

1. 初始化地形高程的方式跟图层比较类似。

核心代码(关键是 new Cesium.Terrain):

const url = '地形服务地址'

const terrain = new Cesium.Terrain(Cesium.CesiumTerrainProvider.fromUrl(url));

terrain.readyEvent.addEventListener(provider => {
     console.log(`已经创建 provider! `);
});

const viewer = new Cesium.Viewer("cesiumContainer", {
    // Use Cesium World Terrain
    terrain: terrain,
    // Show Columbus View map with Web Mercator projection
    mapProjection: new Cesium.WebMercatorProjection()
});
  

2. 关于切换地形高程(开启或关闭地形高程)。

由于地形高程加载改为异步,不能再像以前那样直接替换就行。

作者尝试了多次之后,才偶然想到解决办法,之前也是属于走弯路。

核心代码(关键是 terrain.readyEvent):

const url = '地形服务地址'

// 创建地形高程对象
const terrain = new Cesium.Terrain(Cesium.CesiumTerrainProvider.fromUrl(url));

// 定义 terrainProvider
let terrainProvider;

// 创建平面地形
const ellipsoidTerrain = new Cesium.EllipsoidTerrainProvider();

// 加载完成之后,记录 terrainProvider 对象
terrain.readyEvent.addEventListener(provider => {
     terrainProvider = provider;
});

const viewer = new Cesium.Viewer("cesiumContainer", {
    // Use Cesium World Terrain
    terrain: terrain,
    // Show Columbus View map with Web Mercator projection
    mapProjection: new Cesium.WebMercatorProjection()
});

// 分割线 ===================================================================

// 切换地形高程
// 关闭高程
viewer.terrainProvider = ellipsoidProvider;
// 开启高程
viewer.terrainProvider = terrainProvider ;


初始化 3dtile

Cesium 对于 3dtile 加载调整让作者开始有点不适应。

同样,也是异步加载,但是好像没有像图层和高程类那样,提供一个接受者,因此只能使用异步方法(async function)来创建。
在这里插入图片描述

这里需要注意一下,需要用异步方法!

// 使用异步关键字
async function addCesium3DTileset(url,options) {
    try {
        const tileset = await Cesium.Tileset.fromUrl(url, options);

        viewer.scene.primitives.add(tileset);
    } catch (error) {
        console.log(`Failed to load tileset: ${error}`);
    }
}
addCesium3DTileset();

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

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

相关文章

2021地理设计组二等奖:基于地理大数据的南昌中心城区空间功能感知与分区

一、设计背景及意义 随着经济快速发展&#xff0c;城市功能类型也越来越多&#xff0c;在空间上逐渐聚集和演化&#xff0c;形成了居住区&#xff0c;商业区等城市功能区&#xff0c;而这些功能区没有明显边界&#xff0c;确定困难&#xff0c;如使用传统人力调查方法费时费力…

PHP快速入门16-用curl发起POST和GET的请求

文章目录 前言curl介绍发送GET请求发送POST请求其他选项 总结 前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 在Web开发中&#xff0c;经常需要与其他服务器进行数据交互。而现在&#xff0c;绝大多数的接口都是基于HTTP协议的&#xff0c;因此我们需要学会…

Spring MVC的功能

1. 连接功能 1.1几种注解 RequestMapping最常用的注解之一&#xff0c;作用是用来路由注册&#xff08;注册接口的路由映射&#xff09;&#xff0c;即可修饰类也能修饰方法&#xff0c;默认情况下的RequestMapping即可接收Get请求也可以接收Post请求。也可以通过设置method来…

数据通信基础 - 数字传输系统(T1、E1)

文章目录 1 概述2 载波标准&#xff08;E1、T1&#xff09;2.1 T12.2 E1 3 扩展3.1 网工软考真题 1 概述 2 载波标准&#xff08;E1、T1&#xff09; 名称速率 Mbps信道个数每个语音信道的数据速率使用国家T11.5442456Kb/s美国、日本E12.0483264Kb/s欧洲、中国 2.1 T1 语音信…

5g网络变压器的特点与优势分析

5g网络变压器的特点与优势分析 5G网络变压器相比于2.5G和3G网络变压器&#xff0c;具有以下的特点和优势&#xff1a; 更高的频率&#xff1a;5G网络变压器可以支持更高的频率&#xff0c;从而实现更高的数据传输速率和更低的延迟。 更小的尺寸&#xff1a;5G网络变压器采用了…

为什么越来越多的网站选择海外主机?探究原因!

主机已成为网站托管的常用方式&#xff0c;但近年来越来越多的网站选择海外主机。这是为什么呢?在本文中&#xff0c;我们将探究海外主机的优点&#xff0c;并解释为什么越来越多的网站选择它们。 一、海外主机的优点 1、成本更低 海外主机的成本比独立主机低&#xff0c;因为…

文件系统和日志分析

文件系统 文件是存储在硬盘上的&#xff0c;硬盘的最小存储单位叫做"扇区”(sector)每个扇区存储512字节。一般连续八个扇区组成一个"块"(block)&#xff0c;一个块是4K大小&#xff0c;是文件存取的最小单位。操作系统读取硬盘的时候&#xff0c;是一次性连续…

哪个牌子手持洗拖一机好?热门洗地机盘点

在家居清洁中&#xff0c;越来越多的家庭选择了通过智能清洁家电来完成地面的清洁工作&#xff0c;其中洗地机时最受大家青睐的清洁工具&#xff0c;它不仅可以提高我们的清洁效率&#xff0c;还可以减轻清洁时的劳动强度。不过&#xff0c;不同品牌之间的产品的差距也是大有不…

MobPush Android SDK 集成指南

开发工具&#xff1a;Android Studio 集成方式&#xff1a;Gradle在线集成 安卓版本支持&#xff1a;minSdkVersion 19 集成准备 注册账号 使用PushSDK之前&#xff0c;需要先在MobTech官网注册开发者账号&#xff0c;并获取MobTech提供的AppKey和AppSecret&#xff0c;详情可…

世界大学机械工程TOP10,国内大学哪家强?

就在前不久世界大学的排名已经发布&#xff0c;机械工程学科是工科类学科当中代表学科之一&#xff0c;相信很多小伙伴是非常想要了解的。那么&#xff0c;我给大家介绍一下2023年QS世界大学&#xff08;机械工程&#xff09;学科排名。 本次排名比较分析了包括世界93个地区的…

智能洗地机哪个牌子更好用?好用不贵的洗地机推荐

近年来&#xff0c;智能家居产品越来越多&#xff0c;从一开始的扫地机器人到吸尘器再到后来的蒸汽拖把再到现在的洗地机&#xff0c;这些智能化清洁工具&#xff0c;不仅为我们节省了清洁的时间还拥有很好的清洁效果。其中洗地机是近年来最受大家青睐的清洁工具&#xff0c;那…

【Vulnhub】之symfonos1

一、 部署方法 在官网上下载靶机ova环境&#xff1a;https://download.vulnhub.com/symfonos/symfonos1.7z使用VMware搭建靶机环境攻击机使用VMware上搭建的kali靶机和攻击机之间使用NAT模式&#xff0c;保证靶机和攻击机放置于同一网段中。 二、 靶机下载安装 靶机下载与安…

电阻的选型

记点、 NOTE:通用的元器件选型步骤&#xff1a; A&#xff1a;明晰元器件的关机参数 B&#xff1a;结合具体的应用确定跟该应用最直接关联的关键参数 1、电阻的关键参数 2、电阻在电路的作用&#xff1a; 主要是用来是用来稳定和调节电流和电压。可作为分流器和分压器。也可…

ubuntu22.04安装nvidia驱动

ubuntu22.04安装nvidia驱动 环境前言直通显卡ubuntu2204虚拟机配置禁用默认显卡驱动安装显卡驱动查看显卡状态参考文章 环境 ESXi-7.0U3l ubuntu22.04 前言 在第一次成功之后&#xff0c;重启了虚拟机&#xff0c;失败了很多次&#xff0c;重装了n次系统和驱动&#xff0c;但…

452. 用最少数量的箭引爆气球

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一…

DAX:概述ALL函数

简单的说&#xff0c;当ALL用作表函数时&#xff0c;忽略应用到表上的任何过滤器&#xff0c;并返回数据表&#xff1b;当ALL用作CALCULATE和CALCULATETABLE函数中修饰器时&#xff0c;ALL函数从扩展表中移除已经应用的过滤上下文。 注意自动存在(auto-eixist)对ALL()函数的影响…

前后端目前进展

进展 前端第一个vue2第二个vue2&#xff08;用来复盘结果报错&#xff09;第三个vue2 后端第一个django&#xff08;本地&#xff09;第二个django&#xff08;GPU&#xff09; 前后端连接 前端 (前端创建方式/流程详细见我的博客vue2创建) 第一个vue2 项目名&#xff1a;te…

戴尔G3 Ubuntu18.04双系统安装

ROS学习需要使用Linux系统&#xff0c;首先就是Ubuntu&#xff0c;我选择的是18.04.6这个版本&#xff0c;因为后面我要使用以Jetson Nano为主控的Jetbot进行ROS编程&#xff0c;Jetbot所带的出厂镜像就是18.04&#xff0c;为了方便程序移植&#xff0c;以及减少不必要的麻烦。…

MATLAB | 绘图复刻(八) | 堆叠柱状图+哑铃图

本次复刻的是Nature Communications中Friedman, S.T., Muoz, M.M. A latitudinal gradient of deep-sea invasions for marine fishes. Nat Commun 14, 773 (2023). https://doi.org/10.1038/s41467-023-36501-4的Fig1图像&#xff1a; 复刻效果&#xff1a; 文章可在如下网站下…

【数据结构】- 线性表+顺序表

文章目录 前言一、线性表二、顺序表2.1概念及结构2.2接口实现2.3具体实现 总结 前言 所有的失败都是上帝在考验你是否真的热爱 本章是关于数据结构中的顺序表和链表 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、线性表 线性表&#xff08;line…