zoukankan      html  css  js  c++  java
  • cesium地形瓦片(HeightMap)格式

    参考资料:

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

    1、瓦片切分规则

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

    TMS特性简述:

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

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

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

    TMS

    global-geodetic切分规则:

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

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

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

      global-geodetic

    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的,瓦片集的信息如下。

      vr-theworld

    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瓦片数据(解压缩后的)的示例代码:

    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
    });
    
  • 相关阅读:
    CTFHub_技能树_文件上传
    QT入门-重载的信号槽
    QT入门-自定义信号
    C++: xx does not name a type报错
    HDU1166 敌兵布阵
    洛谷P2574 XOR的艺术(线段树)
    P3373 【模板】线段树 2(板子好题)
    SP1716 GSS3
    QT入门-自定义槽函数
    Educational Codeforces Round 87 (Rated for Div. 2) D. Multiset(树状数组/好题)
  • 原文地址:https://www.cnblogs.com/oloroso/p/11063905.html
Copyright © 2011-2022 走看看