28.在 Vue 3 中使用 OpenLayers 加载 MVT 格式矢量瓦片数据并显示图形

news2024/12/16 3:41:53

前言

随着前端开发技术的不断进步,越来越多的强大地图库被广泛应用于 Web 地图应用开发中。OpenLayers 是一个流行的开源 JavaScript 库,能够帮助开发者快速构建交互式地图应用。而 Vue 3 作为现代化的前端框架,已经成为开发者构建高效、响应式用户界面的首选工具。

本文将介绍如何在 Vue 3 中结合 OpenLayers 使用 MVT(Mapbox Vector Tile) 格式加载矢量瓦片数据,并通过简单的样式显示图形。你将学习如何使用 MVT 格式来显示地图数据,并使用 OpenLayers 提供的强大功能进行可视化展示。

技术栈

  • Vue 3(使用 Composition API)
  • OpenLayers(地图展示与处理库)
  • MVT(Mapbox Vector Tile)格式
  • CSS(样式设置)

什么是 MVT(Mapbox Vector Tile)?

MVT 简介

MVT(Mapbox Vector Tile) 是一种专门用于地图服务的数据格式,它与传统的栅格瓦片(如 PNG 或 JPEG)不同,MVT 使用矢量数据存储地图要素。矢量瓦片的优势在于:

  1. 缩放级别无损失:由于 MVT 是矢量数据,它可以在不同的缩放级别上进行平滑显示,避免了栅格瓦片在放大时失真。
  2. 灵活性:矢量瓦片提供了更高的灵活性,可以在客户端动态渲染图层,应用不同的样式,而无需重新请求服务器的瓦片。
  3. 数据压缩:矢量瓦片相对于传统的栅格瓦片文件较小,可以减少网络传输的负担,提升加载速度。

MVT 的工作原理

MVT 格式将地图数据分割成瓦片,并将每个瓦片中的地图要素(如点、线、多边形)以矢量形式存储。这些矢量数据可以使用不同的样式进行渲染,因此非常适合动态调整图层的样式或进行数据交互。

开始使用 Vue 3 和 OpenLayers

接下来,我们将使用 Vue 3OpenLayers 来加载 MVT 格式的矢量瓦片数据,并显示图形。我们会使用 Composition API 来构建应用,以下是实现步骤:

1. 安装依赖

首先,确保你已经创建了一个 Vue 3 项目。如果还没有创建,可以通过以下命令快速启动一个新的 Vue 3 项目:

npm create vue@latest my-vue-project cd my-vue-project npm install

然后,安装 OpenLayers

npm install ol

2. 编写代码

在 Vue 3 中,我们使用 Composition API 来管理状态和生命周期钩子。下面是实现加载 MVT 格式矢量瓦片并渲染地图的完整代码:

<!--
 * @Author: 彭麒
 * @Date: 2024/12/14
 * @Email: 1062470959@qq.com
 * @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。
 -->
<template>
  <button class="back-button" @click="goBack">返回</button>
  <div class="container">
    <div class="w-full flex justify-center">
      <div class="font-bold text-[24px]">在Vue3中使用OpenLayers使用MVT格式读取矢量瓦片数据,显示图形</div></div>
    <div id="vue-openlayers"></div>
  </div>
</template>

<script setup>
import {onMounted, ref} from 'vue';
import 'ol/ol.css';
import Map from 'ol/Map';
import View from 'ol/View';
import TileLayer from 'ol/layer/Tile';
import OSM from 'ol/source/OSM';
import WMTSTileGrid from 'ol/tilegrid/WMTS';
import VectorTileLayer from 'ol/layer/VectorTile';
import VectorTile from 'ol/source/VectorTile';
import MVT from 'ol/format/MVT';
import Fill from 'ol/style/Fill';
import Style from 'ol/style/Style';
import Circle from 'ol/style/Circle';
const map = ref(null); // 响应式地图对象
import router from "@/router";
const goBack = () => {
  router.push('/OpenLayers');
};
// 定义样式
const style = () => {
  return new Style({
    image: new Circle({
      radius: 5,
      fill: new Fill({
        color: 'Crimson', // 圆形填充颜色
      }),
    }),
  });
};

// 读取 MVT 数据并添加图层
const readMVT = () => {
  const myLayer = new VectorTileLayer({
    style: style(), // 应用样式
    source: new VectorTile({
      visible: true,
      url: 'https://gibs-{a-c}.earthdata.nasa.gov/wmts/epsg4326/best/wmts.cgi?TIME=2020-03-18T00:00:00Z&layer=GRanD_Dams&tilematrixset=2km&Service=WMTS&Request=GetTile&Version=1.0.0&FORMAT=application%2Fvnd.mapbox-vector-tile&TileMatrix={z}&TileCol={x}&TileRow={y}', // 数据源 URL
      format: new MVT(), // 数据格式
      projection: 'EPSG:4326', // 投影
      tileGrid: new WMTSTileGrid({
        extent: [-180, -90, 180, 90], // 瓦片网格范围
        resolutions: [0.5625, 0.28125, 0.140625, 0.0703125, 0.03515625, 0.017578125], // 分辨率
        tileSize: [512, 512], // 瓦片大小
      }),
    }),
  });

  map.value.addLayer(myLayer); // 将图层添加到地图
};

// 初始化地图
const initMap = () => {
  map.value = new Map({
    layers: [
      new TileLayer({
        source: new OSM(), // 添加 OSM 图层
      }),
    ],
    target: 'vue-openlayers', // 地图渲染的目标元素
    view: new View({
      center: [0, 0], // 地图初始中心点
      projection: 'EPSG:4326', // 地图投影
      zoom: 4, // 地图初始缩放级别
    }),
  });
};

// 在组件挂载后初始化地图和加载 MVT 数据
onMounted(() => {
  initMap();
  readMVT();
});

</script>

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

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

3. 代码解析

  • style():定义了一个简单的样式,使用了 Circle 样式来显示 MVT 数据中的点要素。可以根据需要进一步自定义样式。
  • readMVT():创建了一个 VectorTileLayer 图层,使用 VectorTile 数据源加载 MVT 格式的数据,并通过 MVT 格式进行解析。该方法将 MVT 数据添加到地图中。
  • initMap():初始化地图,使用 OpenStreetMap (OSM) 作为底图,并设置了地图视图的中心和缩放级别。
  • onMounted():Vue 3 的 onMounted 钩子在组件挂载后执行,确保地图和 MVT 数据图层在组件加载完成后显示。

运行效果

运行该代码时,你将看到一个显示 OpenStreetMap 底图的地图,地图上会展示 MVT 格式的矢量瓦片数据。可以通过缩放和拖拽地图来查看不同位置的数据。

总结

本文详细介绍了如何在 Vue 3 中使用 OpenLayers 加载 MVT(Mapbox Vector Tile) 格式的矢量瓦片数据,并通过简单的样式展示地图要素。MVT 格式作为一种矢量瓦片格式,不仅能够提供更高质量的地图呈现,还可以减少网络流量并提高显示效率。通过结合 Vue 3 和 OpenLayers,我们可以快速开发高效、动态的地图应用。

希望本文对你理解 MVT 格式以及如何在 Vue 3 中结合 OpenLayers 使用它有所帮助。


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

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

相关文章

Linux - MySQL迁移至一主一从

Linux - MySQL迁移至一主一从 迁移准备安装MySQL ibd文件迁移原服务器操作目标服务器操作 一主一从增量同步异常解决结尾 首先部分单独安装MySQL&#xff0c;请参考Linux - MySQL安装&#xff0c;迁移数据量比较大约400G左右且网络不通故使用文件迁移&#xff0c;需开启一段时间…

opencv-python的简单练习

题目1.读取一张彩色图像并将其转换为灰度图。 import cv2 # 读取图片文件 img cv2.imread(./1.png)# 将原图灰度化 img_gray cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 输出图片 cv2.imshow(img,img) cv2.imshow(img_g,img_gray) # 进行阻塞 cv2.waitKey(0) 题目2&#xff1a;…

go-zero(十三)使用MapReduce并发

go zero 使用MapReduce并发 一、MapReduce 介绍 MapReduce 是一种用于并行计算的编程模型&#xff0c;特别适合在大规模数据处理场景中简化逻辑代码。 官方文档&#xff1a; https://go-zero.dev/docs/components/mr 1. MapReduce 的核心概念 在 MapReduce 中&#xff0c;主…

探索React与Microi吾码的完美结合:快速搭建项目,低代码便捷开发教程

一、摘要 在当今的数字化时代&#xff0c;软件开发就像是一场探险&#xff0c;每个开发者都是探险家&#xff0c;探索着代码的奥秘。React作为前端开发的领军框架&#xff0c;其组件化和高效的渲染机制为开发者提供了强大的工具。而Microi吾码低代码平台的出现&#xff0c;则为…

SAP FICO物料分类账实操

物料分类账所涉及到的差异从采购入库的时候就可能已经产生&#xff0c;接下来从创建物料主数据开始对可能产生差异地方进行分析。其中有些操作步骤在标准价格估算这一篇博文中已经有过演示&#xff0c;可以先做了解。 其中的某些创建在有直接可用的情况下是非必须的&#xff0…

WordPress酱茄主题 开源版 博客资讯自媒体网站模板

一款免费开源的WordPress主题&#xff0c;主题专为WordPress博客、资讯、自媒体网站而设计 运行环境 支持WordPress版本&#xff1a;5.6 兼容Chrome、Firefox、Safari等主流浏览器 支持设备&#xff1a;响应式布局&#xff0c;不同设备不同展示效果 服务器环境建议&#x…

【HF设计模式】03-装饰者模式

声明&#xff1a;仅为个人学习总结&#xff0c;还请批判性查看&#xff0c;如有不同观点&#xff0c;欢迎交流。 摘要 《Head First设计模式》第3章笔记&#xff1a;结合示例应用和代码&#xff0c;介绍装饰者模式&#xff0c;包括遇到的问题、遵循的 OO 原则、达到的效果。 …

Linux查看是否有www-data用户,如果没有添加一个

在 Linux 系统中&#xff0c;www-data 用户通常是用来运行 Web 服务&#xff08;如 Nginx 或 Apache&#xff09;的。如果你想检查系统中是否已经存在 www-data 用户&#xff0c;并在没有的情况下添加一个&#xff0c;可以按照以下步骤操作&#xff1a; ### 1. 检查 www-data …

23.模块和包

模块 模块Module,是一个python文件&#xff0c;以.py结尾。 模块能定义函数、类和变量。 模块导入 模块在使用前需要先导入 [from 模块名] import [模块 | 类 | 变量 | 函数 | *] [as 别名] import 模块 import time print("start...") time.sleep(5) print(&…

IDEA报错:无效的源发行版、无效的目标发行版

1. 无效的源发行版 创建项目的时候&#xff0c;会遇见这个报错&#xff0c;原因就是编译的JDK版本与发布版本不一致。 解决方法&#xff1a; 1.1. 找到问题所在地 英文&#xff1a;File -> Project Structure ->Project Settings 中文&#xff1a;文件->项目结构 …

2025年,客服知识库与人工智能的结合

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;传统客服模式正在经历前所未有的变革。特别是在2025年&#xff0c;客服知识库与AI的深度融合&#xff0c;不仅极大地提升了客服处理的效率与准确性&#xff0c;还为用户带来了更加个性化、高效的服务体验。 …

JVM 双亲委派模型以及垃圾回收机制

目录 1. JVM 内存区域划分 2. JVM 中类加载的过程 1) 类加载的基本流程 2) 双亲委派模型 3. JVM 中垃圾回收机制 1) 找到垃圾 a) 引用计数 b) 可达性分析 2) 释放垃圾 1. JVM 内存区域划分 一个运行起来的 Java 进程&#xff0c;其实就是一个 JVM 虚拟机。 而进程是…

微信小程序跳转其他小程序以及跳转网站

一、跳转其他小程序 1.1 知道appid和页面路径 wx.navigateToMiniProgram({appId: appid, // 替换为目标小程序 AppIDpath: pathWithParams, // 小程序路径envVersion: release, // 开发版、体验版或正式版success(res) {console.log("跳转到其他小程序成功&#xff01;&q…

学习笔记:从ncsi/nc-si协议和代码了解网络协议的设计范式

学习笔记&#xff1a;从ncsi/nc-si协议和代码了解网络协议的设计范式 参考文档&#xff1a; https://www.dmtf.org/standards/published_documents https://www.dmtf.org/dsp/DSP0222 https://www.dmtf.org/sites/default/files/standards/documents/DSP0222_1.2.0.pdf参考代…

深度学习训练参数之学习率介绍

学习率 1. 什么是学习率 学习率是训练神经网络的重要超参数之一&#xff0c;它代表在每一次迭代中梯度向损失函数最优解移动的步长&#xff0c;通常用 η \eta η 表示。它的大小决定网络学习速度的快慢。在网络训练过程中&#xff0c;模型通过样本数据给出预测值&#xff0…

【数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现单链表的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;初始化线性表、销毁线性表、判定是否为空表、求线性…

利用ROS的Camera Calibration工具进行D435相机标定

一、安装ROS Camera Calibration sudo apt-get install ros-melodic-camera-calibration 二、安装realsense-ros 安装ROS Wrapper for Intel RealSense&#xff08;realsense-ros&#xff09; 三、启动数据读取节点 ctrlaltt打开终端 cd catkin_ws_ur source devel/setu…

让文案生成更具灵活性/chatGPT新功能canvas画布编辑

​ ​ OpenAI最近在2024年12月发布了canvas画布编辑功能&#xff0c;这是一项用途广泛的创新工具&#xff0c;专为需要高效创作文案的用户设计。 无论是职场人士、学生还是创作者&#xff0c;这项功能都能帮助快速生成、优化和编辑文案&#xff0c;提升效率的同时提高内容质量…

C# 网络编程--关于UDP 通信(二)

UDP (User Datagram Protocol) 是一种无连接的传输层协议&#xff0c;主要用于支持数据报文的传输。它的主要特点包括简单、高效、不保证可靠性和顺序。 1.UDP协议基本概念 1.udp基于IP的简单的协议&#xff0c;不可靠的协议 2.优点&#xff1a;简单、 轻量化、 传输速度高、…

Spring Boot 集成 MyBatis 全面讲解

Spring Boot 集成 MyBatis 全面讲解 MyBatis 是一款优秀的持久层框架&#xff0c;与 Spring Boot 集成后可以大大简化开发流程。本文将全面讲解如何在 Spring Boot 中集成 MyBatis&#xff0c;包括环境配置、基础操作、高级功能和最佳实践。 一、MyBatis 简介 1. SqlSession …