32.在 Vue 3 中上传 KML 文件并在地图上显示

前言

在现代的地理信息系统(GIS)应用中,我们经常需要将地理空间数据加载到地图中以供可视化展示。KML(Keyhole Markup Language)是一种基于 XML 格式的文件格式,广泛用于存储地理信息数据,特别是在 Google Earth 和其他 GIS 系统中。本文将介绍如何在 Vue 3 项目中实现上传 KML 文件,并在地图上显示其内容。

KML 文件格式简介

KML(Keyhole Markup Language)是一种用于描述地理信息的 XML 格式。KML 文件通常包含地理坐标、地理标记、路径、区域以及其他地理对象。KML 文件可以在多种地图工具中使用,包括 Google Earth 和 OpenLayers。

KML 文件的基本结构

一个 KML 文件的基本结构通常包括以下几个部分:

  1. <kml>:根元素,声明了文件的版本和命名空间。
  2. <Document>:包含多个地理标记和其他地理信息。
  3. <Placemark>:表示一个地理标记,通常包括名称、描述和坐标信息。
  4. <Point><LineString><Polygon>:表示具体的地理形状,如点、线或面。

以下是一个简单的 KML 文件示例:

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <name>Sample KML</name> <Placemark> <name>Point 1</name> <Point> 
<coordinates>-95.6185,37.6185,0</coordinates> </Point> </Placemark> <Placemark> <name>Point 2</name> <Point> <coordinates>-118.2437,34.0522,0</coordinates> </Point> </Placemark> </Document> 
</kml>

此文件包含两个地理点,分别位于美国堪萨斯州和洛杉矶。

实现功能:上传 KML 文件并显示在地图上

接下来,我们将在 Vue 3 项目中实现以下功能:

  1. 用户上传 KML 文件。
  2. 解析 KML 文件内容,并将其中的地理标记显示在地图上。

1. 创建 Vue 3 项目

如果尚未创建 Vue 3 项目,可以使用以下命令来创建一个新项目:

npm install -g @vue/cli vue create vue-kml-upload

选择 Vue 3 配置,然后进入项目目录:

cd vue-kml-upload

2. 安装依赖

本项目需要使用 OpenLayers 来显示地图,以及 D3.js 来读取和解析 KML 文件。安装依赖:

npm install ol d3-fetch

3. 编写组件:上传 KML 文件并显示在地图上

src/components 文件夹下创建一个新的组件文件 KMLMap.vue,并在其中编写代码:

KMLMap.vue
<!--* @Author: 彭麒* @Date: 2024/12/17* @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上传KML文件,并在map上显示</div><h4><input style="margin-top: 16px" type="file" id="fileselect" accept=".kml"/></h4><div id="vue-openlayers"></div></div></div>
</template><script setup>
import {ref, onMounted} from 'vue';
import 'ol/ol.css';
import {Map, View} from 'ol';
import SourceVector from 'ol/source/Vector';
import LayerVector from 'ol/layer/Vector';
import KML from 'ol/format/KML';
import {Tile} from 'ol/layer';
import OSM from 'ol/source/OSM';
import Fill from 'ol/style/Fill';
import Stroke from 'ol/style/Stroke';
import Style from 'ol/style/Style';
import Text from 'ol/style/Text';
import router from "@/router";const goBack = () => {router.push('/OpenLayers');
};
const map = ref(null); // 响应式地图对象
const source = ref(new SourceVector({wrapX: false,format: new KML({extractStyles: false, // 不提取样式}),})
);
const view = ref(new View({projection: 'EPSG:3857', // 地图投影center: [11585992.5, 3585872.5], // 地图中心点(成都市)zoom: 3, // 地图缩放级别})
);// 读取上传的 KML 文件并添加到地图
const readFile = () => {const fileselect = document.querySelector('#fileselect'); // 获取文件选择器fileselect.addEventListener('change', function (e) {const files = e.target.files; // 获取选择的文件if (files.length === 0) {alert('没有数据,请重新上传新文件!'); // 提示没有选择文件return;}const reader = new FileReader();reader.readAsText(files[0]); // 读取KML文件的内容reader.onload = function (evt) {const shparray = evt.target.result; // 获取文件内容// 使用 KML 格式读取数据const allFeatures = source.value.getFormat().readFeatures(shparray, {dataProjection: 'EPSG:4326', // 数据投影featureProjection: 'EPSG:3857', // 特征投影});// 添加所有的 Feature 到 Sourcesource.value.addFeatures(allFeatures);// 设置样式source.value.forEachFeature(function (feature) {const style = new Style({fill: new Fill({color: 'purple'}), // 填充颜色stroke: new Stroke({color: 'orange'}), // 边框颜色text: new Text({text: feature.get('name'), // 显示的文本font: '12px Calibri,sans-serif', // 字体样式fill: new Fill({color: '#000'}), // 文本填充颜色stroke: new Stroke({color: '#fff', // 文本边框颜色width: 2,}),}),});feature.setStyle(style); // 应用样式});};});
};// 初始化地图
const initMap = () => {map.value = new Map({target: 'vue-openlayers', // 地图渲染的目标元素layers: [new Tile({source: new OSM(), // 添加 OSM 图层}),new LayerVector({source: source.value, // 添加矢量图层}),],view: view.value,});
};onMounted(() => {initMap(); // 组件挂载时初始化地图readFile(); // 读取文件
});</script><style scoped>
.container {width: 840px;height: 590px;margin: 50px auto;border: 1px solid #42b983;
}#vue-openlayers {width: 800px;height: 400px;margin: 0 auto;border: 1px solid #42b983;position: relative;
}
</style>

4. 功能解析

1. 读取文件:

我们使用了 HTML <input type="file"> 元素来允许用户上传 KML 文件。通过 FileReader 对象,我们能够读取文件的内容,并将其传递给 OpenLayers 的 KML 格式解析器。

2. 显示地图:

通过 OpenLayers 库,我们使用 Tile 图层加载底图(OSM),并通过 VectorLayer 加载和显示 KML 文件中的地理标记(Placemark)。

3. 样式设置:

我们为每个 Placemark 设置了基本的样式(紫色填充、橙色边框和文本),让其在地图上更易于区分。

4. 数据投影:

KML 文件中的地理数据通常采用 EPSG:4326 投影,而 OpenLayers 地图使用的是 EPSG:3857 投影。为了正确显示,我们在读取 KML 数据时进行投影转换。

5. 总结

通过本文的实现,您可以轻松在 Vue 3 中上传 KML 文件并将其显示在地图上。KML 文件作为一种标准的地理数据格式,广泛应用于地理信息系统(GIS)中,通过 OpenLayers 和 Vue 3 的组合,您可以方便地实现地图数据的可视化和交互。希望本文对您有所帮助,如果有任何问题,欢迎在评论区留言。

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

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

相关文章

uniapp使用百度地图配置了key,但是显示Map key not configured

搞了我两天的一个问题。 hbuilderx版本&#xff1a;4.36 问题介绍&#xff1a; 我的项目是公司的项目&#xff0c;需要在H5端使用百度地图&#xff0c;使用vue-cli创建的uniapp&#xff0c;就是uni代码在src里的目录结构。就是使用这种方式才会遇到这个问题。 问题原因&#xf…

使用cuda12编译时报错block_merge_sort.cuh(169): error: expected a “,“ or “>“

模型的工程化版C程序使用CUDA11.3和11.6编译时没任何错误&#xff0c;为适应高版本的jetpack环境&#xff0c;切换到CUDA12编译时总是报错: /workspace/cuda-12.0/bin/nvcc /workspace/focc/iou3d_nms.cu -c -o ./build/CMakeFiles/bev.dir/src/./bev_generated_iou3d_nms.cu.…

React状态管理常见面试题目(二)

为什么 Redux 能做到局部渲染? Redux能做到局部渲染&#xff0c;主要是因为它采用了单向数据流和状态管理机制。在Redux中&#xff0c;整个应用的状态被存储在一个单一的store中&#xff0c;当状态发生变化时&#xff0c;Redux通过分发action来更新state&#xff0c;并通过re…

【Qt】drawText字体大小问题探究

背景 软件的一个功能是&#xff1a; 打开图片在图片上绘制序号&#xff0c;序号的样式是圆圈内包含数字将带有序号的图片打印出来 实现思路也很简单&#xff0c;在屏幕上显示时重写paintEvent函数&#xff0c;利用QPainter完成图片和序号的绘制。打印时只需要将QPainter对应…

Unity背包道具拖拽(极简版实现)

&#xff08;感觉Csdn代码页面可以再大一点或者加个放大功能 不然得划着看不太舒服&#xff09; 1.关键接口&#xff0c;三个拖拽相关的 2.关键参数&#xff0c;PointerEventData 一直没仔细看过&#xff0c;其实有包含鼠标相关的很多参数&#xff0c;鼠标点击次数&#xff…

Win11安装安卓子系统WSA

文章目录 简介一、启用Hyper-V二、安装WSA三、安装APKAPK商店参考文献 简介 WSA&#xff1a;Windows Subsystem For Android 一、启用Hyper-V 控制面板 → 程序和功能 → 启用或关闭 Windows 功能 → 勾选 Hyper-V 二、安装WSA 进入 Microsoft Store&#xff0c;下拉框改为 …

《红队和蓝队在网络安全中的定义与分工》

网络安全中什么是红队蓝队 在网络安全领域&#xff0c;红队和蓝队是一种对抗性的演练机制&#xff0c;用于测试和提升网络安全防御能力。 红队&#xff08;Red Team&#xff09; 定义与目标 红队是扮演攻击者角色的团队。他们的主要任务是模拟真实的网络攻击&#xff0c;利用各…

Redis 和 Mysql 中的数据一致性问题

Redis 和 MySQL 的数据很难直接实现 强一致性&#xff0c;但可以通过一些策略尽量接近或实现 最终一致性。下面从两者的特性、挑战以及解决方案来分析。 Redis 和 MySQL 的特性 Redis&#xff1a; 是一个基于内存的高性能键值数据库&#xff0c;常用于缓存、分布式锁和消息队…

数据结构 ——二叉树转广义表

数据结构 ——二叉树转广义表 1、树转广义表 如下一棵树&#xff0c;转换为广义表 root(c(a()(b()()))(e(d()())(f()(j(h()())())))) (根&#xff08;左子树&#xff09;&#xff08;右子树&#xff09;) 代码实现 #include<stdio.h> #include<stdlib.h>//保存…

企业车辆管理系统(源码+数据库+报告)

一、项目介绍 352.基于SpringBoot的企业车辆管理系统&#xff0c;系统包含两种角色&#xff1a;管理员、用户,系统分为前台和后台两大模块 二、项目技术 编程语言&#xff1a;Java 数据库&#xff1a;MySQL 项目管理工具&#xff1a;Maven 前端技术&#xff1a;Vue 后端技术&a…

ubuntu20.04复现 Leg-KILO

这里写目录标题 opencv版本问题下载3.2.0源代码进入解压后的目录创建构建目录运行 CMake 配置 配置时指定一个独立的安装目录&#xff0c;例如 /opt/opencv-3.2&#xff1a;出错&#xff1a; 使用多线程编译错误1&#xff1a; stdlib.h: 没有那个文件或目录错误2&#xff1a;er…

如何保证开源AI呼入机器人和AI呼出机器人的数据安全性?

如何保证开源AI呼入机器人和AI呼出机器人的数据安全性&#xff1f; 作者&#xff1a;开源呼叫中心FreeIPCC 确保开源AI呼入机器人和AI呼出机器人的数据安全性是部署这些智能系统时不可或缺的一部分。随着越来越多的企业依赖于自动化客户服务和外呼营销&#xff0c;保护用户隐…

基于SpringBoot+vue的高校学生成绩管理系统

目录 一、绪论1.1 开发背景1.2 系统开发平台1.2.1 Vue简介1.2.2 IDEA简介1.2.3 MySQL简介 1.3 系统开发环境 二、需求分析2.1 系统需求分析2.2 系统数据流图 三、概要设计3.1 业务流程分析 四、详细设计4.1 系统功能结构图4.2 E-R模型4.3 数据库表设计 五、模块实现5.1 管理员主…

微信小程序苹果手机自带的数字键盘老是弹出收起,影响用户体验,100%解决

文章目录 1、index.wxml2、index.js3、index.wxss1、index.wxml <!--index.wxml--> <view class="container"><view class="code-input-container"><view class="code-input-boxes"><!-- <block wx:for="{{…

Docker--Docker Image(镜像)

什么是Docker Image&#xff1f; Docker镜像&#xff08;Docker Image&#xff09;是Docker容器技术的核心组件之一&#xff0c;它包含了运行应用程序所需的所有依赖、库、代码、运行时环境以及配置文件等。 简单来说&#xff0c;Docker镜像是一个轻量级、可执行的软件包&…

RabbitMQ的核心组件有哪些?

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ的核心组件有哪些&#xff1f;】面试题。希望对大家有帮助&#xff1b; RabbitMQ的核心组件有哪些&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ是一个开源的消息代理&#xff08;Messag…

[OpenGL] Transform feedback 介绍以及使用示例

一、简介 本文介绍了 OpenGL 中 Transform Feedback 方法的基本概念和代码示例。 二、Transform Feedback 介绍 1. Transform Feedback 简介 根据 OpenGL-wiki&#xff0c;Transform Feedback 是捕获由顶点处理步骤&#xff08;vertex shader 和 geometry shader&#xff0…

【Linux】—简单实现一个shell(myshell)

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦&#xff01; 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&…

什么是Apache日志?为什么Apache日志分析很重要?

Apache是全球最受欢迎的Web服务器软件&#xff0c;支持约30.2%的所有活跃网站。凭借其可靠性、灵活性和强大的功能&#xff0c;Apache数十年来一直是互联网的中坚力量。 一、Apache Web服务器的工作原理 Apache Web服务器的工作原理如下&#xff1a; 接收HTTP请求&#xff1…

如何使用 uni-app 构建直播应用程序?

使用uni-app构建直播应用程序涉及前端和后端的开发&#xff0c;以及音视频处理技术的选择。下面我将概述一个典型的直播应用架构&#xff0c;并详细说明如何在uni-app中实现关键功能。 直播应用架构 前端&#xff08;uni-app&#xff09;&#xff1a;负责用户界面展示、互动逻…