• Cesium屏幕中心坐标和相机位置坐标计算


    1.获取当前屏幕中心点的位置

    1. getCenterPosition() {
    2. let centerResult = viewer.camera.pickEllipsoid(
    3. new Cesium.Cartesian2(
    4. viewer.canvas.clientWidth / 2,
    5. viewer.canvas.clientHeight / 2,
    6. ),
    7. )
    8. centerPoint = centerResult;
    9. let curPosition = Cesium.Ellipsoid.WGS84.cartesianToCartographic(centerResult);
    10. let curLongitude = (curPosition.longitude * 180) / Math.PI;
    11. let curLatitude = (curPosition.latitude * 180) / Math.PI;
    12. return {
    13. lon: curLongitude,
    14. lat: curLatitude,
    15. }
    16. // }
    17. }

    2.获取当前相机的位置

    1. getCameraPosition() {
    2. var position = viewer.scene.camera.positionCartographic;
    3. // 弧度转经纬度
    4. var longitude = Cesium.Math.toDegrees(position.longitude);
    5. var latitude = Cesium.Math.toDegrees(position.latitude);
    6. var height = position.height;
    7. return { lng: longitude, lat: latitude, h: height }
    8. }

    3.计算相机到屏幕中心点的距离

    1. // 获取相机位置坐标
    2. let a = this.getCenterPosition();
    3. // 获取屏幕中心点位置坐标
    4. let b = this.getCameraPosition();
    5. let clickPosition1 = Cesium.Cartesian3.fromDegrees(a.lon, a.lat, 0);
    6. let clickPosition2 = Cesium.Cartesian3.fromDegrees(b.lng, b.lat, b.h);
    7. // 计算两个点之间的距离
    8. let distancetemp = Cesium.Cartesian3.distance(clickPosition1, clickPosition2);
    9. console.log('屏幕到地图中心距离:', distancetemp)

    4.绕非固定屏幕中心点旋转

    moveRotation方法参数中第一个参数step是移动步长,第二个参数i是判断是否是俯仰角还是航向角进行绕中心点进行翻滚,entity可以另外分离出来做一个方法,这样避免每次调用moveRotation方法都生成一个entity覆盖物。

    1. moveRotation(step, i = 0) {
    2. // 添加实体
    3. let a = this.getCenterPosition();
    4. let b = this.getCameraPosition();
    5. entity = viewer.entities.add({
    6. position: new Cesium.Cartesian3.fromDegrees(a.lon, a.lat, 0),
    7. point: {
    8. pixelSize: 0,
    9. // show: false
    10. }
    11. });
    12. let clickPosition1 = Cesium.Cartesian3.fromDegrees(a.lon, a.lat, 0);
    13. let clickPosition2 = Cesium.Cartesian3.fromDegrees(b.lng, b.lat, b.h);
    14. // 计算两个点之间的距离
    15. let distancetemp = Cesium.Cartesian3.distance(clickPosition1, clickPosition2);
    16. // 距离远一些就将移动角度调整大一些
    17. if (i && distancetemp > 20000) {
    18. heading += 3 * step;
    19. } else if (i) {
    20. heading += step;
    21. } else if (!i && distancetemp > 20000) {
    22. pitch += 3 * step;
    23. } else if (!i) {
    24. pitch += step;
    25. }
    26. let offset = new Cesium.HeadingPitchRange(
    27. heading,
    28. pitch,
    29. distancetemp // 相机距离地球球心的距离
    30. );
    31. viewer.zoomTo(entity, offset);
    32. }

    5.相机位置在原地据法向量升起和下降 

    该方法的参数distance接受正负数,对应上升和下降

    1. moveForward(distance) {
    2. var camera = viewer.camera;
    3. var direction = camera.direction;
    4. //获得此位置默认的向上方向
    5. var up = Cesium.Cartesian3.normalize(camera.position, new Cesium.Cartesian3());
    6. var right = Cesium.Cartesian3.cross(direction, up, new Cesium.Cartesian3());
    7. direction = Cesium.Cartesian3.cross(up, right, new Cesium.Cartesian3());
    8. direction = Cesium.Cartesian3.normalize(direction, direction);
    9. direction = Cesium.Cartesian3.multiplyByScalar(direction, distance, direction);
    10. camera.position = Cesium.Cartesian3.add(camera.position, direction, camera.position);
    11. }

  • 相关阅读:
    部署LVS-DR+Keepalived高可用群集构建
    Android 12 S 系统开机流程分析(一)
    南卡电容笔和益博思哪个更好用?平板电脑值得入手电容笔对比
    BSCI企业社会责任准则有哪些?
    Spring源码解析—— AOP代理的生成
    java+idea+mysql采用医疗AI自然语言处理技术的3D智能导诊导系统源码
    CAN总线协议测试拓扑图
    【JavaWeb】CSS
    数字验证学习笔记——SystemVerilog芯片验证10 ——类的成员
    whylogs工具库的工业实践!机器学习模型流程与效果监控 ⛵
  • 原文地址:https://blog.csdn.net/qq_48273925/article/details/133949731