前面我们从宏观上分析了Cesium的整体调度以及网格方面的内容,通过前两篇,读者应该可以比较清楚的明白一个Tile是怎么来的吧(如果还不明白全是我的错)。接下来,在前两篇的基础上,我们着重讨论一下地形相关的内容。

Cesium提供了TerrainProvider基类,该Provider负责每一个Tile对应的地形数据的构建,定义了一套地形Provider需要实现的接口和规范,但本身并不会参与其中的操作。这里列举一些关键的属性和函数:

  • tilingScheme
    Provider内部地球网格的剖分方式,通常是WGS84坐标,也可以选择墨卡托坐标系
  • hasWaterMask
    是否支持水面效果
  • hasVertexNormals
    地形数据中是否包含法向量(光照是否支持)
  • heightmapTerrainQuality
    地形显示的精度,在上一篇中介绍的一个Tile占多少像素,其中这个参数作为调整系数
  • requestTileGeometry
    Provider的对外接口,参数为Tile对应的XYZ,返回其对应的TerrainData,基类中为空实现。

如上就是TerrainProvider,基本都是空实现,仅仅提供了一套规范,在Cesium中有三个继承类,EllipsoidTerrainProvider和CesiumTerrainProvider,还有最新提供的ArcGisImageServerTerrainProvider。

       详细介绍地形前我们先说明一下TileScheme、Terrain和Imagery之间的一个关联。TileScheme是坐标系,Cesium中目前支持WGS1984和墨卡托投影两种。Terrain和Imagery分别采用自己的TileScheme,比如目前Terrain默认采用WGS1984的坐标系,这和经纬高的真实数据更接近,而目前Imagery影像服务基本都是墨卡托投影(据我了解,只有天地图提供WGS84的影像服务)。

TileScheme

Imagery(WGS1984)

Imagery(Mercator)

Terrain(WGS1984)

坐标相同

坐标不同

Terrain(Mercator

坐标不同

坐标相同

如上图,首先,Globe,也就是地球网格是根据TerrainProvider的TileScheme来划分的;其次,如果地形和影像之间采用不同的坐标系,则影像切片需要动态的转换为地形切片下对应的效果,也就是动态投影的过程,这个计算量是不可忽略的;       最后,在实际中,EllipsoidTerrainProvider支持WGS和Mercator两种坐标系,而CesiumTerrainProvider只能支持WGS一种,因此选择何种地形和影像来互相匹配,在性能上也是有差异的。

EllipsoidTerrainProvider

EllipsoidTerrainProvider是Globe默认采用的地形Provider,该Provider不支持水面,没有法向量,所以即使开启光照,对Tile也是无效的。

EllipsoidTerrainProvider功能弱爆了,那还有它存在的价值吗?答案是肯定的。它提供了一个全球范围内高度为0的地形,不需要额外的地形文件,就可以实时的自己来构建这个高度为0的Mesh。对那些没有网络环境,或网络不理想,或不需要地形的应用,EllipsoidTerrainProvider提供了最简单的,无需额外负担的地形数据来构网。

来看一下requestTileGeometry的实现:

原来EllipsoidTerrainProvider采用的高度图方式来构网,但buffer直接new出来,所以值都为0,而高宽为16,也就是把一个Tile的行列分为16*16。至于Cesium如何通过高度图构网的过程,我们在下一篇会介绍,本篇主要在于思路和流程的理解。如下是截取的XYZ为412的地形网格效果,是一个15*15的高度为0的网格:

另外,EllipsoidTerrainProvider有一个更为灵活的地方,TileScheme默认采用WGS84,但用户可以选择,这个在性能优化上还是值得考虑的,目前的影像服务绝大多数都是采用墨卡托,如果地形采用WGS84,如果所用的EllipsoidTerrainProvider内部坐标系是WGS84,这样就需要讲墨卡托的影像切片转换为WGS的切片的过程,所以,在这种情况下,反正怎么划分,最后的网格都没什么区别,索性让地形的TileScheme和影像的保持一致,性能会更好。理论上讲这个思路是正确的,但事实真的如此吗?因为这个牵扯到Imagery模块,我们在后面讲影像时再详细讨论。

ArcGisImageServerTerrainProvider

我们下来在看看年轻的ArcGIS的地形,这个可以说是一个真实的(凹凸的)高度图,原理和EllipsoidTerrainProvider如出一辙,因此同样的不支持法线,水面,但可以选择TileScheme,与EllipsoidTerrainProvider不一样之处在于每一个切片会根据ArcGIS规范请求一张图片,该图片中的像素对应的值就是该像素对应的高度,真的是名副其实的高度图。我们来看看ArcGisImageServerTerrainProvider的requestTileGeometry实现:

如上,不同于EllipsoidTerrainProvider,ArcGisImageServerTerrainProvider需要根据当前的XYZ获取对应的范围bbox,然后向ArcGIS World Elevation Image Services请求对应该范围的一个_heightmapWidth*_heightmapWidth大小的高度图。heightmapWidth默认为65,可想而知该网格会比较密。

遗憾的是,根据Cesium提供的url,我本机无法访问,所以看不到效果,如果对这个感兴趣,可以参考之前的一篇文章《ArcGIS Earth数据小析》,两者应该是同源的。

CesiumTerrainProvider

最后,就轮到了CesiumTerrainProvider,在该Provider中支持两种地形格式,一种是高度图,一种则是TIN网格的STK地形。我们一一道来。

createHeightmapTerrainData

这个是Cesium提供的高度图方式,和ArcGIS的很相似,目前Cesium已经废弃,确实在技术上,高度图有很多缺陷,我们在介绍完STK的TIN效果后,大家就一目了然。

这个就不用介绍了吧,和前面的一模一样,效果如下,相比EllipsoidTerrainProvider,同一个XYZ(412)这个比较密,因为这次确实有高度了,而不是清一色的0:

另外,Cesium的高度图支持水面效果,水面涉及到渲染层面,我们会在影像渲染中涉及这个问题。

createQuantizedMeshTerrainData

Cesium厉害的指出就在于目前采用STK的地形服务,这个地形的难度和技术细节已经无法在这一个章节内一一道来了,我们也主要说思路,后面单独一个章节来具体的说一下。支持。Cesium通过QuantizedMeshTerrainData封装了STK地形数据格式,它的优点是支持水面和法线,同时数据量比较小。个人认为STK的地形数据代表目前最好的TIN地形生成技术,没有之一,相比之下,高度图的形式可能更容易在应用层面解决问题,但在技术角度不值得一提。

当然,下载STK的数据思路和高度图的一直,也是根据XYZ请求一个Terrain文件,返回值是一个arraybuffer,不过这一次,不是用HeightmapTerrainData来封装,而是用QuantizedMeshTerrainData,本篇不讨论QuantizedMeshTerrainData细节,先看看同一个Tile(412)下的效果图:

可见STK的地形网格看上去很简单,甚至比EllipsoidTerrainProvider还要稀疏,那为什么还能具有如此多的优点呢,现卖个关子,下回分解。

回顾

本文主要介绍了目前Cesium支持的三种TerrainProvider的相关细节,每一个Tile切片,对应不同的TerrainProvider,地形数据会封装成HeightMapTerrainData或者QuantizedMeshTerrainData对象。

下两篇,我们详细介绍高度图,也就是HeightMapTerrainData和QuantizedMeshTerrainData中的细节。

Cesium原理篇:3最长的一帧之地形(1)的更多相关文章

  1. Cesium原理篇:5最长的一帧之影像

    如果把地球比做一个人,地形就相当于这个人的骨骼,而影像就相当于这个人的外表了.之前的几个系列,我们全面的介绍了Cesium的地形内容,详见: Cesium原理篇:1最长的一帧之渲染调度 Cesium原 ...

  2. Cesium原理篇:3最长的一帧之地形(2:高度图)

           这一篇,接着上一篇,内容集中在高度图方式构建地球网格的细节方面.        此时,Globe对每一个切片(GlobeSurfaceTile)创建对应的TileTerrain类,用来维 ...

  3. Cesium原理篇:7最长的一帧之Entity(下)

    上一篇,我们介绍了当我们添加一个Entity时,通过Graphics封装其对应参数,通过EntityCollection.Add方法,将EntityCollection的Entity传递到DataSo ...

  4. Cesium原理篇:7最长的一帧之Entity(上)

    之前的最长的一帧系列,我们主要集中在地形和影像服务方面.简单说,之前我们都集中在地球是怎么造出来的,从这一系列开始,我们的目光从GLOBE上解放出来,看看球面上的地物是如何渲染的.本篇也是先开一个头, ...

  5. cesium原理篇(三)--地形(1)【转】

    转自:http://www.cnblogs.com/fuckgiser/p/5824743.html 简述 前面我们从宏观上分析了Cesium的整体调度以及网格方面的内容,通过前两篇,读者应该可以比较 ...

  6. Cesium原理篇:3最长的一帧之地形(3:STK)

    有了之前高度图的基础,再介绍STK的地形相对轻松一些.STK的地形是TIN三角网的,基于特征值,坦白说,相比STK而言,高度图属于淘汰技术,但高度图对数据的要求相对简单,而且支持实时构建网格,STK具 ...

  7. Cesium原理篇:1最长的一帧之渲染调度

    原计划开始着手地形系列,但发现如果想要从逻辑上彻底了解地形相关的细节,那还是需要了解Cesium的数据调度过程,这样才能更好的理解,因此,打算先整体介绍一下Cesium的渲染过程,然后在过渡到其中的两 ...

  8. Cesium原理篇:3最长的一帧之地形(4:重采样)

           地形部分的原理介绍的差不多了,但之前还有一个刻意忽略的地方,就是地形的重采样.通俗的讲,如果当前Tile没有地形数据的话,则会从他父类的地形数据中取它所对应的四分之一的地形数据.打个比方 ...

  9. Cesium原理篇:2最长的一帧之网格划分

    上一篇我们从宏观上介绍了Cesium的渲染过程,本章延续上一章的内容,详细介绍一下Cesium网格划分的一些细节,包括如下几个方面: 流程 Tile四叉树的构建 LOD 流程 首先,通过上篇的类关系描 ...

随机推荐

  1. angular input标签只能单向传递数据的问题

    angularjs input标签只能单向传递数据的问题 <ion-view title = "{{roomName}}" style = "height:90%; ...

  2. 50个jQuery插件可将你的网站带到另一个高度

    Web领域一直在发生变化并且其边界在过去的每一天都在发生变化(甚至不能以小时为计),随着其边界的扩展取得了许多新发展.在这些进步之中,开发者的不断工作创造了更大和更好的脚本,这些脚本以插件方式带来更好 ...

  3. .保护Express应用程序

    毫无疑问,Node.js已经变的愈加成熟,尽管这样,开发者仍然缺乏大量的安全指南.在这篇文章中,我将分享一些有关Node.js安全要点给大家,希望大家能够谨记于心. 1.避免使用Eval Eval并不 ...

  4. Unity学习疑问记录之 动作动画忽略timeScale

    http://www.bubuko.com/infodetail-968864.html

  5. TaintDroid剖析之Native方法级污点跟踪分析

    1.Native方法的污点传播 在前两篇文章中我们详细分析了TaintDroid对DVM栈帧的修改,以及它是如何在修改之后的栈帧中实现DVM变量级污点跟踪的.现在我们继续分析其第二个粒度的污点跟踪—— ...

  6. 探索c#之storm的TimeCacheMap

    阅读目录: 概述 算法介绍 清理线程 获取.插入.删除 总结 概述 最近在看storm,发现其中的TimeCacheMap算法设计颇为高效,就简单分享介绍下. 思考一下如果需要一个带过期淘汰的缓存容器 ...

  7. Redis系列(二)-Hredis客户端设计及开源

    接上篇c#实现redis客户端(一),重新整理些了下. 阅读目录: 项目说明 Hredis设计图 单元测试场景 总结 项目说明 背景:因为有地方要用,而又没找到对sentinel良好支持的Net客户端 ...

  8. 基于HttpModule的简单.NET网站授权方案

    摘要 本文介绍一种入门级的网站授权(注:这里所指的授权指的是注册码效果,而不是网站登陆时的身份授权)方案,仅供学习交流及对付小白客户使用.复杂的网站授权涉及网站加密等一系列复杂的技术,不做本文介绍内容 ...

  9. MySQL 分析服务器状态

    标签:MYSQL/数据库/性能优化/调优 概述 文章简单介绍了通过一些查询命令分析当前服务器的状态. 目录 概述 获取服务器整体的性能状态 SQL操作计数 总结 步骤 获取服务器整体的性能状态 首先对 ...

  10. K-均值聚类算法

    K-均值聚类算法 聚类是一种无监督的学习算法,它将相似的数据归纳到同一簇中.K-均值是因为它可以按照k个不同的簇来分类,并且不同的簇中心采用簇中所含的均值计算而成. K-均值算法 算法思想 K-均值是 ...