cesium——滑鼠拾取座標並轉換為經緯高
阿新 • • 發佈:2018-12-12
這幾天在研究通視分析,載入地形資料之後,在滑鼠拾取座標時遇到了一些問題,現記錄如下(其他程式碼忽略不記,只記錄造成問題的程式碼部分):
實現的功能:選擇兩個點連線,如遇到地形阻擋則不顯示阻擋部分的線遇到的問題:選擇兩點之後顯示出連線線,但起始位置與滑鼠所選位置不同
初始程式碼:
var viewer = new Cesium.Viewer('container'); var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handler.setInputAction(function (event) { // 螢幕座標轉世界座標——關鍵點 var ellipsoid = viewer.scene.globe.ellipsoid; var cartesian = viewer.camera.pickEllipsoid(event.position, ellipsoid); //將笛卡爾座標轉換為地理座標 var cartographic = Cesium.Cartographic.fromCartesian(cartesian); //將弧度轉為度的十進位制度表示 var lon = Cesium.Math.toDegrees(cartographic.longitude); var lat = Cesium.Math.toDegrees(cartographic.latitude); // 獲取海拔高度 var height1 = viewer.scene.globe.getHeight(cartographic); var height2 = cartographic.height; }, Cesium.ScreenSpaceEventType.LEFT_CLICK)
修改後程式碼:
var viewer = new Cesium.Viewer('container'); var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas); handler.setInputAction(function (event) { // 螢幕座標轉世界座標——關鍵點 var ray=viewer.camera.getPickRay(event.position); var cartesian=viewer.scene.globe.pick(ray,viewer.scene); //將笛卡爾座標轉換為地理座標 var cartographic = Cesium.Cartographic.fromCartesian(cartesian); //將弧度轉為度的十進位制度表示 var lon = Cesium.Math.toDegrees(cartographic.longitude); var lat = Cesium.Math.toDegrees(cartographic.latitude); // 獲取海拔高度 var height1 = viewer.scene.globe.getHeight(cartographic); var height2 = cartographic.height; }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
結論:
兩段程式碼中height1的值均為該位置的海拔高度,對於螢幕座標轉世界座標的方法
方法一中:
var ellipsoid = viewer.scene.globe.ellipsoid; var cartesian = viewer.camera.pickEllipsoid(event.position, ellipsoid);
沒有載入地形資料時可以使用該方法取點,其中height2得到的高度值為0
方法二中:
var ray=viewer.camera.getPickRay(event.position); var cartesian=viewer.scene.globe.pick(ray,viewer.scene);
適用於有地形時,height2得到的值與height1近似相等