Cesium 中动态计算每个点的高度以适应地形变化

/**
 * 创建或更新一个适应地形的 Polyline 实体
 * @param {Cesium.Viewer} viewer - Cesium Viewer 实例
 * @param {string} entityId - 实体ID
 * @param {Array} positions - 经纬度坐标数组,格式为 [[经度, 纬度], ...]
 * @param {number} [defaultHeight=100] - 无地形数据时使用的默认高度(米)
 * @returns {Promise<Cesium.Entity>} - 返回创建的 Polyline 实体 Promise
 */
function createOrUpdateTerrainAwarePolyline(viewer, entityId, positions, defaultHeight = 100) {
  const polylineEntityPromise = positions.reduce((promise, [longitude, latitude]) => {
    return promise.then((currentEntity) => {
      // 将经纬度转换为笛卡尔坐标
      const cartesian = Cesium.Cartesian3.fromDegrees(longitude, latitude);
      // 查询地形高度
      return viewer.scene.globe.getHeight(cartesian).then((height) => {
        // 如果没有地形数据,使用默认高度
        const finalHeight = height !== undefined ? height : defaultHeight;
        // 更新点坐标
        const updatedPosition = Cesium.Cartesian3.clone(cartesian, finalHeight);
        // 如果是第一个点,创建新的 Polyline 实体
        if (!currentEntity) {
          return createPolylineEntity(viewer, entityId, [updatedPosition]);
        }
        // 否则更新现有实体的 Polyline 位置
        const polyline = currentEntity.polyline.positions;
        polyline.value.push(updatedPosition);
        return currentEntity;
      });
    });
  }, Promise.resolve(null));

  return polylineEntityPromise;

  /**
   * 创建一个新的 Polyline 实体
   * @param {Cesium.Viewer} viewer - Cesium Viewer 实例
   * @param {string} entityId - 实体ID
   * @param {Array} positions - 初始的笛卡尔坐标数组
   * @returns {Cesium.Entity} - 创建的 Polyline 实体
   */
  function createPolylineEntity(viewer, entityId, positions) {
    const entity = viewer.entities.add({
      id: entityId,
      polyline: {
        positions: new Cesium.CallbackProperty(() => positions, false),
        material: new Cesium.PolylineArrowMaterialProperty(Cesium.Color.AQUAMARINE),
        followSurface: false,
        width: 10,
      },
    });
    return entity;
  }
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值