1. 程式人生 > >cesium——滑鼠拾取座標並轉換為經緯高

cesium——滑鼠拾取座標並轉換為經緯高

 這幾天在研究通視分析,載入地形資料之後,在滑鼠拾取座標時遇到了一些問題,現記錄如下(其他程式碼忽略不記,只記錄造成問題的程式碼部分):

實現的功能:選擇兩個點連線,如遇到地形阻擋則不顯示阻擋部分的線遇到的問題:選擇兩點之後顯示出連線線,但起始位置與滑鼠所選位置不同

初始程式碼:

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近似相等