其他分享
首页 > 其他分享> > cesium地形瓦片(HeightMap)格式 - 乌合之众

cesium地形瓦片(HeightMap)格式 - 乌合之众

作者:互联网

目录

参考资料:

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

1、瓦片切分规则

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

TMS特性简述:

TMS

global-geodetic切分规则:

heightmap 1.0 特定规则:

2、.terrain瓦片格式分析

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

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

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

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

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

terrain-layout

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

terrain-memory-layout

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

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

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

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

HeightmapTerrainData.js#L174

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
});

本文转自 https://www.cnblogs.com/oloroso/p/11063905.html,如有侵权,请联系删除。

标签:smallterrain,terrain,图块,HeightMap,瓦片,cesium,90,path
来源: https://www.cnblogs.com/hustshu/p/15871576.html