Cesium如何获取贴地坐标

1.51版新增的sampleHeight和clampToHeight函数虽然能获取3ditles数据指定位置的求交点,但是有一个问题,它只是以当前视角相机能看到的视野进行计算,视野范围之外,要么模型过于粗糙,要么就没有调度,很可能求取不到数值。

参考:https://www.jianshu.com/p/a5d07bb47809

/**
 * 获取坐标的 贴模型高度
 * opts支持:   是否异步 asyn:true  异步回调方法callback返回“新高度”和“原始的Cartographic坐标”
 */
function getSurface3DTilesHeight(scene, position, opts) {
  opts = opts || {};

  //原始的Cartographic坐标
  opts.cartesian = opts.cartesian || Cesium.Cartographic.fromCartesian(position);
  var carto = opts.cartesian;
  var callback = opts.callback || opts.calback; //兼容不同参数名

  //是否异步求精确高度
  if (opts.asyn) {
    scene.clampToHeightMostDetailed([position], opts.objectsToExclude, 0.2).then(function (clampedPositions) {
      var clampedPt = clampedPositions[0];
      if (Cesium.defined(clampedPt)) {
        var cartiles = Cesium.Cartographic.fromCartesian(clampedPt);
        var heightTiles = cartiles.height;
        if (Cesium.defined(heightTiles) && heightTiles > -1000) {
          if (callback) callback(heightTiles, cartiles);
          return;
        }
      }
      //说明没在模型上,继续求地形上的高度
      getSurfaceTerrainHeight(scene, position, opts);
    });
  } else {
    //取贴模型高度
    var heightTiles = scene.sampleHeight(carto, opts.objectsToExclude, 0.2);
    if (Cesium.defined(heightTiles) && heightTiles > -1000) {
      if (callback) callback(heightTiles, carto);
      return heightTiles;
    }
  }

  return 0; //表示取值失败
}
原文地址:https://www.cnblogs.com/2008nmj/p/15662937.html