cesium实现鹰眼地图(三维)与主图联动效果


Cesium实战系列文章总目录传送门

1.实现效果

在这里插入图片描述

2.实现方法

2.1实现思路

这里使用的鹰眼地图都是三维的,后面为效率考虑,会将其换成二维地图。

关于鹰眼地图(三维)的实现,可参考上篇博客:传送门

鹰眼地图与主图联动,需要判断是主图在动,还是鹰眼地图在动,即需要判断触发事件,否者会造成循环联动,无法实现效果。

2.2实现方法

这里将核心函数封装成了一个类。主要包括js创建地图div,鹰眼地图初始化,鹰眼地图与主图的联动等。

2.2.1核心函数:

HawkEye3DMap类代码如下:

/**
 * @description: 三维鹰眼地图及与主图联动
 * @param {*}
 * @return {*}
 */
class HawkEye3DMap {
    constructor(viewer) {
        // 主图
        this._viewer = viewer;
        // 鹰眼图
        this._hawkEyeMap = null;
        // 判断事件是主图触发还是鹰眼地图触发
        this._isMainMapTrigger = false;
        this._isEyeMapTrigger = false;
    }

    // 初始化函数
    _init() {
        this._divInit();
        this._mapInit();
    }

    // 创建div,并设置样式
    _divInit() {
        let hawkEyeDiv = document.createElement("div");
        hawkEyeDiv.setAttribute('id', "hawkEye3dMap");
        hawkEyeDiv.style.cssText = "position: absolute;left: 70% ;top: 2% ;border-radius: 50% ;height: 160px;width: 160px;overflow: hidden;border: 2px solid #002FA7;"
        document.getElementsByTagName("body").item(0).appendChild(hawkEyeDiv);
    };

    _mapInit() {
        // div创建完成后才能初始化地图,否则会找不到div保错
        // 初始化地图
        this._hawkEyeMap = new Cesium.Viewer('hawkEye3dMap', {
            geocoder: false,
            homeButton: false,
            sceneModePicker: false,
            baseLayerPicker: false,
            navigationHelpButton: false,
            animation: false,
            timeline: false,
            fullscreenButton: false,
        });
        this._hawkEyeMap.cesiumWidget.creditContainer.style.display = 'none';
        this._hawkEyeMap.scene.backgroundColor = Cesium.Color.TRANSPARENT;
        this._hawkEyeMap.imageryLayers.removeAll();

        // 鹰眼图中添加高德路网中文注记图(鹰眼图中坐标偏移一点不影响)
        this._hawkEyeMap.imageryLayers.addImageryProvider(
            new Cesium.UrlTemplateImageryProvider({
                url: "http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}",
                minimumLevel: 3,
                maximumLevel: 18
            })
        );

        // 引起事件监听的相机变化幅度
        this._viewer.camera.percentageChanged = 0.02;
        this._hawkEyeMap.camera.percentageChanged = 0.5;

        this._bindEvent();
    }

    // 绑定事件
    _bindEvent() {
        // 鹰眼与主图同步
        this._viewer.camera.changed.addEventListener(this._syncEyeMap, this);
        // 第一次刷新渲染时联动
        this._viewer.scene.preRender.addEventListener(this._syncEyeMap, this);

        // 主图与鹰眼图同步
        this._hawkEyeMap.camera.changed.addEventListener(this._syncMap, this);
        this._hawkEyeMap.scene.preRender.addEventListener(this._syncMap, this);
    }

    // 同步主图与鹰眼地图
    _syncEyeMap() {
        // 监听主图
        new Cesium.ScreenSpaceEventHandler(this._viewer.canvas).setInputAction(() => {
            this._isMainMapTrigger = true;
            this._isEyeMapTrigger = false;
        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);

        // 判断是否为主图移动
        if (!this._isMainMapTrigger) {
            return false;
        }

        this._hawkEyeMap.camera.flyTo({
            destination: this._viewer.camera.position,
            orientation: {
                heading: this._viewer.camera.heading,
                pitch: this._viewer.camera.pitch,
                roll: this._viewer.camera.roll,
            },
            duration: 0.0,
        })
    }

    // 鹰眼地图与主图联动效果
    _syncMap() {
        // 监听鹰眼地图
        new Cesium.ScreenSpaceEventHandler(this._hawkEyeMap.canvas).setInputAction(() => {
            this._isMainMapTrigger = false;
            this._isEyeMapTrigger = true;
        }, Cesium.ScreenSpaceEventType.LEFT_DOWN)

        // 判断是否为鹰眼地图移动
        if (!this._isEyeMapTrigger) {
            return false;
        }
        this._viewer.camera.flyTo({
            destination: this._hawkEyeMap.camera.position,
            orientation: {
                heading: this._hawkEyeMap.camera.heading,
                pitch: this._hawkEyeMap.camera.pitch,
                roll: this._hawkEyeMap.camera.roll,
            },
            duration: 0.0,
        })
    }
}
2.2.2代码调用

引入3d鹰眼地图js文件后,简单调用即可实现鹰眼地图的生成及与主图联动效果。

// 鹰眼地图初始化
let hawkEyeMap = new HawkEye3DMap(viewer);
hawkEyeMap._init();
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要使用Cesium.js实现离线三维地图,你需要以下步骤: 1. 下载Cesium.js库文件:你可以从Cesium官方网站(https://cesium.com/downloads/)下载Cesium.js的压缩包。选择适合你项目的版本,并将其解压到你的项目目录中。 2. 在Vue项目中引入Cesium.js库:将Cesium.js库文件拷贝到你的Vue项目的静态资源目录(例如`public`目录),然后在Vue组件中引入它。在需要使用Cesium的组件中添加以下代码: ```javascript mounted() { const Cesium = window.Cesium; this.viewer = new Cesium.Viewer(this.$refs.mapContainer, { // Cesium初始化配置选项 // 可根据需要进行配置 }); }, ``` 3. 在组件模板中创建地图容器:在Vue组件的模板中添加一个容器元素,用于显示地图。使用`ref`属性为容器元素创建一个引用,以便在代码中引用它。例如: ```html <template> <div ref="mapContainer" style="width: 100%; height: 100%;"></div> </template> ``` 4. 添加离线地图数据:下载所需的离线地图数据,例如地形数据、影像数据或矢量数据。将这些数据放置在你的项目目录中,并确保路径正确。 5. 加载离线地图数据:在Cesium的初始化配置选项中指定离线地图数据的路径。例如: ```javascript this.viewer = new Cesium.Viewer(this.$refs.mapContainer, { terrainProvider: new Cesium.CesiumTerrainProvider({ url: '/path/to/terrainData', }), imageryProvider: new Cesium.UrlTemplateImageryProvider({ url: '/path/to/imageryData/{z}/{x}/{y}.png', }), }); ``` 在上述示例中,`terrainProvider`指定了地形数据的路径,`imageryProvider`指定了影像数据的路径。你需要根据实际情况调整路径和数据格式。 6. 定制地图样式和功能:Cesium提供了丰富的API和工具,可以根据需要进行地图样式和功能的定制。你可以通过配置选项、添加图层、设置相机位置等来实现定制。具体的定制方法可以参考Cesium的官方文档(https://cesium.com/docs/)。 这些步骤将帮助你在Vue项目中使用Cesium.js实现离线三维地图。记得根据你的实际需求和地图数据进行相应的配置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

右弦GISer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值