72.在 Vue3 中使用 OpenLayers 进行 Drag-and-Drop 拖拽文件解析并显示图形

在 WebGIS 相关的开发中,我们经常需要加载各种地理数据文件,如 GeoJSON、KML、GPX 等。而 OpenLayers 提供了 DragAndDrop 交互组件,使得我们可以通过拖拽方式加载这些文件,并将其中的地理要素渲染到地图上。

本文将详细介绍如何在 Vue3 框架中使用 OpenLayers 进行 Drag-and-Drop 拖拽文件解析并显示图形,让我们一起来看看具体实现吧!


一、项目环境准备

首先,确保你的 Vue3 项目已经创建好,并安装了 ol(OpenLayers)库。

1. 安装 OpenLayers

如果你的项目还没有安装 OpenLayers,可以使用以下命令进行安装:

npm install ol

2. 项目结构

src/components 目录下新建 OpenLayersMap.vue 组件,该组件将用于初始化地图,并支持拖拽加载地理数据文件。


二、实现 OpenLayers 拖拽加载功能

1. 编写 Vue3 组件

src/components/OpenLayersMap.vue 文件中,编写如下代码:

<!--* @Author: 彭麒* @Date: 2025/2/5* @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使用Drag-and-Drop拖拽文件解析显示图形</div></div><div id="vue-openlayers"></div></div>
</template><script setup>
import { ref, onMounted } from 'vue' // 引入ref和onMounted函数
import 'ol/ol.css' // 引入OpenLayers的CSS
import { Map, View } from 'ol' // 引入Map和View类
import Tile from 'ol/layer/Tile' // 引入Tile图层
import OSM from 'ol/source/OSM' // 引入OSM数据源
import VectorLayer from 'ol/layer/Vector' // 引入矢量图层
import VectorSource from 'ol/source/Vector' // 引入矢量源
import DragAndDrop from 'ol/interaction/DragAndDrop' // 引入拖拽交互
import { GPX, GeoJSON, IGC, KML, TopoJSON } from 'ol/format' // 引入各种文件格式const map = ref(null) // 定义map引用
let dragAndDropInteraction = ref(null) // 定义dragAndDropInteraction引用const setInteraction = () => {if (dragAndDropInteraction.value) {map.value.removeInteraction(dragAndDropInteraction.value) // 如果已有交互,先移除}dragAndDropInteraction.value = new DragAndDrop({formatConstructors: [GPX, // 支持GPX格式GeoJSON, // 支持GeoJSON格式IGC, // 支持IGC格式new KML({ extractStyles: true }), // 支持KML格式并提取样式TopoJSON // 支持TopoJSON格式]})dragAndDropInteraction.value.on('addfeatures', (event) => {const vectorSource = new VectorSource({features: event.features // 使用拖拽添加的要素创建矢量源})map.value.addLayer(new VectorLayer({source: vectorSource // 将矢量源添加到矢量图层}))map.value.getView().fit(vectorSource.getExtent()) // 调整视图以适应矢量源的范围})map.value.addInteraction(dragAndDropInteraction.value) // 将拖拽交互添加到地图
}const initMap = () => {const osmLayer = new Tile({source: new OSM() // 创建OSM瓦片图层})map.value = new Map({target: 'vue-openlayers', // 绑定地图到DOM元素layers: [osmLayer], // 添加OSM图层view: new View({center: [119, 39], // 设置地图中心zoom: 5, // 设置缩放级别projection: 'EPSG:4326' // 设置投影坐标系})})setInteraction() // 设置拖拽交互
}onMounted(() => {initMap() // 组件挂载时初始化地图
})
</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>

三、代码解析

1. 地图初始化

  • 使用 OpenLayers 的 MapView 进行地图初始化。
  • 设置地图中心点为 成都(经度 104.0658,纬度 30.657),并将投影设为 EPSG:3857(Web Mercator 投影)。
  • 通过 OSM(OpenStreetMap)加载瓦片地图。

2. 拖拽交互

  • 通过 DragAndDrop 交互组件支持拖拽文件,并监听 addfeatures 事件,解析上传的地理数据。
  • 支持格式包括:
    • GPX(GPS 轨迹)
    • GeoJSON(常见的地理数据格式)
    • IGC(滑翔运动轨迹)
    • KML(Google Earth 使用的 XML 格式)
    • TopoJSON(拓扑数据格式)

3. 显示拖拽的地理数据

  • 解析文件后,将其中的 features(地理要素) 添加到 VectorSource 中,并绑定到 VectorLayer 进行渲染。
  • 使用 map.value.getView().fit(vectorSource.getExtent()) 调整地图视图,使所有要素都可见。

四、在 Vue3 项目中使用该组件

src/App.vue 中引入并使用 OpenLayersMap.vue 组件:

<template> <div> <OpenLayersMap /> </div> 
</template> 
<script setup> 
import OpenLayersMap from './components/OpenLayersMap.vue' 
</script>

五、运行效果

  1. 打开页面 后,会看到一个 OpenStreetMap 地图
  2. 拖拽一个 GeoJSON/KML 等文件 到地图区域,地图会自动加载该文件中的要素并显示。
  3. 地图视图自动调整 以适应加载的图形。


六、总结

本文介绍了如何在 Vue3 中使用 OpenLayers 实现 拖拽加载地理数据文件,并动态解析并显示地理要素。通过 DragAndDrop 交互,我们可以轻松地拖拽 GeoJSON、KML、GPX 等格式的数据到地图上,从而实现可视化展示。

这项功能在 WebGIS 开发 中非常实用,适用于 地图编辑、数据可视化、GIS 数据管理等场景。希望本文能对你有所帮助!🎯🎉

你可以尝试:

  • 增加拖拽提示,例如 "请拖拽文件到地图上"。
  • 添加数据属性窗口,点击要素后显示具体信息。
  • 支持更多数据格式,比如 Shapefile(需要额外解析库)。

如果你觉得本文对你有帮助,欢迎点赞、评论和关注!😊

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

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

相关文章

VM虚拟机安装群晖系统

下载群晖系统 https://download.csdn.net/download/hmxm6/90351935 安装群晖连接软件 synology-assistant-6.2-24922(在上面的压缩包里面) 准备好VM虚拟机 创建群晖虚拟机 打开下载下来的虚拟机 添加硬盘 选择类型 创建新的磁盘 指定容量 指定存储文件 完成硬盘添加…

瞬态分析中的时域分析与频域分析:原理、对比与应用指南

目录 一、核心概念区分 二、时域分析&#xff1a;时间维度直接求解 1. 基本原理 2. 关键特点 3. 典型算法 4. 应用案例 三、频域分析&#xff1a;频率维度的等效映射 1. 基本原理 2. 关键特点 3. 典型方法 4. 应用案例 四、对比与选择依据 1. 方法论对比 2. 工程…

基于LMStudio本地部署DeepSeek R1

DeepSeek R1 DeepSeek R1是由DeepSeek团队开发的一款高性能AI推理模型&#xff0c;其开源版本包括完整的DeepSeek R1 671B权重&#xff0c;以及基于其蒸馏出的多个小型模型。 DeepSeek R1通过蒸馏技术将推理模式迁移到更小的模型中&#xff0c;显著提升了这些模型的推理能力。…

2.攻防世界 ics-06

题目描述处给出提示 进入题目页面如下 发现只有报表中心能进入下一个页面 页面内容&#xff1a; 发现有传参 改变日期也没有变化 更改id数值页面也没有回显 猜测应该有一个特定id对应的页面即为那一处入侵者留下的数据 下面使用burp suite爆破id值 先用burp suite抓包 右键…

Linux 的使用

补充内容&#xff1a;EasyHPC - Linux基础入门【笔记】 文章目录 文档与教程终端命令 文档与教程 Linux 操作系统目录结构解释 - Linux迷 (linuxmi.com) 一个专注于Linux和开源技术的在线平台&#xff1a;It’s FOSS (itsfoss.com)理解各种命令&#xff1a;explainshell.com -…

机器学习-线性回归(最大似然估计)

机器学习任务可以分为两类: 一类是样本的特征向量 &#x1d499; 和标签 &#x1d466; 之间存在未知的函数关系&#x1d466; h(&#x1d499;)&#xff0c;另一类是条件概率&#x1d45d;(&#x1d466;|&#x1d499;)服从某个未知分布。最小二乘法是属于第一类&#xff0c…

数据完整性与约束的分类

一、引言 为什么需要约束&#xff1f;为了保证数据的完整性。 &#xff08;1&#xff09;数据完整性 数据完整性指的是数据的精确性和可靠性。 为了保证数据的完整性&#xff0c;SQL对表数据进行额外的条件限制&#xff0c;从以下四方面考虑&#xff1a; ①实体完整性&…

autMan奥特曼机器人-对接deepseek教程

一、安装插件ChatGPT 符合openai api协议的大模型均可使用此插件&#xff0c;包括chatgpt-4/chatgpt-3.5-turbo&#xff0c;可自定义服务地址和模型&#xff0c;指令&#xff1a;gpt&#xff0c;要求Python3.7以上&#xff0c;使用官方库https://github.com/openai/openai-pyt…

@[TOC](优先级队列(堆)) 【本节目标】 1. 掌握堆的概念及实现 2. 掌握 PriorityQueue 的使用

优先级队列&#xff08;堆&#xff09; 1. 优先级队列1.1 概念 2. 优先级队列的模拟实现2.1 堆的概念2.2 堆的存储方式2.3 堆的创建2.3.1 堆向下调整2.3.2 堆的创建2.3.3 建堆的时间复杂度 2.4 堆的插入与删除2.4.1 堆的插入2.4.2 堆的删除 2.5 用堆模拟实现优先级队列 【本节目…

【Linux网络编程】之守护进程

【Linux网络编程】之守护进程 进程组进程组的概念组长进程 会话会话的概念会话ID 控制终端控制终端的概念控制终端的作用会话、终端、bash三者的关系 前台进程与后台进程概念特点查看当前终端的后台进程前台进程与后台进程的切换 进程组 进程组的概念 当我们使用以下命令查与…

11.PPT:世界动物日【25】

目录 NO12​ NO34 NO56​ NO789视频音频​ NO10/11/12​ NO12 设计→幻灯片大小→ →全屏显示&#xff08;16&#xff1a;9&#xff09;确定调整标题占位符置于图片右侧&#xff1a;内容占位符与标题占位符左对齐单击右键“世界动物日1”→复制版式→大小→对齐 幻灯片大小…

Java项目: 基于SpringBoot+mybatis+maven+mysql实现的智能学习平台管理系(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenmysql实现的智能学习平台管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、…

Odoo免费开源ERP最佳业务实践:主生产计划概论

Odoo主生产计划(Master Production Schedule&#xff0c; MPS)是确定每一个具体产品在每一个具体时间段的生产计划。 文&#xff5c;开源智造Odoo亚太金牌服务 老杨 概述 Odoo是全球排名第一的免费开源ERP系统&#xff0c;以其强大的功能和模块化设计著称&#xff0c;适用于各…

TOTP实现Google Authenticator认证工具获取6位验证码

登录遇到Google认证怎么办? TOTP是什么?(Google Authenticator) TOTP(Time-based One-Time Password)是一种基于时间的一次性密码算法,主要用于双因素身份验证。其核心原理是通过共享密钥和时间同步生成动态密码,具体步骤如下: 共享密钥:服务端与客户端预先共享一个…

@RequestBody与@ResponseBody:Spring数据处理的“翻译官”

在Spring中&#xff0c;RequestBody和ResponseBody注解就像是数据交换的“翻译官”。 1. RequestBody注解&#xff1a;它的作用就像是把客户端发来的“外语”翻译成Java对象。当我们发送一个HTTP请求到服务器时&#xff0c;请求体里通常包含了一些数据&#xff0c;这些数据可能…

网络爬虫学习:借助DeepSeek完善爬虫软件,增加停止任务功能

一、引言 我从24年11月份开始学习网络爬虫应用开发&#xff0c;经过2个来月的努力&#xff0c;终于完成了开发一款网络爬虫软件的学习目标。这几天对本次学习及应用开发进行一下回顾总结。前面已经发布了两篇日志&#xff1a; 网络爬虫学习&#xff1a;应用selenium从搜*狐搜…

LM Studio 部署本地大语言模型

一、下载安装 1.搜索&#xff1a;lm studio LM Studio - Discover, download, and run local LLMs 2.下载 3.安装 4.更改成中文 二、下载模型(软件内下载) 1.选择使用代理&#xff0c;否则无法下载 2.更改模型下载目录 默认下载位置 C:\Users\用户名\.lmstudio\models 3.搜…

基于知乎平台的“开源AI智能名片2 + 1链动模式S2B2C商城小程序”引流策略研究

摘要&#xff1a;本文聚焦于如何借助知乎平台的高权重及优质用户特性&#xff0c;对“开源AI智能名片2 1链动模式S2B2C商城小程序”进行有效引流。通过深入分析知乎平台的用户特点、引流规则&#xff0c;并结合具体的引流方法&#xff0c;旨在为相关项目在知乎平台实现高效用户…

Oracle CDB自动处理表空间不足脚本

之前我曾经发过一个自动处理表空间的脚本&#xff0c;可以通过定时任务自动处理表空间不足的问题&#xff1b;但是之前那个脚本没有涵盖CDB模式下的PDB&#xff0c;这里将脚本做了一下更新&#xff0c;可以处理CDB模式下多PDB的表空间问题。 传统模式的脚本请参考这个链接 Or…

在 Navicat 17 中扩展 PostgreSQL 数据类型 | 创建自定义域

定义域 以适当的格式存储数据可以确保数据完整性&#xff0c;防止错误&#xff0c;优化性能&#xff0c;并通过实施验证规则和支持高效数据管理来维护系统间的一致性。基于这些原因&#xff0c;顶级关系数据库&#xff08;如PostgreSQL&#xff09;提供了多种数据类型。此外&a…