cesium 根据鼠标点击位置,获取经纬度和高度以及创建点位

1.效果

2.需求

根据鼠标在屏幕上点击的位置在cesium地图上生成图元,并获取当前位置的经纬度和高度

3.具体的实现

实现的方式是通过new Cesium.ScreenSpaceEventHandler(element)

该API的作用是:处理用户输入事件。可以添加自定义函数,以便在用户输入输入时执行

参数:element:要监听的元素,在这里要监听的就是viewer.canvas

new Cesium.ScreenSpaceEventHandler生成的对象有个setInputAction(action, type, modifier)方法

action:要执行的方法

type:输入的事件类型

modifier:事件发生时要保留的键盘事件修饰符

LEFT_DOWNnumber鼠标左键向下事件
LEFT_UPnumber鼠标左键向上事件
LEFT_CLICKnumber鼠标左键单击事件
LEFT_DOUBLE_CLICKnumber鼠标左键双击事件
RIGHT_DOWNnumber鼠标右键向下事件
RIGHT_UPnumber鼠标右键向上事件
RIGHT_CLICKnumber鼠标右键单击事件
MIDDLE_DOWNnumber鼠标滚轮向下事件
MIDDLE_UPnumber鼠标滚轮向上事件
MIDDLE_CLICKnumber鼠标滚轮单击事件
MOUSE_MOVEnumber鼠标移动事件
WHEELnumber鼠标滚轮事件
PINCH_STARTnumber触摸屏幕两指事件的开始
PINCH_ENDnumber触摸屏幕两指事件的结束
PINCH_MOVEnumber触摸屏幕两指事件的更改

 

//构建cesium
const viewer = new Cesium.Viewer('DOM元素或ID', {})
// 创建一个事件处理器来处理屏幕空间事件
var handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);
//监听鼠标点击事件
//监听的鼠标事件:Cesium.ScreenSpaceEventType.LEFT_CLICK
handler.setInputAction((click)=>{
    // 使用pick函数获取点击位置的实际位置
    var cartesian = viewer.scene.pickPosition(click.position);
    //判断对象是否存在
    if(Cesium.defined(cartesian)){
        //将笛卡尔坐标转换为经纬度坐标
        var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
        //将弧度转换为角度
        var lng = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
        var lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);
        var height = cartographic.height.toFixed(2);
        console.log('经度:' + lng + ',纬度:' + lat+ ',高度:' + height)

        //在cesium地图上添加点位
        let clickPosition = viewer.scene.camera.pickEllipsoid(click.position);
        viewer.entities.add({
            position:clickPosition,
            point:{
                color:Cesium.Color.GREEN,
                pixelSize:30
            }
        })
    }

    //使用Scene.pick来获取3DTiles的实际高度
    let pickedObject = viewer.scene.pick(click.position);
    if(Cesium.defined(pickedObject)){
        console.log(`3DTitle经度:${lng}、维度:${lat}、高度:{height}`)
    }
},
Cesium.ScreenSpaceEventType.LEFT_CLICK)

4:可能出现的问题

        1.获取的空间坐标不准

   解决办法:开启深度检测(viewer.scene.globe.depthTestAgainstTerrain = true),否则在没有没有3dTile模型的情况下,会出现空间坐标不准的问题。

        2.坐标偏移

cesium外部容器使用了transform,造成坐标位置偏移严重

解决办法:https://juejin.cn/post/7398087074970779663

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值