cesium 平滑切换二三维
很多人用sceneMode 来进行二三维切换 ,其实这样不好用,位置什么的 图层状态都不好绑定,给人体验非常差
对于arcgis 引擎 可以锁视角实现平滑切换,mapbox 引擎也可以锁视角实现,但是对于cesium 也是可以的
首先我们要知道获取中心点方法
-
function getCenter(viewer: any) {
-
// debugger
-
const scene = viewer.scene;
-
const target = pickCenterPoint(scene);
-
let bestTarget = target;
-
-
const globe = scene.globe;
-
const carto = scene.camera.positionCartographic.clone();
-
const height = globe.getHeight(carto);
-
carto.height = height || 0;
-
bestTarget = Cesium.Ellipsoid.WGS84.cartographicToCartesian(carto);
-
-
const result = formatPosition(bestTarget);
-
-
// 获取地球中心点世界位置 与 摄像机的世界位置 之间的距离
-
const distance = Cesium.Cartesian3.distance(bestTarget, viewer.scene.camera.positionWC);
-
result.cameraZ = distance;
-
return result;
-
}
-
-
function pickCenterPoint(scene: any) {
-
const canvas = scene.canvas;
-
const center = new Cesium.Cartesian2(canvas.clientWidth / 2, canvas.clientHeight / 2);
-
const ray = scene.camera.getPickRay(center);
-
const target = scene.globe.pick(ray, scene);
-
return target || scene.camera.pickEllipsoid(center);
-
}
-
-
function formatPosition(position) {
-
const carto = Cesium.Cartographic.fromCartesian(position);
-
const result = {};
-
result.y = formatNum(Cesium.Math.toDegrees(carto.latitude), 6);
-
result.x = formatNum(Cesium.Math.toDegrees(carto.longitude), 6);
-
result.z = formatNum(carto.height, 2);
-
return result;
-
}
-
-
function formatNum(num, digits) {
-
return Number(num.toFixed(digits || 0));
-
}
第二我们要知道屏幕中心点位置
-
function getScreenCenter(_viewer: any) {
-
const viewer = _viewer;
-
const result = viewer.camera.pickEllipsoid(new Cesium.Cartesian2(viewer.canvas.clientWidth / 2, viewer.canvas.clientHeight / 2));
-
const curPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(result);
-
const lon = (curPosition.longitude * 180) / Math.PI;
-
const lat = (curPosition.latitude * 180) / Math.PI;
-
const height = curPosition.height;
-
return {
-
x: lon,
-
y: lat
-
};
-
}
下面我们来定义调用切换二三维的方法, 其中mapType 我定义为mapView和sceneView类型, 哈哈学习arcgis模式
```javascript
type mapType = 'mapView' | 'sceneView';
public changeSV23D(viewer: any, type: mapType) {
const viewer = viewer;
const result: any = getCenter(viewer);
const curPosition = getScreenCenter(viewer);
const center = Cesium.Cartesian3.fromDegrees(curPosition.x, curPosition.y);
if (type === 'sceneView') {
if (viewer.view === 'sceneView') {
return;
}
viewer.scene.screenSpaceCameraController.enableTilt = true;
viewer.view = 'sceneView';
let x = -90;
let pitch;
const range = result.cameraZ * 1.2;
更多参考 https://xiaozhuanlan.com/topic/7459016328
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程