71.在 Vue 3 中使用 OpenLayers 实现按住 Shift 拖拽、旋转和缩放效果

前言

在前端开发中,地图功能是一个常见的需求。OpenLayers 是一个强大的开源地图库,支持多种地图源和交互操作。本文将介绍如何在 Vue 3 中集成 OpenLayers,并实现按住 Shift 键拖拽、旋转和缩放地图的效果。

实现效果

  • 按住 Shift 键,拖动鼠标可以旋转地图。

  • 按住 Shift 键,滚动鼠标滚轮可以缩放地图。

  • 支持加载多种地图样式(如街道图、卫星图等)。

环境准备

在开始之前,请确保你的开发环境中已经安装了以下依赖:

  • Vue 3

  • OpenLayers

可以通过以下命令安装 OpenLayers:

npm install ol

代码实现

1. 创建 Vue 3 组件

首先,创建一个 Vue 3 组件,用于渲染地图并实现交互功能。

<!--
 * @Author: 彭麒
 * @Date: 2024/1/25
 * @Email: 1062470959@qq.com
 * @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。
 -->
<template>
    <div class="container">
        <div class="w-full flex justify-center flex-wrap">
            <div class="font-bold text-[24px]">在Vue3中使用OpenLayers按住Shift实现拖拽旋转放缩效果</div>
        </div>
        <div id="vue-openlayers"></div>
    </div>
</template>

<script setup>
import {ref, onMounted} from 'vue';
import 'ol/ol.css';
import {Map, View} from 'ol';
import Tile from 'ol/layer/Tile';
import TileJSON from 'ol/source/TileJSON';
import {DragRotateAndZoom, defaults as defaultInteractions} from 'ol/interaction';

const map = ref(null);

const maptiler = (data) => {
    // 清除所有layer
    map.value.getLayers().getArray().forEach((layer) => {
        if (layer) {
            map.value.removeLayer(layer);
        }
    });
    let url = 'https://api.maptiler.com/maps/' + data + '/tiles.json?key=RbTrJIUQMw0c6xtn6kZr';
    let source = new TileJSON({
        url: url,
        tileSize: 512,
        crossOrigin: 'anonymous',
    });

    let maptilerMap = new Tile({
        source: source,
    });
    map.value.addLayer(maptilerMap);
};

const initMap = () => {
    map.value = new Map({
        target: 'vue-openlayers',
        layers: [],
        view: new View({
            center: [13247019.404399557, 4721671.572580107],
            zoom: 3,
        }),
        interactions: defaultInteractions().extend([new DragRotateAndZoom()]),
    });
};

onMounted(() => {
    initMap();
    maptiler('streets');
});
</script>

<style scoped>
.container {
    width: 840px;
    height: 590px;
    margin: 50px auto;
    border: 1px solid #42B983;
}

#vue-openlayers {
    width: 800px;
    height: 470px;
    margin: 0 auto;
    border: 1px solid #42B983;
    position: relative;
}
</style>

2. 代码解析

2.1 地图初始化

在 initMap 函数中,我们创建了一个 OpenLayers 地图实例,并将其绑定到 #vue-openlayers 容器中。地图的初始视图中心设置为 [13247019.404399557, 4721671.572580107],缩放级别为 3

map.value = new Map({
    target: 'vue-openlayers',
    layers: [],
    view: new View({
        center: [13247019.404399557, 4721671.572580107],
        zoom: 3,
    }),
    interactions: defaultInteractions().extend([new DragRotateAndZoom()]),
});
2.2 拖拽、旋转和缩放交互

通过 DragRotateAndZoom 交互,用户可以在按住 Shift 键的同时进行地图的拖拽、旋转和缩放操作。

interactions: defaultInteractions().extend([new DragRotateAndZoom()]),
2.3 加载地图图层

maptiler 函数用于加载地图图层。它首先清除现有的所有图层,然后根据传入的参数加载新的地图图层。这里使用了 MapTiler 提供的地图服务。

let url = 'https://api.maptiler.com/maps/' + data + '/tiles.json?key=YOUR_MAPTILER_API_KEY';
let source = new TileJSON({
    url: url,
    tileSize: 512,
    crossOrigin: 'anonymous',
});
2.4 组件挂载后初始化地图

在 onMounted 钩子函数中,调用 initMap 和 maptiler 函数,初始化地图并加载 streets 图层。

onMounted(() => {
    initMap();
    maptiler('streets');
});

3. 运行效果

运行项目后,你将看到一个地图显示在页面上。按住 Shift 键并拖动鼠标可以旋转地图,滚动鼠标滚轮可以缩放地图。

注意事项

  1. MapTiler API Key:在使用 MapTiler 的地图服务时,需要替换代码中的 YOUR_MAPTILER_API_KEY 为你自己的 API Key。你可以在 MapTiler 官网 注册并获取 API Key。

  2. OpenLayers 版本:确保安装的 OpenLayers 版本与代码兼容。

  3. 跨域问题:如果地图无法加载,请检查浏览器的控制台是否有跨域错误。

总结

本文介绍了如何在 Vue 3 中集成 OpenLayers,并实现按住 Shift 键拖拽、旋转和缩放地图的效果。通过 OpenLayers 的强大功能,我们可以轻松实现各种地图交互操作。希望本文对你有所帮助,欢迎在评论区交流讨论!


参考链接

  • OpenLayers 官方文档

  • MapTiler 官网

  • Vue 3 官方文档


你可以将以上内容直接复制到 CSDN 的博文编辑器中,并根据需要调整格式或添加图片。如果有其他需求,欢迎随时提出!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960023.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python NumPy(3):创建数组(2)

1 NumPy 从已有的数组创建数组 1.1 numpy.asarray numpy.asarray 类似 numpy.array&#xff0c;但 numpy.asarray 参数只有三个&#xff0c;比 numpy.array 少两个。 numpy.asarray(a, dtype None, order None) 参数描述a任意形式的输入参数&#xff0c;可以是&#xff0c…

qml Dialog详解

1、概述 Dialog是QML&#xff08;Qt Modeling Language&#xff09;中用于显示对话框的组件&#xff0c;它提供了一个模态窗口&#xff0c;通常用于与用户进行重要交互&#xff0c;如确认操作、输入信息或显示警告等。Dialog组件具有灵活的布局和样式选项&#xff0c;可以轻松…

二维数组一

目录 输出数组的第k行数输出数组的第k列数输出数组的每一行的和输出数组的每列的平均值最高成绩各个科目成绩的平均分求最大梯形的面积入门靶心数奇偶统计 输出数组的第k行数 题目描述 输入一个二维数组&#xff0c;显示他的第k行的值。 输入 第一行 n&#xff0c;m两个整数&…

单片机内存管理剖析

一、概述 在单片机系统中&#xff0c;内存资源通常是有限的&#xff0c;因此高效的内存管理至关重要。合理地分配和使用内存可以提高系统的性能和稳定性&#xff0c;避免内存泄漏和碎片化问题。单片机的内存主要包括程序存储器&#xff08;如 Flash&#xff09;和数据存储器&a…

计算机网络 (61)移动IP

前言 移动IP&#xff08;Mobile IP&#xff09;是由Internet工程任务小组&#xff08;Internet Engineering Task Force&#xff0c;IETF&#xff09;提出的一个协议&#xff0c;旨在解决移动设备在不同网络间切换时的通信问题&#xff0c;确保移动设备可以在离开原有网络或子网…

线性回归、协同过滤、基于内容过滤、主成分分析(PCA)

线性回归 使用item特征用户打分标签线性回归训练&#xff0c;最小化成本函数&#xff0c;得到每个用户的参数 协同过滤 协同过滤基于一个核心假设&#xff1a;相似的用户会有相似的兴趣&#xff0c;因此可以通过分析相似用户历史行为&#xff0c;来预测当前用户可能感兴趣的i…

引领产品创新: 2025 年 PM 效能倍增法则

本文讲述 PM 如何利用 AI 做到效率倍增&#xff0c;非常有借鉴意义&#xff0c;故而翻译于此。 原文链接&#xff1a;https://www.news.aakashg.com/p/the-ai-pms-playbook 在产品圈有一个广为流传的说法&#xff1a; “每个产品经理都应该成为 AI 产品经理。” 这个观点有一…

vscode无法格式化go代码的问题

CTRLshiftp 点击Go:Install/Update Tools 点击全选&#xff0c;OK&#xff01;

【外文原版书阅读】《机器学习前置知识》1.线性代数的重要性,初识向量以及向量加法

目录 ​编辑 ​编辑 1.Chapter 2 Why Linear Algebra? 2.Chapter 3 What Is a Vector? 个人主页&#xff1a;Icomi 大家好&#xff0c;我是Icomi&#xff0c;本专栏是我阅读外文原版书《Before Machine Learning》对于文章中我认为能够增进线性代数与机器学习之间的理解的…

对神经网络基础的理解

目录 一、《python神经网络编程》 二、一些粗浅的认识 1&#xff09; 神经网络也是一种拟合 2&#xff09;神经网络不是真的大脑 3&#xff09;网络构建需要反复迭代 三、数字图像识别的实现思路 1&#xff09;建立一个神经网络类 2&#xff09;权重更新的具体实现 3&am…

SOME/IP--协议英文原文讲解1

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 一、SOM…

移动光猫怎么自己改桥接模式?

环境&#xff1a; 型号H3-8s 问题描述&#xff1a; 家里宽带用的是H3-8s 光猫&#xff0c;想改桥接模式。 解决方案&#xff1a; 1.默认管理员账号和密码&#xff1a; 账号&#xff1a;CMCCAdmin 密码&#xff1a;aDm8H%MdAWEB页面我试了登陆不了&#xff0c;显示错误 …

2D 超声心动图视频到 3D 心脏形状重建的临床应用| 文献速递-医学影像人工智能进展

Title 题目 2D echocardiography video to 3D heart shape reconstruction for clinicalapplication 2D 超声心动图视频到 3D 心脏形状重建的临床应用 01 文献速递介绍 超声心动图是心血管医学中一种至关重要且广泛应用的影像学技术&#xff0c;利用超声波技术捕捉心脏及其…

web端ActiveMq测试工具

如何用vue3创建简单的web端ActiveMq测试工具&#xff1f; 1、复用vue3模板框架 创建main.js,引入APP文件&#xff0c;createApp创建文件&#xff0c;并加载element插件&#xff0c;然后挂载dom节点 2、配置vue.config.js脚本配置 mport { defineConfig } from "vite&qu…

STM32 GPIO配置 点亮LED灯

本次是基于STM32F407ZET6做一个GPIO配置&#xff0c;实现点灯实验。 新建文件 LED.c、LED.h文件&#xff0c;将其封装到Driver文件中。 双击Driver文件将LED.c添加进来 编写头文件&#xff0c;这里注意需要将Driver头文件声明一下。 在LED.c、main.c里面引入头文件LED.h LED初…

DroneXtract:一款针对无人机的网络安全数字取证工具

关于DroneXtract DroneXtract是一款使用 Golang 开发的适用于DJI无人机的综合数字取证套件&#xff0c;该工具可用于分析无人机传感器值和遥测数据、可视化无人机飞行地图、审计威胁活动以及提取多种文件格式中的相关数据。 功能介绍 DroneXtract 具有四个用于无人机取证和审…

用Python和PyQt5打造一个股票涨幅统计工具

在当今的金融市场中&#xff0c;股票数据的实时获取和分析是投资者和金融从业者的核心需求之一。无论是个人投资者还是专业机构&#xff0c;都需要一个高效的工具来帮助他们快速获取股票数据并进行分析。本文将带你一步步用Python和PyQt5打造一个股票涨幅统计工具&#xff0c;不…

大模型正确调用方式

1、ollama 安装 curl -fsSL https://ollama.com/install.sh | sh 如果是AutoDl服务器&#xff0c;可以开启学术加速。 source /etc/network_turbo 本次使用腾讯云Cloud Studio&#xff0c;所以已经安装好了 Ollama 2、启动 ollama run 模型的名字 ollama serve # 开启服务 olla…

计算机网络 (62)移动通信的展望

一、技术发展趋势 6G技术的崛起 内生智能&#xff1a;6G将强调自适应网络架构&#xff0c;通过AI驱动的智能算法提升通信能力。例如&#xff0c;基于生成式AI的6G内生智能架构将成为重要研究方向&#xff0c;实现低延迟、高效率的智能通信。信息编码与调制技术&#xff1a;新型…

KVM/ARM——基于ARM虚拟化扩展的VMM

1. 前言 ARM架构为了支持虚拟化做了些扩展&#xff0c;称为虚拟化扩展(Virtualization Extensions)。原先为VT-x创建的KVM(Linux-based Kernel Virtual Machine)适配了ARM体系结构&#xff0c;引入了KVM/ARM (the Linux ARM hypervisor)。KVM/ARM没有在hypervisor中引入复杂的…