Bootstrap

Cesium 拾取坐标

1、二维坐标,获取椭球体表面的经纬度坐标:

var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
handler.setInputAction(function(evt) {
   let cartesian=viewer.camera.pickEllipsoid(evt.position,viewer.scene.globe.ellipsoid);
  let cartographic=Cesium.Cartographic.fromCartesian(cartesian);
  let lng=Cesium.Math.toDegrees(cartographic.longitude);//经度
  let lat=Cesium.Math.toDegrees(cartographic.latitude);//纬度
  let mapPosition={x:lng,y:lat,z:cartographic.height};//height的值始终为零。
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

2、三维坐标,获取地形表面的经纬度高程坐标:
方法一

let handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
handler.setInputAction(function(evt) {网址:yii666.com
  let ray=viewer.camera.getPickRay(evt.position);
  let cartesian=viewer.scene.globe.pick(ray,viewer.scene);
  let cartographic=Cesium.Cartographic.fromCartesian(cartesian);
  let lng=Cesium.Math.toDegrees(cartographic.longitude);//经度
  let lat=Cesium.Math.toDegrees(cartographic.latitude);//纬度
  let mapPosition={x:lng,y:lat,z:cartographic.height};//cartographic.height的值为地形高度。
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

方法二

let handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
handler.setInputAction(function(evt) {
let ray=viewer.camera.getPickRay(evt.position);
let cartesian=viewer.scene.globe.pick(ray,viewer.scene);
let cartographic=Cesium.Cartographic.fromCartesian(cartesian);
let lng=Cesium.Math.toDegrees(cartographic.longitude);//经度值
let lat=Cesium.Math.toDegrees(cartographic.latitude);//纬度值  //height结果与cartographic.height相差无几,注意:cartographic.height可以为0,也就是说,可以根据经纬度计算出高程。
let height=viewer.scene.globe.getHeight(cartographic);
let mapPosition={x:lng,y:lat,z:height.height};//height的值为地形高度。
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

方法三 获取模型表面的经纬度高程坐标(此方法借鉴于官方示例)

var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
handler.setInputAction(function(evt) {
  var scene = viewer.scene;
  if (scene.mode !== Cesium.SceneMode.MORPHING) {
    var pickedObject = scene.pick(evt.position);
    if (scene.pickPositionSupported && Cesium.defined(pickedObject) && pickedObject.node) {
      let cartesian = viewer.scene.pickPosition(evt.position);
       if (Cesium.defined(cartesian)) {
        let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
        let lng = Cesium.Math.toDegrees(cartographic.longitude);
        let lat = Cesium.Math.toDegrees(cartographic.latitude);
        let height = cartographic.height;//模型高度
    mapPosition={x:lng,y:lat,z:height}
    }
   }
  }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
;