Cesium加载本地地形和影像切片

用自己的工具切的地形切片,渲染出来一大片黑色,原以为是加载代码不正确,或者是生成的元数据不正确,最后调试才发现是修改了重采样函数,引入NoData值-3.4e-38,可能直接用作高程,穿透地球,所以显示黑色。最后NoData改成0.0解决问题。最终的加载代码:
(async function () {

  //影像切片元数据中的范围
  const rect = Rectangle.fromDegrees(
    120.214522376701,
    31.211460257123,
    120.300532696172,
    31.288470774705
  );

  //ImageryProvider
  const localImagery = new UrlTemplateImageryProvider({
    url: 'http://localhost:7090/data/png/{z}/{x}/{y}.png',
    tilingScheme: new WebMercatorTilingScheme(),
    minimumLevel: 0,
    maximumLevel: 17,
    tileWidth: 256,
    tileHeight: 256,
 
    rectangle: rect
  });

  const localTerrain=await CesiumTerrainProvider.fromUrl('http://localhost:7090/data/mesh')
 

  const viewer = new Viewer('cesiumContainer', {
    baseLayerPicker: false,
    terrainProvider:localTerrain
    //或者
    //terrain:new Terrain(CesiumTerrainProvider.fromUrl('http://localhost:7090/data/mesh'))
   
  });

  viewer.imageryLayers.removeAll()
  viewer.imageryLayers.addImageryProvider(localImagery);

  viewer.camera.setView({
    destination: rect
  });

})();

影像切片的元数据meta.json

{
"bounds":{
"east":13391794.04,
"north":3670269.51,
"south":3660241.84,
"west":13382219.42
},
"contentType":"image / png",
"generator":"Land",
"latLonBounds":{
"east":120.300532696172,
"north":31.288470774705,
"south":31.211460257123,
"west":120.214522376701
},
"maxzoom":17,
"minzoom":0,
"tilesize":256,
"proj":"3857",
"type":"png"
}
将bounds引入UrlTemplateImageryProvider告诉引擎只请求该区域的影像。
地形切片的元数据文件layer.json内容:

{
  "tilejson": "2.1.0",
  "name": "land_real_a",
  "description": "",
  "version": "1.1.0",
  "format": "quantized-mesh-1.0",
  "attribution": "",
  "schema": "tms",
  "tiles": [ "{z}/{x}/{y}.terrain?v={version}" ],
  "projection": "EPSG:4326",
  "bounds": [ 0.00, -90.00, 180.00, 90.00 ],
  "available": [
    [ { "startX": 1, "startY": 0, "endX": 1, "endY": 0 } ]
   ,[ { "startX": 3, "startY": 1, "endX": 3, "endY": 1 } ]
   ,[ { "startX": 6, "startY": 2, "endX": 6, "endY": 2 } ]
   ,[ { "startX": 13, "startY": 5, "endX": 13, "endY": 5 } ]
   ,[ { "startX": 26, "startY": 10, "endX": 26, "endY": 10 } ]
   ,[ { "startX": 53, "startY": 21, "endX": 53, "endY": 21 } ]
   ,[ { "startX": 106, "startY": 43, "endX": 106, "endY": 43 } ]
   ,[ { "startX": 213, "startY": 86, "endX": 213, "endY": 86 } ]
   ,[ { "startX": 426, "startY": 172, "endX": 427, "endY": 172 } ]
   ,[ { "startX": 853, "startY": 344, "endX": 854, "endY": 344 } ]
   ,[ { "startX": 1707, "startY": 689, "endX": 1708, "endY": 689 } ]
   ,[ { "startX": 3415, "startY": 1379, "endX": 3416, "endY": 1379 } ]
   ,[ { "startX": 6831, "startY": 2758, "endX": 6833, "endY": 2759 } ]
   ,[ { "startX": 13663, "startY": 5516, "endX": 13667, "endY": 5519 } ]
  ]
}

bounds大一点也没关系,比如直接设成全球
关键是available中的范围为引擎调用的查找范围,没有出现在此就不渲染。大了也没关系,只是在控制台有加载失败错误,不影响渲染
posted @ 2025-11-19 17:46  jwwry  阅读(0)  评论(0)    收藏  举报