sampleHeight(position, objectsToExclude, width)
回傳給定地圖位置處場景幾何體的高度,如果沒有要從中采樣高度的場景幾何體,則回傳未定義的高度,輸入位置的高度被忽略,可以用于將物件鉗夾到場景中的球體、3D平鋪或基本體,
此函式僅從當前視圖中渲染的球體平鋪和三維平鋪中采樣高度,從所有其他基本體采樣高度,而不管其可見性如何,
cesium中的scene.sampleHeight方法是用來查詢一個位置的地形或3D模型的高度的,它需要一個Cartesian3型別的位置作為引數,回傳一個數字型別的高度值,如果該位置沒有地形或3D模型,回傳undefined,
示例代碼如下:
// 查詢一個經緯度位置的地形或3D模型高度 var position = Cesium.Cartographic.toCartesian(Cesium.Cartographic.fromDegrees(-1.31968, 0.698874)); var height = viewer.scene.sampleHeight(position); console.log(height);
以下代碼為官方示例的注釋版本
// 創建一個Cesium視圖器,設定一些選項 const viewer = new Cesium.Viewer("cesiumContainer", { // 不顯示資訊框 infoBox: false, // 不顯示選擇指示器 selectionIndicator: false, // 開啟陰影效果 shadows: true, // 開啟影片效果 shouldAnimate: true, }); // 獲取視圖器的場景物件 const scene = viewer.scene; // 設定地球表面對地形進行深度測驗,以實作更真實的遮擋效果 scene.globe.depthTestAgainstTerrain = true; // 檢查瀏覽器是否支持sampleHeight方法,該方法用于獲取給定位置的高程值 if (!scene.sampleHeightSupported) { // 如果不支持,則彈出警告框 window.alert("This browser does not support sampleHeight."); } // 定義一些常量,用于控制模型和點的位置和范圍 const longitude = -2.1480545852753163; // 經度(弧度) const latitude = 0.7688240036937101; // 緯度(弧度) const range = 0.000002; // 范圍(弧度) const duration = 4.0; // 持續時間(秒) // 在視圖器中添加一個物體,表示一個地面車輛模型,并設定其位置為給定的經緯度坐標 const entity = viewer.entities.add({ position: Cesium.Cartesian3.fromRadians(longitude, latitude), model: { uri: "../SampleData/models/GroundVehicle/GroundVehicle.glb", }, }); // 在視圖器中添加一個點物體,表示一個黃色的圓點,并設定其位置為一個回呼函式回傳的值, // 這個回呼函式會根據當前時間和范圍計算出點在經緯度平面上移動的軌跡,并獲取該位置處的高程值, // 并將高程值作為點旁邊標簽顯示出來, const point = viewer.entities.add({ position: new Cesium.CallbackProperty(updatePosition, false), point: { pixelSize: 10, color: Cesium.Color.YELLOW, disableDepthTestDistance: Number.POSITIVE_INFINITY, }, label: { show: false, showBackground: true, font: “14px monospace”, horizontalOrigin: Cesium.HorizontalOrigin.LEFT, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, pixelOffset: new Cesium.Cartesian2(15, 15), disableDepthTestDistance: Number.POSITIVE_INFINITY, }, }); // 定義一個陣列,用于排除點物體在獲取高程值時的干擾 const objectsToExclude = [point]; // 定義一個地理坐標物件,用于存盤點物體的經緯度和高程 const cartographic = new Cesium.Cartographic(); // 定義一個函式,用于更新點物體的位置和標簽 function updatePosition(time, result) { // 根據當前時間和持續時間計算出一個偏移量,用于控制點在范圍內左右移動 const offset = (time.secondsOfDay % duration) / duration; // 根據偏移量更新點物體的經度坐標 cartographic.longitude = longitude - range + offset * range * 2.0; // 點物體的緯度坐標不變 cartographic.latitude = latitude; // 宣告一個變數,用于存盤高程值
let height; // 如果瀏覽器支持sampleHeight方法,則呼叫該方法獲取點物體位置處的高程值,并將其賦給height變數, // 并將objectsToExclude陣列作為引數傳入,以避免點物體本身對高程值的影響, if (scene.sampleHeightSupported) { height = scene.sampleHeight(cartographic, objectsToExclude); } // 如果height變數有定義,則說明獲取到了有效的高程值, if (Cesium.defined(height)) { // 則將高程值賦給地理坐標物件的height屬性 cartographic.height = height; // 并將高程值轉換為米為單位,并保留兩位小數,作為點物體旁邊標簽顯示出來, point.label.text = ${Math.abs(height).toFixed(2).toString()} m; // 并設定標簽為可見狀態 point.label.show = true; } else { // 否則,說明沒有獲取到有效的高程值, // 則將地理坐標物件的height屬性設為0 cartographic.height = 0.0; // 并設定標簽為不可見狀態 point.label.show = false; } // 最后,將地理坐標物件轉換為笛卡爾坐標,并回傳作為點物體的位置 return Cesium.Cartographic.toCartesian( cartographic, Cesium.Ellipsoid.WGS84, result ); } // 設定視圖器跟蹤物體,即將視角鎖定在地面車輛模型上 viewer.trackedEntity = entity;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/545474.html
標籤:GIS
