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; //表示取值失败 }