39.在 Vue3 中使用 OpenLayers 导出 GeoJSON 文件及详解 GEOJSON 格式

news2024/12/23 20:32:57

一、引言

在 Web 地图开发领域,Vue3 作为一款流行的前端框架,结合强大的 OpenLayers 地图库,能够实现丰富多样的地图功能。其中,将地图数据以 GeoJSON 格式导出是一项常见且实用的需求,本文将深入探讨如何在 Vue3 环境下借助 OpenLayers 达成这一目标,并详细剖析 GeoJSON 格式文件。

二、准备工作

  1. 项目搭建

首先,确保你已经创建了一个 Vue3 项目。可以使用 Vue CLI 或者 Vite 等工具快速搭建项目骨架,安装必要的依赖,如 vue、@vue/compiler-sfc 等核心包。

  1. 引入 OpenLayers

通过 npm 安装 OpenLayers:npm install ol,然后在需要使用地图功能的组件中引入相关模块,例如:

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';

三、在 Vue3 组件中使用 OpenLayers 绘制图形

为了后续导出 GeoJSON 文件,我们先得在地图上绘制一些图形。以下是一个简单示例,创建一个点要素并添加到地图图层:

<!--
 * @Author: 彭麒
 * @Date: 2024/12/21
 * @Email: 1062470959@qq.com
 * @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。
 -->
<template>
    <button class="back-button" @click="goBack">返回</button>
    <div class="container">
        <div class="w-full flex justify-center flex-wrap">
            <div class="font-bold text-[24px]">在Vue3中使用OpenLayers导出GeoJSON文件</div>
        </div>
        <h4>
            <el-button type="danger" size="small" @click="exportJson">导出GeoJSON</el-button>
        </h4>
        <div id="vue-openlayers"></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 { Tile } from 'ol/layer';
import OSM from 'ol/source/OSM';
import { saveAs } from 'file-saver';
import router from "@/router";
const goBack = () => {
    router.push('/OpenLayers');
};
const map = ref(null);
const source = new SourceVector({ wrapX: false });
const view = new View({
    projection: "EPSG:4326",
    center: [8.2275, 6.8185],
    zoom: 3
});

const exportJson = () => {
    let feadata = {
        "type": "FeatureCollection",
        "features": [
            {
                "type": "Feature",
                "geometry": { "type": "Point", "coordinates": [102.0, 0.5] },
                "properties": { "prop0": "value0" }
            },
            {
                "type": "Feature",
                "geometry": {
                    "type": "LineString",
                    "coordinates": [
                        [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
                    ]
                },
                "properties": {
                    "prop0": "value0",
                    "prop1": 0.0
                }
            },
            {
                "type": "Feature",
                "geometry": {
                    "type": "Polygon",
                    "coordinates": [
                        [[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]
                    ]
                },
                "properties": {
                    "prop0": "value0",
                    "prop1": { "this": "that" }
                }
            }
        ]
    };

    const content = JSON.stringify(feadata);
    const blob = new Blob([content], { type: 'text/plain;charset=utf-8' });
    saveAs(blob, 'data.geojson');
};

const initMap = () => {
    map.value = new Map({
        target: 'vue-openlayers',
        layers: [
            new Tile({
                source: new OSM()
            }),
        ],
        view: view
    });
};

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

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

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

这里我们创建了一个按钮,点击时获取矢量源中的所有要素,利用 ol.format.GeoJSON 格式化工具将其转换为 GeoJSON 字符串,接着创建一个 Blob 对象包装数据,生成下载链接,最后模拟点击下载链接实现文件下载,并且记得清理创建的临时 URL。

五、GeoJSON 格式详解

GeoJSON 是一种基于 JavaScript 对象表示法(JSON)的地理空间数据交换格式,它简洁且易于读写,被广泛应用于 Web 地图开发等领域。

  1. 基本结构

一个典型的 GeoJSON 对象包含一个 type 字段和一个 coordinates 字段(不同几何类型下该字段结构有差异)。例如,对于一个点要素:

 
{

    "type": "Feature",

    "geometry": {

    "type": "Point",

    "coordinates": [10, 10]

    },

    "properties": {}

}

这里 type 为 Feature 表示这是一个地理要素,geometry 描述了几何形状(这里是点,坐标为 [10, 10]),properties 可用于存放自定义属性,比如地名、要素类别等信息,当前为空。

2. 几何类型

  • 点(Point):如上述示例,由单个坐标对表示,在三维空间中可以是 [x, y, z],但常见二维 [x, y]。
  • 线(LineString):由一系列坐标点组成的有序数组,例如:
{

    "type": "Feature",

    "geometry": {

    "type": "LineString",

    "coordinates": [[0, 0], [1, 1], [2, 2]]

    }

}

表示一条连接 [0, 0]、[1, 1]、[2, 2] 三个点的折线。

  • 多边形(Polygon):由一个外部环和零个或多个内部环组成,每个环都是一个坐标点数组,外部环定义多边形边界,内部环表示内部空洞(若有),如:
{

"type": "Feature",

    "geometry": {

    "type": "Polygon",

    "coordinates": [[[0, 0], [0, 1], [1, 1], [1, 0], [0, 0]]]

    }

}

定义了一个简单的矩形多边形。

3. 要素集合(FeatureCollection)

当有多个地理要素时,通常使用 FeatureCollection 包装,例如:

{

"type": "FeatureCollection",

"features": [{

    "type": "Feature",

    "geometry": {

        "type": "Point",

        "coordinates": [10, 10]

    }

},

    {

    "type": "Feature",

    "geometry": {

        "type": "LineString",

        "coordinates": [[0, 0], [1, 1], [2, 2]]

    }

}]

}

它允许将多个点、线、多边形等要素统一组织,方便传输与存储。

六、总结

通过本文,我们了解了在 Vue3 项目中整合 OpenLayers 实现地图绘制以及将地图要素导出为 GeoJSON 文件的方法,同时深入学习了 GeoJSON 格式的构成与各类几何类型细节。这为后续处理地理空间数据、与后端交互或在不同地图平台间共享数据奠定了坚实基础,开发者可基于此进一步拓展功能,如优化绘制工具、丰富导出选项等,以满足更复杂的业务需求。

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

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

相关文章

git企业开发的相关理论(一)

目录 一.初识git 二.git的安装 三.初始化/创建本地仓库 四.配置用户设置/配置本地仓库 五.认识工作区、暂存区、版本库 六.添加文件__场景一 七.查看 .git 文件/添加到本地仓库后.git中发生的变化 1.执行git add后的变化 index文件&#xff08;暂存区&#xff09; lo…

Linux网络——网络基础

Linux网络——网络基础 文章目录 Linux网络——网络基础一、计算机网络的发展背景1、网络的定义&#xff08;1&#xff09; 独立模式&#xff08;2&#xff09;网络互联 2、局域网 LAN3、广域网 WAN4、比较局域网和广域网5、扩展 —— 域域网和互联网 二、协议1、协议的概念2、…

react中实现导出excel文件

react中实现导出excel文件 一、安装依赖二、实现导出功能三、自定义列标题四、设置列宽度五、样式优化1、安装扩展库2、设置样式3、扩展样式功能 在 React 项目中实现点击按钮后导出数据为 Excel 文件&#xff0c;可以使用 xlsx 和 file-saver 这两个库。 一、安装依赖 在项目…

7-Zip 加密功能使用教程:如何设置密码保护压缩文件

压缩包如何加密&#xff1f;7-Zip 是一款开源的文件归档工具&#xff0c;支持多种压缩格式&#xff0c;并提供了对压缩文件进行加密的功能。使用 7-Zip 可以轻松创建和解压 .7z、.zip 等格式的压缩文件&#xff0c;并且可以通过设置密码来保护压缩包中的数据不被未授权访问。 准…

[计算机网络]ARP协议的故事:小明找小红的奇妙旅程

1.ARP小故事 在一个繁忙的网络世界中&#xff0c;每个设备都有自己的身份标识——MAC地址&#xff0c;就像每个人的身份证号码一样。在这个故事里&#xff0c;我们的主角小明&#xff08;主机&#xff09;需要找到小红&#xff08;目标主机&#xff09;的MAC地址&#xff0c;才…

新版国标GB28181设备端Android版EasyGBD支持国标GB28181-2022,支持语音对讲,支持位置上报,开源在Github

经过近3个月的迭代开发&#xff0c;新版本的国标GB28181设备端EasyGBD安卓Android版终于在昨天发布到Github了&#xff0c;最新的EasyGBD支持了国标GB28181-2022版&#xff0c;还支持了语音对讲、位置上报、本地录像等功能&#xff0c;比原有GB28181-2016版的EasyGBD更加高效、…

McDonald‘s Event-Driven Architecture 麦当劳事件驱动架构

原文链接 1 mcdonalds-technical-blog/ 原文链接 2 mcdonalds-technical-blog/ 麦当劳在异步、事务性和分析性处理用例中使用跨技术栈的事件&#xff0c;包括移动订单进度跟踪和向客户发送营销通信&#xff08;交易和促销&#xff09;。 统一事件平台&#xff08;unified eve…

【CSS in Depth 2 精译_089】15.2:CSS 过渡特效中的定时函数

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 15 章 过渡】 ✔️ 15.1 状态间的由此及彼15.2 定时函数 ✔️ 15.2.1 定制贝塞尔曲线 ✔️15.2.2 阶跃 ✔️ 15.3 非动画属性 文章目录 15.2 定时函数 Timing function…

一个开源的自托管虚拟浏览器项目,支持在安全、私密的环境中使用浏览器

大家好&#xff0c;今天给大家分享一个开源的自托管虚拟浏览器项目Neko&#xff0c;旨在利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器&#xff0c;为用户提供安全、私密且多功能的浏览体验。 项目介绍 Neko利用 WebRTC 技术在 Docker 容器中运行虚拟浏览器&#xff0c;提供…

AW36518芯片手册解读(3)

接前一篇文章&#xff1a;AW36518芯片手册解读&#xff08;2&#xff09; 二、详述 3. 功能描述 &#xff08;1&#xff09;上电复位 当电源电压VIN降至预定义电压VPOR&#xff08;典型值为2.0V&#xff09;以下时&#xff0c;该设备会产生复位信号以执行上电复位操作&#x…

浅谈目前我开发的前端项目用到的设计模式

浅谈目前我开发的前端项目用到的设计模式 前言 设计模式很多&#xff0c;看到一个需求&#xff0c;项目&#xff0c;我们去开发的时候&#xff0c;肯定是做一个整体的设计进行开发&#xff0c;而在这次我项目中&#xff0c;我也做了一个整体的设计&#xff0c;为什么要设计&a…

线性规划中的几种逻辑表达式

线性规划中的几种逻辑表达式 注意&#xff1a; 摘录字刘博士的《数学建模与数学规划》&#xff0c; 以便用时可查。 实际上Gurobi API 中自身放啊变的逻辑表达式函数&#xff0c;下面列出自定义的实现方式。 1 逻辑与 如果 x 1 1 x_1 1 x1​1, x 2 1 x_2 1 x2​1, 那…

JVM对象分配内存如何保证线程安全?

大家好&#xff0c;我是锋哥。今天分享关于【JVM对象分配内存如何保证线程安全&#xff1f;】面试题。希望对大家有帮助&#xff1b; JVM对象分配内存如何保证线程安全&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中&#xff0c;对象的内存分配…

Antd react上传图片格式限制

限制分辨率&#xff08;像素&#xff09; <a-upload :before-upload"beforeUpload">// 上传图片宽高比例限制const beforeUpload file > {return new Promise((resolve, reject) > {// // 图片类型限制// let isJpgOrPng file.type image/png || fil…

基于 iAP2 协议 的指令协议,用于对安防设备的 MCU 进行操作

协议设计目标 1. 安全性&#xff1a;通过 iAP2 协议与 MCU 设备进行安全通信。 2. 通用性&#xff1a;支持对安防设备的常见功能进行操作&#xff0c;如状态查询、设备控制、参数配置等。 3. 高效性&#xff1a;数据结构简洁清晰&#xff0c;易于解析和扩展。 4. 扩展性&#x…

Type-C单口便携屏LDR6021

随着科技的飞速发展&#xff0c;便携式电子产品在我们的日常生活中扮演着越来越重要的角色。在这一背景下&#xff0c;Type-C单口便携显示器作为一种新兴的显示设备&#xff0c;凭借其独特的优势迅速崭露头角&#xff0c;成为市场的新宠。本文将深入探讨Type-C单口便携显示器的…

Ubuntu 20.04 卸载和安装 MySQL8.0

卸载 首先&#xff0c;检查一下系统安装的软件包有哪些&#xff0c;使用dpkg -l | grep mysql命令&#xff1a; 为了将MySQL卸载干净&#xff0c;这些文件都需要被删除。 在Ubuntu20.04系统下&#xff0c;卸载干净MySQL8.0以确保下一次安装不会出错&#xff0c;可以按照以下…

NOTEBOOK_11 汽车电子设备分享(工作经验)

汽车电子设备分享 摘要 本文主要列出汽车电子应用的一些实验设备和生产设备&#xff0c;部分会给予一定推荐。目录 摘要一、通用工具&#xff1a;二、测量与测试仪器2.1测量仪器2.2无线通讯测量仪器2.3元器件测试仪2.4安规测试仪2.5电源供应器2.6电磁兼容测试设备2.7可靠性环境…

黑马Java面试教程_P8_并发编程

系列博客目录 文章目录 系列博客目录前言1.线程的基础知识1.1 线程和进程的区别&#xff1f;难2频3面试文稿 1.2 并行和并发有什么区别&#xff1f; 难1频1面试文稿 1.3 创建线程的四种方式 难2频4面试文稿 1.4 runnable 和 callable 有什么区别 难2频3面试文稿 1.5 线程的 run…

【活动邀请·深圳】深圳COC社区 深圳 AWS UG 2024 re:Invent re:Cap

re:Invent 是全球云计算领域的顶级盛会&#xff0c;每年都会吸引来自世界各地的技术领袖、创新者和实践者汇聚一堂&#xff0c;分享最新的技术成果和创新实践&#xff0c;深圳 UG 作为亚马逊云科技技术社区的重要组成部分&#xff0c;将借助 re:Invent 的东风&#xff0c;举办此…