参考资料:

cesium支持多种地形瓦片数据(GoogleEarthEnterpriseTerrainDataQuantizedMeshTerrainDataHeightmapTerrainData),这里不详细叙述每一个,以下说的地形瓦片都是指HeightmapTerrainData

1、瓦片切分规则

地形瓦片(heightmap-1.0)格式的terrain瓦片集是根据TMS(瓦片地图服务)global-geodetic(全球大地坐标)规则进行切分。

TMS特性简述:

  • TMS中一个瓦片地图(TileMap)由一组具有不同比例尺瓦片集(TileSet)组成,每个瓦片集由相同大小格式的规则瓦片平铺而成。下一级的瓦片集由上一级的四叉分割而来(整个地图就是个四叉树结构)。

  • 对于一个瓦片地图(TileMap)只能支持一个空间参考系(SRS)和一种图像格式,如果需要支持多种就要做多个瓦片地图。

  • 瓦片地图具有边界范围(BoundingBox)和原点(Origin),原点是0,0瓦片的左下角(也是-1,-1瓦片的右上角),也就是轴向是向左向上。

global-geodetic切分规则:

  • 坐标系为WGS84大地坐标系(<SRS>EPSG:4326</SRS>

  • 对于任意级别(n),该级别瓦片集的瓦片像素分辨率为units-per-pixel = 0.703125/2^n

  • 0级为覆盖全球的2个256x256像素大小(地理大小为180*180度)的图块,其Origin为-180,90

heightmap 1.0 特定规则:

  • 所有图块都具有后缀名.terrain

  • 图块大小为65x65像素大小,实际上图块的最后一行和最后一列是相邻的 东边/南边 图块的第一行/第一列。因为其大小不是256x256,所以其对应级别的分辨率也有所不同。

  • 图块获取URL示例如下:

    对于顶级的两个图块:

    • (-180°, -90°) - (0 °, 90 °) - /path/tilesets/terrain/smallterrain/0/0/0.terrain
    • ( 0°, -90 °) - (180 °, 90 °) - /path/tilesets/terrain/smallterrain/0/1/0.terrain

    往下一级的8个图块:

    • (-180°,-90°) - ( -90°, 0°) - /path/tilesets/terrain/smallterrain/1/0/0.terrain
    • ( -90°,-90°) - ( 0°, 0°) - /path/tilesets/terrain/smallterrain/1/1/0.terrain
    • ( 0°,-90°) - ( 90°, 0°) - /path/tilesets/terrain/smallterrain/1/2/0.terrain
    • ( 90°,-90°) - ( 180°, 0°) - /path/tilesets/terrain/smallterrain/1/3/0.terrain
    • (-180°, 0°) - ( -90°, 90°) - /path/tilesets/terrain/smallterrain/1/0/1.terrain
    • ( -90°, 0°) - ( 0°, 90°) - /path/tilesets/terrain/smallterrain/1/1/1.terrain
    • ( 0°, 0°) - ( 90°, 90°) - /path/tilesets/terrain/smallterrain/1/2/1.terrain
    • ( 90°, 0°) - (180 °, 90 °) - /path/tilesets/terrain/smallterrain/1/3/1.terrain

    可以参考一下 http://www.vr-theworld.com/vr-theworld/tiles1.0.0/73/ ,它的图块大小是32x32的,瓦片集的信息如下。

2、.terrain瓦片格式分析

可以使用开源软件 Cesium Terrain Builder 来对DEM数据切片,生成terrain瓦片。

对于TerrainTile的数据结构,可以查看代码TerrainTile.hppTerrainTile.cpp,很清晰明了。

对于单个图块,为65x65大小,每个像素表示一个高度值,海拔值的计算规则为H=像素值*0.2-1000

每个高度值为16Bit的整数,排列顺序为行-从西向东,列-从北向南,总的字节数为65*65*2=8450

相邻图块直接关系大致如下图所示,相邻瓦片之间有一行或者一列的重合。

对于一个.terrain图块,其经过gzip解压后的数据(文档里面说要瓦片数据要经过gzip压缩,但是我在使用cesium测试的时候,是不经过压缩的才能正确读取),布局大致如下:

前8540字节是高度数据,每个高度数据为2字节的小端表示的16位带符号整数。

紧跟其后的一个字节是子块掩码,用于标识当前块的子块是否存在。

再之后是1个或者256*256个字节的水域掩码,如果全部是水域(0)或者陆地(255),那么就是一个字节,如果混合了水域和陆地,那么就是256x256个字节,每个字节表示该像素位置是水域(0)还是陆地(255)。

cesium里解析terrain瓦片数据(解压缩后的)的示例代码:

var buffer = ...
var heightBuffer = new Uint16Array(buffer, 0, that._heightmapWidth * that._heightmapWidth);
var childTileMask = new Uint8Array(buffer, heightBuffer.byteLength, 1)[0];
var waterMask = new Uint8Array(buffer, heightBuffer.byteLength + 1,
buffer.byteLength - heightBuffer.byteLength - 1);
var terrainData = new Cesium.HeightmapTerrainData({
buffer : heightBuffer,
width : 65,
height : 65,
childTileMask : childTileMask,
waterMask : waterMask
});

cesium地形瓦片(HeightMap)格式的更多相关文章

  1. cesium地形瓦片(Quantized-mesh)格式

    目录 1.切片规则 2.瓦片格式分析 2.1.数据头部 2.顶点数据 2.3.索引数据 2.4.扩展数据 参考资料: quantized-mesh-1.0 terrain format(用于三维可视化 ...

  2. WorldWind源码剖析系列:地形瓦片类TerrainTile和地形瓦片服务类TerrainTileService

    地形瓦片类TerrainTile 用来抽象封装用户漫游中所请求的地形瓦片数据类型. 地形瓦片服务类TerrainTileService提供了从BIL(Binary Interleaved by Lin ...

  3. cesium 加载shp格式的白模建筑

    ceisum加载shp格式的建筑.有两种思路,目前推荐第二种. 方法一:将shp格式转换为geojson格式,然后采用cesium提供的接口加载到ceisum中. 严重缺陷:在面对大场景问题,即数据量 ...

  4. cesium加载shp格式数据

    方法一: shp格式转换为GeoJson格式并加载 首先注意shp的坐标系,要转换为WGS84,使用arcgis或QGIS 工具:http://mapshaper.org/: 注意:export时,输 ...

  5. Cesium加载地形数据只显示半个地球

    Cesium第0级地形包括两个瓦片:0/0/0.terrain,0/1/0.terrain,分别为左半球和右半球(具体参考:https://blog.csdn.net/u013929284/artic ...

  6. Cesium 生成terrain地形数据----CTB方式及步骤

    背景:项目前端使用Cesium,地形服务一直使用外网的,常常因为翻墙访问的问题,导致地形数据取不到,进而导致地球不能加载,故决定搭建自己的地形服务,彻底解决这个问题.博文包含以下几个过程: 下载原始地 ...

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

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

  8. geotrellis使用(三十五)Cesium加载geotrellis TMS瓦片

    前言 做任何事情都不是想象中的那么简单.好久没有更新技术博客了,跟最近瞎忙有很大关系,虽说是瞎忙也抽空研究了些技术. 主要是前端渲染,像原生的WebGL和Cesium.WebGL写了几篇博客,自我感觉 ...

  9. cesium模型加载-加载fbx格式模型

    整体思路: fbx格式→dae格式→gltf格式→cesium加载gltf格式模型 具体方法: 1. fbx格式→dae格式 工具:3dsMax, 3dsMax插件:OpenCOLLADA, 下载地址 ...

随机推荐

  1. TP5给request对象动态绑定属性

    在tp5中可以给Request请求对象绑定属性,方便全局调用.比如我们可以在公共控制器中绑定当前登录的用户模型到请求对象. 1. 首先在公共控制器中绑定: <?php namespace app ...

  2. HBase的部署与其它相关组件(Hive和Phoenix)的集成

    HBase的部署与其它相关组件(Hive和Phoenix)的集成 一.HBase部署 1.1.Zookeeper正常部署 首先保证Zookeeper集群的正常部署,并启动之: /opt/module/ ...

  3. crontab定时任务不执行,单独运行sh生效

    虽然已经从事运维两三年了. 但是今天写的计划任务没有执行,排除了下, 这里整理下,方便后期查看. 排除思路 1. 确保crond服务是开机自启和当前是启动的. # centos systemctl s ...

  4. 【Spring】@PathVariable 获取带点参数,获取不全

    一.修改前 @GetMapping("/{name:.+}") public String profile(@PathVariable String name, Model mod ...

  5. zabbix3.4中报错解:telnet service is down on决方法

    当新添加的监控主机报telnet service is down on的时候,大家不要惊慌,这个是属于模板中添加了一项监控参数,监控被监控机的telnet服务,有两种解决办法,第一呢就是找到对应的监控 ...

  6. restframework详细

    1.写视图的方法 1.1第一种:原始APIView url(r'^login/$',account.LoginView.as_view()), from rest_framework.views im ...

  7. linux设备驱动程序--sysfs用户接口的使用

    linux sysfs文件系统 本文部分内容参考自官方文档 自2.6版本开始,linux内核开始使用sysfs文件系统,它的作用是将设备和驱动程序的信息导出到用户空间,方便了用户读取设备信息,同时支持 ...

  8. Python 并发部分的面试题

    进程 进程间内存是否共享?如何实现通讯? 进程间内存不共享,可以通过 Manage模块加锁 通过队列或 通过管道加锁 socket实现通讯 请聊聊进程队列的特点和实现原理? 先进先出 Queue 后进 ...

  9. python导入模块被加横线

    2018-07-03 04:20:41 bluelilyfly 阅读数 1238   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  10. 项目Beta冲刺(团队)——05.28(6/7)

    项目Beta冲刺(团队)--05.28(6/7) 格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺(团队) 团队名称:为了交项目干杯 作业目标:记录Beta敏捷冲刺第6 ...