69.在 Vue 3 中使用 OpenLayers 拖拽实现放大区域的效果(DragPan)

news2025/3/6 17:24:33

引言

在现代 Web 开发中,地图功能已经成为许多应用的重要组成部分。OpenLayers 是一个功能强大的开源地图库,支持多种地图源和交互操作。Vue 3 是一个流行的前端框架,以其响应式数据和组件化开发著称。本文将介绍如何在 Vue 3 中集成 OpenLayers,并实现拖拽放大区域的效果(DragPan)。

实现效果

  • 按住 Shift 键,使用鼠标左键圈选区域,地图会自动放大到选中的区域。

  • 支持地图的拖拽、缩放等基本操作。

  • 使用 MapTiler 提供的地图服务作为底图。

环境准备

在开始之前,请确保你已经安装了以下工具和库:

  • Node.js 和 npm

  • Vue 3 项目(可以通过 vue-cli 或 Vite 创建)

  • OpenLayers 库

安装 OpenLayers

在项目中安装 OpenLayers:

npm install ol

实现步骤

1. 创建 Vue 3 组件

首先,创建一个 Vue 3 组件,用于承载地图和实现拖拽放大功能。

<!--
 * @Author: 彭麒
 * @Date: 2025/1/24
 * @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拖拽实现放大区域的效果(DragPan)</div>
    </div>
    <div class="title">操作说明:按住shift,使用鼠标左键进行圈选</div>
    <div id="vue-openlayers"></div>
  </div>
</template>

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

export default {
  setup() {
    const map = ref(null);

    const maptiler = (data) => {
      if (map.value) {
        // 清除所有 layer
        map.value.getLayers().getArray().forEach((layer) => {
          if (layer) {
            map.value.removeLayer(layer);
          }
        });

        const url = `https://api.maptiler.com/maps/${data}/tiles.json?key=RbTrJIUQMw0c6xtn6kZr`;
        const source = new TileJSON({
          url,
          tileSize: 512,
          crossOrigin: 'anonymous',
        });

        const maptilerMap = new Tile({
          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 DragPan()]),
      });
    };

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

    return {
      map,
    };
  },
};
</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;
}
.title{
  font-size: 20px;
  font-weight: bold;
  margin-top: 20px;
  margin-bottom: 20px;
  text-align: center;
  color: red;
}
</style>

2. 代码解析

2.1 模板部分
  • <div id="vue-openlayers">: 这是地图的容器,OpenLayers 会将地图渲染到这个 DOM 元素中。

  • 操作说明: 提示用户如何操作地图(按住 Shift 键并使用鼠标左键圈选区域)。

2.2 脚本部分
  • 引入依赖:

    • ol/ol.css: OpenLayers 的样式文件。

    • refonMounted: Vue 3 的 Composition API 函数。

    • MapView: OpenLayers 的核心类,用于创建地图和视图。

    • TileTileJSON: OpenLayers 的图层和数据源类。

    • DragPandefaultInteractions: OpenLayers 的交互功能,用于实现地图拖拽。

  • setup 函数:

    • map: 使用 ref 创建一个响应式的地图对象。

    • maptiler 函数: 用于加载 MapTiler 提供的地图服务。它会清除当前地图的所有图层,并根据传入的 data 参数加载新的地图图层。

    • initMap 函数: 初始化 OpenLayers 地图,设置目标容器、视图中心、缩放级别,并添加拖拽交互。

    • onMounted 钩子: 在组件挂载后调用 initMap 和 maptiler 函数,初始化地图并加载默认的 MapTiler 地图。

2.3 样式部分
  • .container: 设置地图容器的宽度、高度、边框等样式。

  • #vue-openlayers: 设置地图显示区域的宽度、高度、边框等样式。

  • .title: 设置操作说明的字体大小、颜色、对齐方式等样式。

3. 运行项目

在终端中运行以下命令启动项目:

npm run serve

打开浏览器,访问 http://localhost:8080,即可看到地图效果。

总结

本文介绍了如何在 Vue 3 中集成 OpenLayers,并实现拖拽放大区域的效果(DragPan)。通过 OpenLayers 的强大功能和 Vue 3 的响应式特性,我们可以轻松构建出功能丰富的地图应用。希望本文对你有所帮助,欢迎在评论区交流讨论!


参考文档

  • OpenLayers 官方文档

  • Vue 3 官方文档

  • MapTiler 地图服务


希望这篇文章能帮助你在 CSDN 上顺利发表!如果有任何问题,欢迎随时交流!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

77,【1】.[CISCN2019 华东南赛区]Web4

有句英文&#xff0c;看看什么意思 好像也可以不看 进入靶场 点击蓝色字体 我勒个豆&#xff0c;百度哇 所以重点应该在url上&#xff0c;属于任意文件读取类型 接下来该判断框架了 常见的web框架如下 一&#xff0c;Python 框架 1.Flask URL 示例 1&#xff1a;http://…

手撕B-树

一、概述 1.历史 B树&#xff08;B-Tree&#xff09;结构是一种高效存储和查询数据的方法&#xff0c;它的历史可以追溯到1970年代早期。B树的发明人Rudolf Bayer和Edward M. McCreight分别发表了一篇论文介绍了B树。这篇论文是1972年发表于《ACM Transactions on Database S…

一文简单回顾复习Java基础概念

还是和往常一样&#xff0c;我以提问的方式回顾复习&#xff0c;今天回顾下Java小白入门应该知道的一些基础知识 Java语言有哪些特点呢&#xff1f; Java语言的特点有&#xff1a; 面向对象&#xff0c;主要是封装、继承、多态&#xff1b;平台无关性&#xff0c;“一次编写…

GCC之编译(8)AR打包命令

GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-C…

2.1.3 第一个工程,点灯!

新建工程 点击菜单栏左上角&#xff0c;新建工程或者选择“文件”-“新建工程”&#xff0c;选择工程类型“标准工程”选择设备类型和编程语言&#xff0c;并指定工程文件名及保存路径&#xff0c;如下图所示&#xff1a; 选择工程类型为“标准工程” 选择主模块机型&#x…

图像处理算法研究的程序框架

目录 1 程序框架简介 2 C#图像读取、显示、保存模块 3 C动态库图像算法模块 4 C#调用C动态库 5 演示Demo 5.1 开发环境 5.2 功能介绍 5.3 下载地址 参考 1 程序框架简介 一个图像处理算法研究的常用程序逻辑框架&#xff0c;如下图所示 在该框架中&#xff0c;将图像处…

计算机工程:解锁未来科技之门!

计算机工程与应用是一个充满无限可能性的领域。随着科技的迅猛发展&#xff0c;计算机技术已经深深渗透到我们生活的方方面面&#xff0c;从医疗、金融到教育&#xff0c;无一不在彰显着计算机工程的巨大魅力和潜力。 在医疗行业&#xff0c;计算机技术的应用尤为突出。比如&a…

Linux初识——基本指令(2)

本文将继续从上篇末尾讲起&#xff0c;讲解我们剩下的基本指令 一、剩余的基本指令 1、mv mv指令是move&#xff08;移动&#xff09;的缩写&#xff0c;其功能为&#xff1a;1.剪切文件、目录。2.重命名 先演示下重命名&#xff0c;假设我想把当前目录下的di34改成dir5 那…

单片机-STM32 WIFI模块--ESP8266 (十二)

1.WIFI模块--ESP8266 名字由来&#xff1a; Wi-Fi这个术语被人们普遍误以为是指无线保真&#xff08;Wireless Fidelity&#xff09;&#xff0c;并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词&#xff0c;Wi-Fi还出现在ITAA的一个论文中。…

80,【4】BUUCTF WEB [SUCTF 2018]MultiSQL

53&#xff0c;【3】BUUCTF WEB october 2019 Twice SQLinjection-CSDN博客 上面这个链接是我第一次接触二次注入 这道题也涉及了 对二次注入不熟悉的可以看看 BUUCTF出了点问题&#xff0c;打不开&#xff0c;以下面这两篇wp作为学习对象 [SUCTF 2018]MultiSQL-CSDN博客 …

Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置

Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置 1.Prometheus部署1.2.Prometheus修改默认端口 2.grafana可视化页面部署3.alertmanager部署4.监控配置4.1.主机监控node-exporter4.2.监控mysql数据库mysqld_exporter4.3.监控mongod数据库mongodb_expo…

问题排查 - TC397 CORE2 50MS/100MS任务不运行

1、问题描述 CORE2 的任务运行次数的计数值OsTask_100ms_Core2 - task_cnt[12]、OsTask_50ms_Core2 - task_cnt[16]不在累加&#xff0c;但是其他任务OsAlarm_1ms_Core2、OsAlarm_5ms_Core2、OsAlarm_10ms_Core2、OsAlarm_20ms_Core2 任务计数值累加正常。 如果是任务栈溢出&a…

Spring FatJar写文件到RCE分析

背景 现在生产环境部署 spring boot 项目一般都是将其打包成一个 FatJar&#xff0c;即把所有依赖的第三方 jar 也打包进自身的 app.jar 中&#xff0c;最后以 java -jar app.jar 形式来运行整个项目。 运行时项目的 classpath 包括 app.jar 中的 BOOT-INF/classes 目录和 BO…

百度APP iOS端磁盘优化实践(上)

01 概览 在APP的开发中&#xff0c;磁盘管理已成为不可忽视的部分。随着功能的复杂化和数据量的快速增长&#xff0c;如何高效管理磁盘空间直接关系到用户体验和APP性能。本文将结合磁盘管理的实践经验&#xff0c;详细介绍iOS沙盒环境下的文件存储规范&#xff0c;探讨业务缓…

蓝桥杯之c++入门(一)【第一个c++程序】

目录 前言一、第⼀个C程序1.1 基础程序1.2 main函数1.3 字符串1.4 头文件1.5 cin 和 cout 初识1.6 名字空间1.7 注释 二、四道简单习题&#xff08;点击跳转链接&#xff09;练习1&#xff1a;Hello,World!练习2&#xff1a;打印飞机练习3&#xff1a;第⼆个整数练习4&#xff…

14-6-1C++STL的list

(一&#xff09;list容器的基本概念 list容器简介&#xff1a; 1.list是一个双向链表容器&#xff0c;可高效地进行插入删除元素 2.list不可以随机存取元素&#xff0c;所以不支持at.(pos)函数与[ ]操作符 &#xff08;二&#xff09;list容器头部和尾部的操作 list对象的默…

【AI论文】Sigma:对查询、键和值进行差分缩放,以实现高效语言模型

摘要&#xff1a;我们推出了Sigma&#xff0c;这是一个专为系统领域设计的高效大型语言模型&#xff0c;其独特之处在于采用了包括DiffQKV注意力机制在内的新型架构&#xff0c;并在我们精心收集的系统领域数据上进行了预训练。DiffQKV注意力机制通过根据查询&#xff08;Q&…

InceptionV1_V2

目录 不同大小的感受野去提取特征 经典 Inception 网络的设计思路与运行流程 背景任务&#xff1a;图像分类&#xff08;以 CIFAR-10 数据集为例&#xff09; Inception 网络的设计思路 Inception 网络的运行流程 打个比方 多个损失函数的理解 1. 为什么需要多个损失函数&#…

ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果

前言 ORB-SLAM2源码学习&#xff1a;Initializer.cc⑦: Initializer::Triangulate特征点对的三角化_cv::svd::compute-CSDN博客 经过上面的三角化我们成功得到了三维点&#xff0c;但是经过三角化成功的三维点并不一定是有效的&#xff0c;需要筛选才能作为初始化地图点。 …

【ArcGIS微课1000例】0141:提取多波段影像中的单个波段

文章目录 一、波段提取函数二、加载单波段导出问题描述:如下图所示,img格式的时序NDVI数据有24个波段。现在需要提取某一个波段,该怎样操作? 一、波段提取函数 首先加载多波段数据。点击【窗口】→【影像分析】。 选择需要处理的多波段影像,点击下方的【添加函数】。 在多…