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