Cesium 点击获取模型表面经纬度高程坐标(三维坐标)

下面代码适用于 模型表面 三维坐标。

注意:

  1. 下面代码只适用于模型、倾斜摄影等表面坐标获取(地形三维坐标情况我其他文章)
  2. 需要开启深度检测 depthTestAgainstTerrain = true
// 开启深度检测
viewer.scene.globe.depthTestAgainstTerrain = true

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function (evt) {
  var scene = viewer.scene;
  // 判断场景的模式,不能是 变形模式
  if (scene.mode !== Cesium.SceneMode.MORPHING) {
    // scene.pick: 返回scene中指定位置的顶端的primitive属性的一个对象
    let 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 lon = Cesium.Math.toDegrees(cartographic.longitude);
        let lat = Cesium.Math.toDegrees(cartographic.latitude);
        //模型高度
        let height = cartographic.height;  
        console.log('模型表面的经纬度高程是:', { x: lon, y: lat, height: height })
      }
    }
  }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

在这里插入图片描述

说明一下:

viewer.scene.pickPosition(e.position)在没有3dTile模型下的笛卡尔坐标不准问题,可以通过开启深度检测解决 viewer.scene.globe.depthTestAgainstTerrain = true

viewer.scene.pick: 返回scene中指定位置的顶端的primitive属性的一个对象。适用于选取3dTile,改变3dTile的属性(例如颜色)。

viewer.scene.pickPosition: 返回一个被屏幕坐标和深度缓存指定的点。适用于模型表面位置的选取,通俗的说就是camera看过去第一个被挡住的模型(如entity)上的坐标,通常结合其他的选取方式一块用于选取模型和球上的点(结合viewer.scene.pick一同使用)。

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值