Cesium双击放大地图

实现效果

注册鼠标点击事件

javascript 复制代码
import * as Cesium from "cesium";
import ZoomControl from "./zoomControl";

export default function initHandler(viewer) {
  let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);

  let lastClickTime = 0;
  const doubleClickThreshold = 300; // 双击时间间隔(毫秒)

  handler.setInputAction((event) => {
    const currentTime = Date.now();

    // 移动端自定义双击事件
    if (currentTime - lastClickTime < doubleClickThreshold) {
      // 获取双击位置的笛卡尔坐标
      const cartesian = viewer.camera.pickEllipsoid(
        event.position,
        viewer.scene.globe.ellipsoid
      );
      ZoomControl.doubleClickZoomIn(viewer, cartesian);
    }

    lastClickTime = currentTime;
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}

zoomControl.js

js 复制代码
import { defined, Ray, IntersectionTests, Cartesian3, SceneMode } from "cesium";

let focus;
const rayScratch = new Ray();
var cartesian3Scratch = new Cartesian3();
export default class ZoomControl {
  static zoomIn(viewer) {
    this.zoom(viewer, 1 / 2);
  }

  static zoomOut(viewer) {
    this.zoom(viewer, 2);
  }

  static doubleClickZoomIn(viewer, cartesian) {
    focus = cartesian;
    this.zoomIn(viewer);
  }

  static zoom(viewer, dire) {
    const scene = viewer.scene;
    const sscc = scene.screenSpaceCameraController;

    if (!sscc.enableInputs || !sscc.enableZoom) {
      return;
    }

    const camera = scene.camera;
    let orientation;

    switch (scene.mode) {
      case SceneMode.MORPHING:
        break;
      case SceneMode.SCENE2D:
        camera.zoomIn(camera.positionCartographic.height * (1 - dire));
        break;
      default:
        if (defined(viewer.trackedEntity)) {
          focus = new Cartesian3();
        } else {
          if (!defined(focus)) {
            // 获取相机焦点
            rayScratch.origin = camera.positionWC;
            rayScratch.direction = camera.directionWC;

            let result = new Cartesian3();
            scene.globe.pick(rayScratch, scene, result);

            result = camera.worldToCameraCoordinatesPoint(result, result);

            focus = result;
          }
        }

        if (!defined(focus)) {
          //相机方向不指向地球仪,因此使用椭球地平线点作为焦点。
          var ray = new Ray(
            camera.worldToCameraCoordinatesPoint(
              scene.globe.ellipsoid.cartographicToCartesian(
                camera.positionCartographic
              )
            ),
            camera.directionWC
          );
          focus = IntersectionTests.grazingAltitudeLocation(
            ray,
            scene.globe.ellipsoid
          );

          orientation = {
            heading: camera.heading,
            pitch: camera.pitch,
            roll: camera.roll,
          };
        } else {
          orientation = {
            direction: camera.direction,
            up: camera.up,
          };
        }

        if (camera.position.z >= 406944828719368.56) {
          return;
        }

        var direction = Cartesian3.subtract(
          camera.position,
          focus,
          cartesian3Scratch
        );
        var movementVector = Cartesian3.multiplyByScalar(
          direction,
          dire,
          direction
        );
        var endPosition = Cartesian3.add(focus, movementVector, focus);

        if (
          defined(viewer.trackedEntity) ||
          scene.mode === SceneMode.COLUMBUS_VIEW
        ) {
          camera.position = endPosition;
        } else {
          camera.flyTo({
            destination: endPosition,
            orientation: orientation,
            duration: 0.5,
            convert: false,
          });
        }

        break;
    }
  }
}
相关推荐
kyriewen16 分钟前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
工控丫丫1 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
Dream-Y.ocean4 小时前
鸿蒙PC平台星图遥感适配实战:基于 Electron 壳方案的纯 JavaScript 遥感图像处理引擎开发
javascript·electron·harmonyos
螺丝钉tina4 小时前
[Playwright ][16]Playwright + TypeScript API 自动化测试实战:API测试
前端·javascript·typescript
Highcharts.js6 小时前
React 中原生支持使用 JSX 组件配置自定义表格 Highcharts Grid
前端·javascript·react.js·前端框架·jsx·highcharts·自定义表格
Java后端的Ai之路6 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
薛定谔的猫-菜鸟程序员7 小时前
Electron开发超详细教程(从入门到放弃)
前端·javascript·electron
htzyl2068 小时前
前端阶梯——第四十三章、实战二:待办清单To-Do
前端·javascript·html
程序员大阳8 小时前
HTML+CSS+JS对话式实战(1)-开篇:认识我们要做的社团活动发布平台
javascript·css·html·实战·系统·平台·社团活动发布