第五天:今天讲一下获取坐标和初始点位

421 阅读3分钟

首先新建鼠标事件

let handler = new Cesium.screenSpaceEventHandler(viewer.scene.canvas)
handler.setInputAction(function(moment){
    // <1> 获取屏幕坐标
    console.log(moment.position)
    
    // <2> 通过屏幕坐标获取点击位的椭球面坐标  (世界坐标)
    let position = viewer.scene.camera.pickEllipsoid(
        moment.position, viewer.scene.globe.ellipsoid
    )
    
    // <3> 通过屏幕坐标获取地形加载后的经纬度和高程  (地标坐标)
    // 创建相机位置到屏幕坐标的射线捕捉,这里和threejs里的射线捕捉很像,有空再研究一下
    let ray = viewer.camera.getPickRay(moment.position)
    let position = viewer.scene.globe.pick(ray, viewer.scene)
    
    // <4> 获取倾斜摄影或模型点击后的坐标  (场景坐标)
    // 因为自己刚开始项目中用的这种方法,结果自己用的时候导致一直获取不到屏幕坐标,特别烦,不知道原因,因为没有场景,所以是获取不到位置的,一直在找别的问题,如果你有幸看到,希望帮的到你
    let position = viewer.scene.pickPosition(moment.position)
})

添加初始位置

// 设置初始位置的椭球体 参数为坐标加半径
let boundingSphere = new Cesium.BoundingSphere(
    Cesium.Cartesian3.fromDegrees(114.20675959266403,30.410971965298703,0),
    150
);
// 将相机移到当前视图包含所提供的包围球的位置
this.viewer.camera.flyToBoundingSphere(boundingSphere, {
    orientation: {
        heading: 6.283185307179579,
        pitch: -1.5687883056041918,
        roll: 0,
    },
    // 定位到初始位置的过渡时间,设置成0,就没有过渡,类似一个过场的动画时长
    duration: 0,
});

内容不够,那就加一点Cesium 常用事件(鼠标事件、相机事件、键盘事件、场景触发事件)

  1. 鼠标事件(键盘事件)new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
// 鼠标事件

LEFT_DOWN	        鼠标左键按下
LEFT_UP 	        鼠标左键弹起
LEFT_CLICK	        鼠标左键点击
LEFT_DOUBLE_CLICK	鼠标左键双击
RIGHT_DOWN	        鼠标右键按下
RIGHT_UP	        鼠标右键弹起
RIGHT_CLICK	        鼠标右键单击
MIDDLE_DOWN	        鼠标中键按下
MIDDLE_UP	        鼠标中键弹起
MIDDLE_CLICK	        鼠标中键点击
MOUSE_MOVE	        鼠标移动事件。
WHEEL	                鼠标滚轮滚动
PINCH_START	        触控屏上双指开始事件
PINCH_END	        触控屏上双指结束事件
PINCH_MOVE              触控屏上双指移动事件

// 键盘修饰符(键盘修饰符不可以单独使用,需要配合鼠标输入事件使用)

SHIFT	                shift键被按住
CTRL	                ctrl键被按住
ALT	                alt键被按住
// 例如
let handler = new Cesium.screenSpaceEventHandler(viewer.scene.canvas)
handler.setInputAction(function(event){
    console.log('shift + 左键单击', event.position);
}, Cesium.ScreenSpaceEventType.LEFT_CLICK, Cesium.KeyboardEventModifier.SHIFT)

// 移除屏幕空间事件 
handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK, Cesium.KeyboardEventModifier.SHIFT)

  1. 相机事件viewer.scene.screenSpaceCameraController()
// 相机事件

LEFT_DRAG	        鼠标左键按住,然后移动鼠标并松开按键。
RIGHT_DRAG	        鼠标右键按住,然后移动鼠标并松开按键。
MIDDLE_DRAG	        鼠标中键按住,然后移动鼠标并松开按键。
WHEEL	                滚动鼠标中键滚轮。
PINCH	                双指触控屏幕。

// 相机事件的属性(用来修改默认操作模式)
lookEventTypes	        3D视图、2.5D视图改变相机观察方向
rotateEventTypes	3D视图相机绕地球旋转
tiltEventTypes	        3D视图、2.5D视图倾斜视角
translateEventTypes	2.5D视图、2D视图地图上平移
zoomEventTypes	        地图缩放
inertiaTranslate        移动惯性
inertiaSpin             旋转惯性

// 例如
//设置操作习惯(禁止中间滑轮旋转视角)  允许用户放大/缩小的输入。   //鼠标滑轮与两指缩放
viewer.scene.screenSpaceCameraController.zoomEventTypes = [
    Cesium.CameraEventType.WHEEL, Cesium.CameraEventType.PINCH
]
//允许用户以3D和Columbus视图倾斜(旋转)或以2D扭曲的输入。  //按下鼠标右键与两指拖拽
viewer.scene.screenSpaceCameraController.tiltEventTypes = [
    Cesium.CameraEventType.PINCH, Cesium.CameraEventType.LEFT_DRAG
]
// 将原来鼠标左键拖动平移视图修改为鼠标右键拖动
viewer.scene.screenSpaceCameraController.rotateEventTypes =   [Cesium.CameraEventType.RIGHT_DRAG]

//相机平移旋转惯性为0
viewer.scene.screenSpaceCameraController.inertiaTranslate = 0;
viewer.scene.screenSpaceCameraController.inertiaSpin = 0;

  1. 常用场景触发事件
-   Cesium3DTileset.allTilesLoaded:           所有3dtiles数据加载完成以后触发
-   Cesium3DTileset.loadProgress               3dtiles初始化加载过程中触发
-   Cesium3DTileset.tileFailed                 3dtiles瓦片加载失败时触发
-   Cesium3DTileset-initialTilesLoaded         3dtiles瓦片初始加载触发
-   Cesium3DTileset-tileLoad                   遍历瓦片集(tileset)期间被触发

-   Clock-onStop                               当时间到达 Clock#stopTime 时触发的事件
-   Clock-onTick                               当 Clock#tick函数被调用时触发的事件。Viewer初始化时会绑定clock.onTick事件,确保每一帧都会调用