cesium加载地形后获取地形的贴地高度

1.加载地图。

let viewer = new Viewer("cesiumContainer", {
    terrain: Terrain.fromWorldTerrain(), // 加载地形
    baseLayerPicker: false,
    shouldAnimate: true,
    infoBox: false,
    selectionIndicator: false,
})

2.先添加一个标注点,不设置高度,让他使用cesium中贴地设置,使得标注点贴地。

// 添加标注点
const addMark = () => {
  const entity = viewer.entities.add({
    position: Cartesian3.fromDegrees(114.397428, 25.90923, 0),
    point: {
      pixelSize: 10,
      color: Color.RED,
      heightReference: HeightReference.RELATIVE_TO_GROUND, // 贴地
    },
  });
  viewer.zoomTo(entity);
};

看效果:

3.去掉配置的贴地设置,设置高度大概500左右,看效果。

const addMark = () => {
  const entity = viewer.entities.add({
    position: Cartesian3.fromDegrees(114.397428, 25.90923, 500),
    point: {
      pixelSize: 10,
      color: Color.RED,
      // heightReference: HeightReference.RELATIVE_TO_GROUND, // 贴地
    },
  });
  viewer.zoomTo(entity);
};

效果:可以看出是漂浮在空中的。

如果有场景需要根据经纬度坐标获取贴地高度,这种标注的贴地设置在其他场景就不适用了。

可以根据 sampleTerrainMostDetailed 这个方法异步获取。

const getMapHeight = async (position: { lng: number; lat: number }) => {
  let positions = [Cartographic.fromDegrees(position.lng, position.lat)];
  const p = await sampleTerrainMostDetailed(
    viewer.terrainProvider,
    positions,
    true
  );
  console.log(p[0].height); // 地形贴地高度
  return p[0].height;
};

看效果:经纬度在(114.397428, 25.90923)这个点的贴地高度为447.3987。

获取高度的时候,浏览器会发一个异步请求,所以这个接口需要异步获取

现在将这个高度设置到标注点,看效果。

const addMark = () => {
  const entity = viewer.entities.add({
    position: Cartesian3.fromDegrees(114.397428, 25.90923, 447.398748),
    point: {
      pixelSize: 10,
      color: Color.RED,
      // heightReference: HeightReference.RELATIVE_TO_GROUND, // 贴地
    },
  });
  viewer.zoomTo(entity);
};

效果:

小结:sampleTerrainMostDetailed,是可以批量获取的。第一个参数是加载进地图的地形对象。第二个参数是position数组。第三个参数true的话,如果地形加载失败的话,会reject,如果false,地形加载失败的话,返回对象中高度是未定义。

适用场景就是图斑geojson,需要获取到这个图斑的每一个点的贴地高度来做逻辑的情况使用。千万别一个一个点获取,数量多的时候会发出大量的请求,消耗网络资源。合理使用批量获取。

// 抽成方法,根据经纬度集合获取单个点的贴地元素(贴地高度height)
    getMapHeightByArray = async (data) => {
        let positions = [];
        data.forEach((item) => {
            positions.push(Cesium.Cartographic.fromDegrees(item[0], item[1]));
        })
        const p = await Cesium.sampleTerrainMostDetailed(
            this.viewer.terrainProvider,
            positions,
            true
        );
        return p; // p[0].height, p[1].height...
    };

### 解决Cesium加载地形时遇到的问题 #### 使用`fromWorldTerrain()`直接加载全球地形数据 当尝试使用 `Cesium.Terrain.fromWorldTerrain()` 方法来加载全球地形数据时,如果网络连接不稳定或服务器响应缓慢,则可能导致地形未能成功请求并影响图层加载效果[^1]。 ```javascript let viewer = new Cesium.Viewer('cesiumContainer', { terrainProvider : Cesium.Terrain.fromWorldTerrain() }); ``` 这种方法虽然简单易用但由于依赖外部服务,在生产环境中并不总是稳定可靠的选择。因此官方也不推荐这种方式作为主要方案。 #### 更新至最新版本以适应API变化 随着Cesium不断迭代升级,部分早期版本中的函数签名可能发生变化。例如从某个版本之后(如v1.116),对于`CesiumTerrainProvider`对象实例化操作需采用异步方式处理,并且要确保正确配置Promise链以便于后续逻辑执行[^3]。 ```javascript async function initViewer() { const terrainProvider = await Cesium.createWorldTerrain(); let viewer = new Cesium.Viewer('cesiumContainer',{ terrainProvider: terrainProvider, sceneModePicker:false, // 可选参数设置 baseLayerPicker:false // 可选参数设置 }); } initViewer(); ``` 上述代码展示了如何利用最新的 API 特性实现更健壮的应用程序架构设计模式;同时也解决了因同步调用而导致的地图渲染失败问题。 #### 自定义本地地形提供者 为了提高系统的可控性和性能表现,可以考虑部署一套独立运行的服务端组件专门负责托管所需地理空间信息资源文件夹结构下的`.quantized-mesh`格式化的三维模型网格体以及对应的材质贴图纹理等辅助素材资产集合[^4]。 ```javascript const addTerrainProvider = new Cesium.CesiumTerrainProvider({ url: 'http://your-server-ip-or-domain/tiles/', }); viewer.scene.terrainProvider = addTerrainProvider; ``` 这里需要注意的是,所指定URL路径应当指向实际存在的Web服务器根目录下对应位置处存放有经过预处理转换后的有效二进制流形式的数据集副本。 #### 处理跨域资源共享(CORS)限制 针对某些情况下可能出现的浏览器同源策略安全机制阻止远程HTTP(S)请求获取必要资源的情况,可以通过调整前端路由映射规则或者是在后端开启相应的权限豁免接口等方式绕过此类约束条件从而顺利完成整个工作流程[^5]。 ```json { "/satellite": "http://example.com/satellite" } ``` 通过以上几种途径之一即可有效地缓解乃至彻底消除由不同原因引发的各种异常状况所带来的负面影响,保障项目顺利推进下去的同时也为用户提供更加流畅自然的操作体验环境。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值