1.有航向 类似于控制飞机飞行
- html>
- <html lang="en">
-
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <script src="https://cesium.com/downloads/cesiumjs/releases/1.80/Build/Cesium/Cesium.js">script>
- <link rel="stylesheet"
- href="https://cesium.com/downloads/cesiumjs/releases/1.80/Build/Cesium/Widgets/widgets.css" />
- <script src="https://cdn.bootcdn.net/ajax/libs/Turf.js/6.5.0/turf.min.js">script>
- <script src="https://cdn.jsdelivr.net/npm/@dvgis/cesium-map/dist/cesium.map.min.js">script>
- <title>Documenttitle>
- <style>
- body,
- html {
- width: 100%;
- height: 100%;
- margin: 0;
- padding: 0;
- overflow: hidden;
- }
-
- #cesiumContainer {
- width: 100%;
- height: 100%;
- margin: 0;
- padding: 0;
- overflow: hidden;
- }
-
- .lonLat {
- position: fixed;
- width: 100%;
- bottom: 0;
- /* left: 50%; */
- color: aliceblue;
- text-align: center;
- }
-
- button:focus {
- outline: none;
- /* 取消选中时的轮廓边框 */
- box-shadow: none;
- /* 取消选中时的阴影效果 */
-
- }
-
- button {
- width: 80px;
- height: 50px;
- -webkit-user-select: none;
- /* Chrome, Safari, Opera */
- -moz-user-select: none;
- /* Firefox */
- -ms-user-select: none;
- /* Internet Explorer/Edge */
- user-select: none;
- /* 此规则适用于大多数浏览器 */
- }
- style>
- head>
-
- <body>
- <div id="cesiumContainer">div>
- <div class="lonLat">
- <button class="btn1">前button>
- <button class="btn2">后button>
- <button class="btn3">左button>
- <button class="btn4">右button>
-
- <button class="rotation1">旋转heading+button>
- <button class="rotation2">旋转heading-button>
-
- <button class="openC">开启button>
- <button class="closeC">关闭button>
- div>
- <script>
- // document.oncontextmenu = new Function("event.returnValue=false");
- // document.onselectstart = new Function("event.returnValue=false");
- // document.addEventListener("keydown", function (e) {
- // console.log(e.key);
- // if (e.key == "F12") {
- // e.preventDefault(); // 如果按下键F12,阻止事件
- // }
- // });
-
-
-
- var viewer = new Cesium.Viewer("cesiumContainer", {
-
-
- geocoder: false, // 位置查找工具
- timeline: false, // 底部时间线
- homeButton: false, // 视角返回初始位置
- fullscreenButton: false, // 全屏
- animation: false, // 左下角仪表盘(动画器件)
- sceneModePicker: false, // 选择视角的模式(球体、平铺、斜视平铺)
- navigationHelpButton: false, //导航帮助按钮
- targetFrameRate: 30,
- imageryProvider: new Cesium.SingleTileImageryProvider({
- url: "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=",
- }),
- baseLayerPicker: false,
- });
-
- // 不显示底图
- // viewer.imageryLayers.get(0).show = false;
- // 去除logo
- viewer.cesiumWidget.creditContainer.style.display = "none";
-
- // 高德
- var optionsG = {
- style: 'img', // style: img、elec、cva//地标 网路
- crs: 'WGS84', // 使用84坐标系,默认为:GCJ02
- maximumLevel: 18, // 设置最大级别
- // minimumLevel: 5 // 设置最小级别
- }
- viewer.imageryLayers.add(new Cesium.ImageryLayer(new AmapImageryProvider(optionsG)))
- // // 腾讯
- // var optionsT = {
- // style: 'img' //style: img、1:经典
- // }
- // viewer.imageryLayers.add(new Cesium.ImageryLayer(new TencentImageryProvider(optionsT)))
- // 百度
- // var optionsBI = {
- // style: 'img', // style: img、vec//地标 网路、normal、dark
- // crs: 'WGS84' // 使用84坐标系,默认为:BD09
- // }
- // viewer.imageryLayers.add(new Cesium.ImageryLayer(new BaiduImageryProvider(optionsBI)))
- var optionsB = {
- style: 'vec', // style: img、vec//地标 网路、normal、dark
- crs: 'WGS84', // 使用84坐标系,默认为:BD09
- maximumLevel: 18, // 设置最大级别
- // minimumLevel: 5 // 设置最小级别
- }
- viewer.imageryLayers.add(new Cesium.ImageryLayer(new BaiduImageryProvider(optionsB)))
-
- viewer.screenSpaceEventHandler.setInputAction(movement => {
- // 方式 1
- var cartesian = viewer.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);
- if (cartesian) {
- var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
- var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(8);
- var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(8);
- let height = this.viewer.camera.positionCartographic.height.toFixed(2);
- // var point = GPS.bd09_To_Gcj02(latitudeString,longitudeString)
- // this.nowPosition = point.lon + ',' + point.lat + "," + height
- // console.log(this.nowPosition,'this.nowPosition');
- this.nowPosition = longitudeString + ',' + latitudeString + "," + height
- this.nowPositionheight = height
- console.log("LongitudeAndLatitude: " + longitudeString + "," + latitudeString + "," + height);
- var h = this.viewer.scene.camera.heading;
- var p = this.viewer.scene.camera.pitch;
- var r = this.viewer.scene.camera.roll;
- console.log("headingPitchRoll: " + h + "," + p + "," + r);
- }
- }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
-
-
- let pointDestination = Cesium.Cartesian3.fromDegrees(116.40069537, 39.96790221, 1500);//视野点
-
- viewer.scene.camera.flyTo({
- destination: pointDestination,
- orientation: {
- heading: 6.283185307179586,
- pitch: -1.5707963267948966,
- roll: 0
- }
- })
-
-
-
-
- class CameraNavigation {
- constructor(viewer) {
- this.viewer = viewer;
- this.flyDuration = 0.5
- this.clickEvent = true;
- this.moveEndHandler = null;
- this.speed = null
- this.moveSpeed = null;
- this.height = null;
- this.buttonEvent = {};
- this.rotationSpeed = 2
- this.deviceType = this.getDeviceType();
- this.initControl()
-
- this.btnSAddEventListenerName = []
- }
- getDeviceType() {
- const userAgent = navigator.userAgent;
- console.log(userAgent);
- if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(userAgent)) {
- return "平板";
- } else if (
- /(mobi|opera mini|iphone|ipod|android|blackberry|windows phone)/i.test(
- userAgent
- )
- ) {
- return "手机";
- } else {
- return "电脑";
- }
- }
- initControl() {
- this.downStart = 'touchstart';
- this.upEnd = 'touchend';
- if (this.deviceType == "电脑") {
- this.downStart = "mousedown"
- this.upEnd = "mouseup"
- }
- console.log(this.upEnd, this.downStart);
- }
-
- setupEventListeners() {
- if (this.moveSpeed) {
- this.speed = this.moveSpeed
- }
- let currentHeightInit = this.viewer.camera.positionCartographic.height;
- this.height = Math.round(currentHeightInit);
-
- // 添加高度变化监听事件
- this.moveEndHandler = () => {
- console.log(111);
- const currentHeight = this.viewer.camera.positionCartographic.height;
- this.height = Math.round(currentHeight);
- if (!this.moveSpeed) {
- this.speed = this.height / 100
- } else {
- this.speed = this.moveSpeed
- }
- }
- this.viewer.camera.moveEnd.addEventListener(this.moveEndHandler);
- console.log(this.height, 'this.height');
-
- }
- setupCameraNavigation() {
- // 定义事件处理函数
- function handleKeyDown(event) {
- console.log(event.key);
- switch (event.key) {
- // case 'ArrowUp' || 'w':
- case 'w':
- this.moveCamera("Up");
- break;
- // case 'ArrowDown' || 'd':
- case 's':
- this.moveCamera("Down");
- break;
- // case 'ArrowLeft' || 's':
- case 'a':
- this.moveCamera("Left");
- break;
- // case 'ArrowRight' || 'a':
- case 'd':
- this.moveCamera("Right");
- break;
- case 'q':
- this.rotationCamera(10);
- break;
- case 'e':
- this.rotationCamera(-10);
- break;
- default:
- break;
- }
- }
-
- // 添加键盘按下事件监听器
- document.addEventListener('keydown', handleKeyDown.bind(this));
- }
-
- removeCameraNavigation() {
- try {
- this.btnSAddEventListenerName.forEach(ele => {
- if (this.clickEvent) {
- document.querySelector(ele.id).removeEventListener('click', this.buttonEvent[ele.eventName].up, false)
- } else {
- document.querySelector(ele.id).removeEventListener(this.downStart, this.buttonEvent[ele.eventName].up, false)
- document.querySelector(ele.id).removeEventListener(this.upEnd, this.buttonEvent[ele.eventName].upEnd, false)
- }
- })
- // 移除键盘按下事件监听器
- // document.removeEventListener('keydown', this.handleKeyDown);
- // 取消高度变化监听事件
- this.viewer.camera.moveEnd.removeEventListener(this.moveEndHandler);
- this.btnSAddEventListenerName = []
- this.buttonEvent = {}
- } catch (error) {
- console.log(error, 'error');
- }
- }
-
- moveCamera(type = 'Up') {
- try {
- // 获取当前Cesium相机
- const camera = this.viewer.camera;
-
- // 获取当前相机的位置和方向
- const currentPosition = camera.positionCartographic.clone();
- const currentHeading = camera.heading;
-
- // 定义移动的距离和方向
- const distance = this.speed; // 1000米示例距离
- let bearing = Cesium.Math.toDegrees(currentHeading); // 使用当前方向
-
- switch (type) {
- case 'Up': // 向上移动
- bearing = Cesium.Math.toDegrees(currentHeading)
- break;
- case 'Down': // 向下移动
- bearing = Cesium.Math.toDegrees(currentHeading - Math.PI); // 使用当前方向
- break;
- case 'Left': // 向左移动
- bearing = Cesium.Math.toDegrees(currentHeading - Math.PI / 2); // 使用当前方向
- break;
- case 'Right': // 向右移动
- bearing = Cesium.Math.toDegrees(currentHeading + Math.PI / 2); // 使用当前方向
- break;
- default:
- break;
- }
- // 使用Turf.js计算新位置
- const destination = turf.destination(
- turf.point([Cesium.Math.toDegrees(currentPosition.longitude), Cesium.Math.toDegrees(currentPosition.latitude)]),
- distance,
- bearing,
- { units: 'meters' }
- );
- // 将新位置转换为Cesium坐标
- const newCartesian = Cesium.Cartesian3.fromDegrees(destination.geometry.coordinates[0], destination.geometry.coordinates[1], this.height);
-
- // 设置相机位置
- // camera.position = newCartesian;
-
- camera.flyTo({
- destination: newCartesian,
- orientation: {
- heading: camera.heading,
- pitch: camera.pitch,
- roll: camera.roll
- },
- duration: this.flyDuration
- })
- } catch (error) {
- console.log(error, 'error');
- }
- }
- // rotationCamera(n) {
-
- // // 获取当前相机
- // const camera = this.viewer.camera;
-
- // // 获取当前相机的方向(heading)
- // const currentHeading = camera.heading;
-
- // // 设置旋转后的方向(顺时针旋转10度)
- // const newHeading = currentHeading + Cesium.Math.toRadians(n);
-
- // // 将相机旋转到新的方向
- // camera.setView({
- // orientation: {
- // heading: newHeading,
- // pitch: camera.pitch,
- // roll: camera.roll,
- // },
- // });
- // }
- rotationCamera(n) {
- let centerScreen = this.getScreenCenterCoordinates();
- console.log(centerScreen, 'getScreenCenterCoordinates');
- // 获取当前相机
- const camera = this.viewer.camera;
- // console.log(camera.position, 'camera');
-
- let p = this.Cartesian3_to_WGS84(camera.position)
- // console.log(p, 'ppp');
- // 获取当前相机的方向(heading)
- var point1 = turf.point(centerScreen);
- var point2 = turf.point(p);
- var options = { units: 'meters' };
- var bearing = turf.bearing(point1, point2);
- var bearing1 = turf.bearing(point2, point1);
- // console.log(bearing, bearing1, 'bearing1bearing1');
- var distance = turf.distance(point1, point2, options);
- // console.log(Cesium.Math.toRadians(n), 'Cesium.Math.toRadians(n)Cesium.Math.toRadians(n)');
- let newBearing = bearing - Cesium.Math.toRadians(n);
- console.log(newBearing, 'newBearing');
-
- var destination = turf.destination(point1, distance, newBearing, options);
- let newP = destination.geometry.coordinates
- newP.push(p[2])
- // console.log(newP, 'destination');
- const currentHeading = camera.heading;
- const newHeading = currentHeading + Cesium.Math.toRadians(n / 15);
- if (Math.abs(newBearing) < 4) {
- camera.setView({
- orientation: {
- heading: newHeading,
- pitch: camera.pitch,
- roll: camera.roll,
- },
- });
- return null
- }
- // console.log(currentHeading,'currentHeading');
- let bearingCamera = 0;
- if (newBearing >= 0) {
- bearingCamera = newBearing - 180
- } else {
- bearingCamera = newBearing + 180
- }
- // 将相机旋转到新的方向
- camera.setView({
- destination: Cesium.Cartesian3.fromDegrees(newP[0], newP[1], newP[2]),
- orientation: {
- heading: Cesium.Math.toRadians(bearingCamera),
- pitch: camera.pitch,
- roll: camera.roll,
- },
- });
- }
- Cartesian3_to_WGS84(point) {
- var cartesian3 = new Cesium.Cartesian3(point.x, point.y, point.z);
- var cartographic = Cesium.Cartographic.fromCartesian(cartesian3);
- var lat = Cesium.Math.toDegrees(cartographic.latitude);
- var lng = Cesium.Math.toDegrees(cartographic.longitude);
- var alt = cartographic.height.toFixed(2);
- return [
- lng,
- lat,
- alt,
- ];
- // return {
- // lng: lng,
- // lat: lat,
- // alt: alt,
- // };
- }
- //屏幕中点经纬度坐标
- getScreenCenterCoordinates() {
- // 范围对象
- let coordinates = undefined;
-
- // 得到当前三维场景
- let scene = this.viewer.scene;
-
- // 得到当前三维场景的椭球体
- let ellipsoid = scene.globe.ellipsoid;
-
- // 通过scene获取canvas长宽
- // let canvas = scene.canvas;
- // const canvasWidth = canvas.width;
- // const canvasHeight = canvas.height;
-
- 改为获取body长宽 ,通过scene获取canvas在其他分辨率下存在兼容性问题
- const canvasWidth = document.body.clientWidth;
- const canvasHeight = document.body.clientHeight;
-
- // canvas中点
- let car3_center = this.viewer.camera.pickEllipsoid(new Cesium.Cartesian2(canvasWidth / 2, canvasHeight / 2), ellipsoid);
- let xcarto_center = undefined;
- let ycarto_center = undefined;
- // 当canvas中点在椭球体上
- if (car3_center) {
- let carto_center = ellipsoid.cartesianToCartographic(car3_center);
- xcarto_center = Cesium.Math.toDegrees(carto_center.longitude);
- ycarto_center = Cesium.Math.toDegrees(carto_center.latitude);
- }
-
- // 获取高度
- let height = (this.viewer.camera.positionCartographic.height).toFixed(2);
- coordinates = [xcarto_center, ycarto_center, height];
- return coordinates;
- }
- addButtonTransformEvent(id, eventName) {
- try {
- let timer = null
- let button = document.querySelector(id);
- let eventNameString = eventName;
- let findObj = this.btnSAddEventListenerName.find(ele => ele.id == id)
- if (findObj) {
- return
- } {
- this.btnSAddEventListenerName.push({
- id: id,
- eventName: eventName
- })
- }
- if (button) {
- if (this.clickEvent) {
- this.buttonEvent[eventName] = {}
- this.buttonEvent[eventName].up = () => {
- if (eventNameString == "moveForward") {
- this.moveCamera("Up");
- } else if (eventNameString == "moveBackward") {
- this.moveCamera("Down");
- }
- else if (eventNameString == "moveLeft") {
- this.moveCamera("Left");
- }
- else if (eventNameString == "moveRight") {
- this.moveCamera("Right");
- }
- else if (eventNameString == "rotation+") {
- this.rotationCamera(this.rotationSpeed);
- }
- else if (eventNameString == "rotation-") {
- this.rotationCamera(-this.rotationSpeed);
- }
-
- }
- button.addEventListener("click", this.buttonEvent[eventName].up, false)
- }
- else {
- this.buttonEvent[eventName] = {}
- this.buttonEvent[eventName].up = () => {
- if (timer) {
- clearInterval(timer)
- }
-
- timer = setInterval(() => {
- console.log('按钮被按下!');
- if (eventNameString == "moveForward") {
- this.moveCamera("Up");
- } else if (eventNameString == "moveBackward") {
- this.moveCamera("Down");
- }
- else if (eventNameString == "moveLeft") {
- this.moveCamera("Left");
- }
- else if (eventNameString == "moveRight") {
- this.moveCamera("Right");
- }
- else if (eventNameString == "rotation+") {
- this.rotationCamera(this.rotationSpeed);
- }
- else if (eventNameString == "rotation-") {
- this.rotationCamera(-this.rotationSpeed);
- }
- }, 30);
- console.log(eventNameString, 'eventName');
- }
- button.addEventListener(this.downStart, this.buttonEvent[eventName].up, false)
- this.buttonEvent[eventName].upEnd = () => {
- clearInterval(timer)
- console.log('按钮被松开!');
- }
- button.addEventListener(this.upEnd, this.buttonEvent[eventName].upEnd, false);
- }
- }
- } catch (error) {
- console.log(error, 'error');
- }
-
- }
- }
-
- const cameraNavigation = new CameraNavigation(viewer);
- document.querySelector('.openC').addEventListener("click", () => {
- // cameraNavigation.clickEvent = false;
- cameraNavigation.moveSpeed = 100 // 移动速度 默认是当前相机高度/100的速度
- cameraNavigation.rotationSpeed = 180// 旋转速度 默认是2度每次
- cameraNavigation.setupEventListeners();
- cameraNavigation.addButtonTransformEvent('.btn1', 'moveForward')
- cameraNavigation.addButtonTransformEvent('.btn2', 'moveBackward')
- cameraNavigation.addButtonTransformEvent('.btn3', 'moveLeft')
- cameraNavigation.addButtonTransformEvent('.btn4', 'moveRight')
- cameraNavigation.addButtonTransformEvent('.rotation1', 'rotation+')
- cameraNavigation.addButtonTransformEvent('.rotation2', 'rotation-')
- });
-
- document.querySelector('.closeC').addEventListener("click", () => {
- cameraNavigation.removeCameraNavigation();
- });
-
-
-
-
-
-
-
-
- script>
- body>
-
- html>
2.
2. 同高度飞行,通过航向角计算封装
- html>
- <html lang="en">
-
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <script src="https://cesium.com/downloads/cesiumjs/releases/1.80/Build/Cesium/Cesium.js">script>
- <link rel="stylesheet"
- href="https://cesium.com/downloads/cesiumjs/releases/1.80/Build/Cesium/Widgets/widgets.css" />
- <script src="https://cdn.bootcdn.net/ajax/libs/Turf.js/6.5.0/turf.min.js">script>
- <script src="https://cdn.jsdelivr.net/npm/@dvgis/cesium-map/dist/cesium.map.min.js">script>
- <title>Documenttitle>
- <style>
- body,
- html {
- width: 100%;
- height: 100%;
- margin: 0;
- padding: 0;
- overflow: hidden;
- }
-
- #cesiumContainer {
- width: 100%;
- height: 100%;
- margin: 0;
- padding: 0;
- overflow: hidden;
- }
-
- .lonLat {
- position: fixed;
- width: 100%;
- bottom: 0;
- /* left: 50%; */
- color: aliceblue;
- text-align: center;
- }
-
- button:focus {
- outline: none;
- /* 取消选中时的轮廓边框 */
- box-shadow: none;
- /* 取消选中时的阴影效果 */
-
- }
-
- button {
- width: 80px;
- height: 50px;
- -webkit-user-select: none;
- /* Chrome, Safari, Opera */
- -moz-user-select: none;
- /* Firefox */
- -ms-user-select: none;
- /* Internet Explorer/Edge */
- user-select: none;
- /* 此规则适用于大多数浏览器 */
- }
- style>
- head>
-
- <body>
- <div id="cesiumContainer">div>
- <div class="lonLat">
- <div>
- <button class="openC">开启button>
- <button class="closeC">关闭button>
-
- div>
- <button class="btn1">前button>
- <button class="btn2">后button>
- <button class="btn3">左button>
- <button class="btn4">右button>
-
- <button class="rotation1">旋转heading+button>
- <button class="rotation2">旋转heading-button>
-
- div>
- <script>
- // document.oncontextmenu = new Function("event.returnValue=false");
- // document.onselectstart = new Function("event.returnValue=false");
- // document.addEventListener("keydown", function (e) {
- // console.log(e.key);
- // if (e.key == "F12") {
- // e.preventDefault(); // 如果按下键F12,阻止事件
- // }
- // });
-
- // function getDeviceType() {
- // const userAgent = navigator.userAgent;
- // console.log(userAgent);
- // if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(userAgent)) {
- // return "平板";
- // } else if (
- // /(mobi|opera mini|iphone|ipod|android|blackberry|windows phone)/i.test(
- // userAgent
- // )
- // ) {
- // return "手机";
- // } else {
- // return "电脑";
- // }
- // }
-
- // // 使用示例
- // const deviceType = getDeviceType();
-
-
-
- // console.log("设备类型:", deviceType);
-
- var viewer = new Cesium.Viewer("cesiumContainer", {
-
-
- geocoder: false, // 位置查找工具
- timeline: false, // 底部时间线
- homeButton: false, // 视角返回初始位置
- fullscreenButton: false, // 全屏
- animation: false, // 左下角仪表盘(动画器件)
- sceneModePicker: false, // 选择视角的模式(球体、平铺、斜视平铺)
- navigationHelpButton: false, //导航帮助按钮
- targetFrameRate: 30,
- imageryProvider: new Cesium.SingleTileImageryProvider({
- url: "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=",
- }),
- baseLayerPicker: false,
- });
-
- // 不显示底图
- // viewer.imageryLayers.get(0).show = false;
- // 去除logo
- viewer.cesiumWidget.creditContainer.style.display = "none";
-
- // 高德
- var optionsG = {
- style: 'img', // style: img、elec、cva//地标 网路
- crs: 'WGS84', // 使用84坐标系,默认为:GCJ02
- maximumLevel: 18, // 设置最大级别
- // minimumLevel: 5 // 设置最小级别
- }
- viewer.imageryLayers.add(new Cesium.ImageryLayer(new AmapImageryProvider(optionsG)))
- // // 腾讯
- // var optionsT = {
- // style: 'img' //style: img、1:经典
- // }
- // viewer.imageryLayers.add(new Cesium.ImageryLayer(new TencentImageryProvider(optionsT)))
- // 百度
- // var optionsBI = {
- // style: 'img', // style: img、vec//地标 网路、normal、dark
- // crs: 'WGS84' // 使用84坐标系,默认为:BD09
- // }
- // viewer.imageryLayers.add(new Cesium.ImageryLayer(new BaiduImageryProvider(optionsBI)))
- var optionsB = {
- style: 'vec', // style: img、vec//地标 网路、normal、dark
- crs: 'WGS84', // 使用84坐标系,默认为:BD09
- maximumLevel: 18, // 设置最大级别
- // minimumLevel: 5 // 设置最小级别
- }
- viewer.imageryLayers.add(new Cesium.ImageryLayer(new BaiduImageryProvider(optionsB)))
-
- viewer.screenSpaceEventHandler.setInputAction(movement => {
- // 方式 1
- var cartesian = viewer.camera.pickEllipsoid(movement.position, viewer.scene.globe.ellipsoid);
- if (cartesian) {
- var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
- var longitudeString = Cesium.Math.toDegrees(cartographic.longitude).toFixed(8);
- var latitudeString = Cesium.Math.toDegrees(cartographic.latitude).toFixed(8);
- let height = this.viewer.camera.positionCartographic.height.toFixed(2);
- // var point = GPS.bd09_To_Gcj02(latitudeString,longitudeString)
- // this.nowPosition = point.lon + ',' + point.lat + "," + height
- // console.log(this.nowPosition,'this.nowPosition');
- this.nowPosition = longitudeString + ',' + latitudeString + "," + height
- this.nowPositionheight = height
- console.log("LongitudeAndLatitude: " + longitudeString + "," + latitudeString + "," + height);
- var h = this.viewer.scene.camera.heading;
- var p = this.viewer.scene.camera.pitch;
- var r = this.viewer.scene.camera.roll;
- console.log("headingPitchRoll: " + h + "," + p + "," + r);
- }
- }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
-
-
- let pointDestination = Cesium.Cartesian3.fromDegrees(116.40069537, 39.96790221, 1500);//视野点
-
- viewer.scene.camera.flyTo({
- destination: pointDestination,
- orientation: {
- heading: 6.283185307179586,
- pitch: -1.5707963267948966,
- roll: 0
- }
- })
-
-
- class CameraNavigation {
- constructor(viewer) {
- this.viewer = viewer;
- this.moveEndHandler = null;
- this.speed = null
- this.moveSpeed = null;
- this.height = null;
- this.buttonEvent = {};
- this.rotationSpeed = 2
- this.deviceType = this.getDeviceType();
- this.initControl()
-
- this.btnSAddEventListenerName = []
- }
- getDeviceType() {
- const userAgent = navigator.userAgent;
- console.log(userAgent);
- if (/(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(userAgent)) {
- return "平板";
- } else if (
- /(mobi|opera mini|iphone|ipod|android|blackberry|windows phone)/i.test(
- userAgent
- )
- ) {
- return "手机";
- } else {
- return "电脑";
- }
- }
- initControl() {
- this.downStart = 'touchstart';
- this.upEnd = 'touchend';
- if (this.deviceType == "电脑") {
- this.downStart = "mousedown"
- this.upEnd = "mouseup"
- }
- console.log( this.upEnd, this.downStart);
- }
-
- setupEventListeners() {
- let currentHeightInit = this.viewer.camera.positionCartographic.height;
- this.height = Math.round(currentHeightInit);
- // 添加高度变化监听事件
- this.moveEndHandler = () => {
- console.log(111);
- const currentHeight = this.viewer.camera.positionCartographic.height;
- this.height = Math.round(currentHeight);
- if (!this.moveSpeed) {
- this.speed = this.height/100
- }else {
- this.speed = this.moveSpeed
- }
- }
- this.viewer.camera.moveEnd.addEventListener(this.moveEndHandler);
- console.log(this.height,'this.height');
-
- }
- setupCameraNavigation() {
- // 定义事件处理函数
- this.handleKeyDown =(event)=> {
- console.log(event.key);
- switch (event.key) {
- // case 'ArrowUp' || 'w':
- case 'w':
- this.moveCamera("Up");
- break;
- // case 'ArrowDown' || 'd':
- case 's':
- this.moveCamera("Down");
- break;
- // case 'ArrowLeft' || 's':
- case 'a':
- this.moveCamera("Left");
- break;
- // case 'ArrowRight' || 'a':
- case 'd':
- this.moveCamera("Right");
- break;
- case 'q':
- this.rotationCamera(10);
- break;
- case 'e':
- this.rotationCamera(-10);
- break;
- default:
- break;
- }
- }
-
- // 添加键盘按下事件监听器
- document.addEventListener('keydown', this.handleKeyDown);
- }
-
- removeCameraNavigation() {
- this.btnSAddEventListenerName.forEach(ele=>{
- document.querySelector(ele.id).removeEventListener(this.downStart,this.buttonEvent[ele.eventName].up, false)
- document.querySelector(ele.id).removeEventListener(this.upEnd,this.buttonEvent[ele.eventName].upEnd, false)
- })
- // 移除键盘按下事件监听器
- if (this.handleKeyDown) {
- document.removeEventListener('keydown', this.handleKeyDown);
- }
- // 取消高度变化监听事件
- this.viewer.camera.moveEnd.removeEventListener(this.moveEndHandler);
- this.btnSAddEventListenerName =[]
- this.buttonEvent = {}
- }
-
- moveCamera(type = 'Up') {
- // 获取当前Cesium相机
- const camera = this.viewer.camera;
-
- // 获取当前相机的位置和方向
- const currentPosition = camera.positionCartographic.clone();
- const currentHeading = camera.heading;
-
- // 定义移动的距离和方向
- const distance = this.speed; // 1000米示例距离
- let bearing = Cesium.Math.toDegrees(currentHeading); // 使用当前方向
-
- switch (type) {
- case 'Up': // 向上移动
- bearing = Cesium.Math.toDegrees(currentHeading)
- break;
- case 'Down': // 向下移动
- bearing = Cesium.Math.toDegrees(currentHeading - Math.PI); // 使用当前方向
- break;
- case 'Left': // 向左移动
- bearing = Cesium.Math.toDegrees(currentHeading - Math.PI / 2); // 使用当前方向
- break;
- case 'Right': // 向右移动
- bearing = Cesium.Math.toDegrees(currentHeading + Math.PI / 2); // 使用当前方向
- break;
- default:
- break;
- }
- // 使用Turf.js计算新位置
- const destination = turf.destination(
- turf.point([Cesium.Math.toDegrees(currentPosition.longitude), Cesium.Math.toDegrees(currentPosition.latitude)]),
- distance,
- bearing,
- { units: 'meters' }
- );
- // 将新位置转换为Cesium坐标
- const newCartesian = Cesium.Cartesian3.fromDegrees(destination.geometry.coordinates[0], destination.geometry.coordinates[1], this.height);
-
- // 设置相机位置
- camera.position = newCartesian;
- }
- rotationCamera(n) {
-
- // 获取当前相机
- const camera = this.viewer.camera;
-
- // 获取当前相机的方向(heading)
- const currentHeading = camera.heading;
-
- // 设置旋转后的方向(顺时针旋转10度)
- const newHeading = currentHeading + Cesium.Math.toRadians(n);
-
- // 将相机旋转到新的方向
- camera.setView({
- orientation: {
- heading: newHeading,
- pitch: camera.pitch,
- roll: camera.roll,
- },
- });
- }
- addButtonTransformEvent(id, eventName) {
- let timer = null
- let button = document.querySelector(id);
- let eventNameString =eventName;
- let findObj = this.btnSAddEventListenerName.find(ele=>ele.id== id)
- if (findObj) {
- return
- }{
- this.btnSAddEventListenerName.push({
- id:id,
- eventName:eventName
- })
- }
- if (button) {
- this.buttonEvent[eventName] = {}
- this.buttonEvent[eventName].up = () => {
- if (timer) {
- clearInterval(timer)
- }
-
- timer = setInterval(() => {
- console.log('按钮被按下!');
- if (eventNameString == "moveForward") {
- this.moveCamera("Up");
- }else if (eventNameString == "moveBackward") {
- this.moveCamera("Down");
- }
- else if (eventNameString == "moveLeft") {
- this.moveCamera("Left");
- }
- else if (eventNameString == "moveRight") {
- this.moveCamera("Right");
- }
- else if (eventNameString == "rotation+") {
- this.rotationCamera(this.rotationSpeed) ;
- }
- else if (eventNameString == "rotation-") {
- this.rotationCamera(-this.rotationSpeed) ;
- }
- }, 30);
- console.log(eventNameString, 'eventName');
- }
- button.addEventListener(this.downStart,this.buttonEvent[eventName].up, false)
- this.buttonEvent[eventName].upEnd = () => {
- clearInterval(timer)
- console.log('按钮被松开!');
- }
- button.addEventListener(this.upEnd,this.buttonEvent[eventName].upEnd, false);
- }
-
- }
- }
-
- // 使用示例
- const cameraNavigation = new CameraNavigation(viewer);
- document.querySelector('.openC').addEventListener("click", () => {
- cameraNavigation.setupCameraNavigation()
- // cameraNavigation.moveSpeed = 100 // 移动速度 默认是当前相机高度/100的速度
- cameraNavigation.rotationSpeed = 0.2// 旋转速度 默认是2度每次
- cameraNavigation.setupEventListeners();
- cameraNavigation.addButtonTransformEvent('.btn1', 'moveForward')
- cameraNavigation.addButtonTransformEvent('.btn2', 'moveBackward')
- cameraNavigation.addButtonTransformEvent('.btn3', 'moveLeft')
- cameraNavigation.addButtonTransformEvent('.btn4', 'moveRight')
- cameraNavigation.addButtonTransformEvent('.rotation1', 'rotation+')
- cameraNavigation.addButtonTransformEvent('.rotation2', 'rotation-')
- });
-
- document.querySelector('.closeC').addEventListener("click", () => {
- cameraNavigation.removeCameraNavigation();
- });
- script>
- body>
-
- html>