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 OpenStreetMapsbaseLayer: baseLayer,// Show Columbus View map with Web Mercator projectionmapProjection: 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 Terrainterrain: terrain,// Show Columbus View map with Web Mercator projectionmapProjection: 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 Terrainterrain: terrain,// Show Columbus View map with Web Mercator projectionmapProjection: 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();


在线示例

镜像沙盒示例:Cesium 1.104.0 初始化

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

  1. Cesium基本使用,包括加载影像,地形,模型等,设置地图样式

    加载球体 1.下载cesium包https://download.csdn.net/download/weixin_39150852/20303629,在html里引入 <link href=& ...

  2. Android 系统(169)---Android 7.0 插卡后APN信息的加载流程

    Android 7.0 插卡后APN信息的加载流程.UI界面编辑APN的流程及Android中APN配置相关的漏洞 终端中有一个apns-config.xml文件,负责定义各个运营商规定的默认APN参 ...

  3. pytorch1.0神经网络保存、提取、加载

    pytorch1.0网络保存.提取.加载 import torch import torch.nn.functional as F # 包含激励函数 import matplotlib.pyplot ...

  4. Cesium加载影像、谷歌影像、地形图

    一.Cesium默认加载影像 <div id="cesiumContainer"></div> <script> var viewer = ne ...

  5. Android简易实战教程--第三十二话《使用Lrucache和NetworkImageView加载图片》

    转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:小杨的博客    http://blog.csdn.net/qq_32059827/article/details/5279131 ...

  6. Cesium开发基础笔记总结(加载影像、加载地形数据、加载矢量)

    Cesium开发基础笔记总结 学习总结于GIS李胜老师博客 Cesium开发基础01加载影像数据 加载影像数据 Cesium中的影像图层类: 无论是二维地图还是三维地图,如果缺少了底图影像或电子地图, ...

  7. Android 7.0 插卡后APN信息的加载流程、UI界面编辑APN的流程及Android中APN配置相关的漏洞

    终端中有一个apns-config.xml文件,负责定义各个运营商规定的默认APN参数. 开机后,终端启动Phone进程时,会加载运行在Phone进程中的TelephonyProvider. Tele ...

  8. vue + element UI【实战】音乐播放器/语音条(内含音频的加载、控制,事件监听,信息获取,手机网页阴影的去除等技巧)

    相关技巧,详见注释 <template><!-- 音乐播放器 --><div class="container"><h2>{{ mu ...

  9. 微软释新.NET Core 3.0预览版可加速程序加载速度ReadyToRun

    微软释出了最新的.NET Core 3.0第6预览版,更新了能够加速程序加载速度的ReadyToRun(R2R)格式,以及可以缩减应用程序大小的组译连结(Assembly Linking)工具IL l ...

最新文章

  1. 首个深度强化学习AI,能控制核聚变,成功登上《Nature》
  2. Python 大括号和百分号
  3. java 调用 swf 文件上传_java文件上传方法
  4. 课堂作业03--淘宝网质量属性
  5. CentOS 6使用rpm方式安装JDK8
  6. log4j配置_是时候了解一下log4j2各种配置的含义了!
  7. tensorflow权重初始化
  8. 与时间相关的java源码_Java 基于当前时间获取和计算时间
  9. VMware 安装版中 安装VMware tools 图解
  10. Linux 目录配置标准:FHS
  11. 基于 Electron 做视频会议的两种实现方式
  12. 台达 PLC ISPSoft 3.16--项目文件解密
  13. Android 使用VelocityTracker来获取滑动速度
  14. 如何破解光猫,获取超级管理员账户和密码
  15. 神经影像研究驱动的脑龄估计作为脑疾病和健康状况识别的生物学标记
  16. coursera和udacity_从Udacity和Coursera进行深度学习
  17. 记一次ARM-鲲鹏服务器读写parquet报错解决过程
  18. python常见的PEP8规范
  19. DELPHI中自定义消息的发送和接收
  20. 让 AirDrop 支持有线传输,甚至让不支持 AirDrop 的 Mac 也能使用该功能 黑苹果也可以的哦

热门文章

  1. Web前端:实现在一块区域(div)点击链接,在同一页面的指定区域显示链接的内容——基于css与div结合网页布局设计
  2. 中山大学数据科学与计算机学院复试分数线,2019中山大学数据科学与计算机学院考研复试分数线...
  3. python和C++语言哪个难学
  4. tekton TriggerBinding资源
  5. 利用Matlab将任意曲线旋转任意角度
  6. 判断两个日期间隔是否为7日内
  7. 计算机网络与物流论文题目,电子商务与现代物流关系浅析毕业论文.docx
  8. 《校园十大优秀青年评比》课程设计作品——顺利通过!!!
  9. 同质化游戏做出不同点在于背景音乐
  10. 计算机考试半角全角,全角和半角怎么切换?是什么意思?全角半角的区别