60.在 Vue 3 中使用 OpenLayers 绘制自由线段、自由多边形

前言

在现代 Web 开发中,地图功能已经成为许多应用的重要组成部分。OpenLayers 是一个强大的开源地图库,支持多种地图源和地图操作。结合 Vue 3 的响应式特性,我们可以轻松实现地图的交互功能。本文将详细介绍如何在 Vue 3 中使用 OpenLayers 绘制自由线段和自由多边形。


技术栈

  • Vue 3:用于构建用户界面。

  • OpenLayers:用于地图渲染和图形绘制。

  • Element Plus:用于 UI 组件(如下拉菜单)。


实现步骤

1. 环境准备

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

npm create vue@latest

然后安装 OpenLayers 和 Element Plus:

npm install ol element-plus

2. 项目结构

在项目中创建一个组件,例如 OpenLayersFreehand.vue,用于实现地图绘制功能。


3. 代码实现

以下是完整的代码实现:

<!--
 * @Author: 彭麒
 * @Date: 2025/1/7
 * @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绘制自由线段、自由多边形</div>
    </div>
    <h4>
      <el-select id="type" v-model="type" style="width: 240px; margin-top: 20px; margin-bottom: 20px">
        <el-option v-for="item in tools" :key="item.value" :value="item.value">{{ item.label }}</el-option>
      </el-select>
    </h4>

    <div id="vue-openlayers"></div>
  </div>
</template>

<script setup>
import { ref, watch, onMounted } from 'vue';
import 'ol/ol.css';
import { Map, View } from 'ol';
import Tile from 'ol/layer/Tile';
import OSM from 'ol/source/OSM';
import LayerVector from 'ol/layer/Vector';
import SourceVector from 'ol/source/Vector';
import Draw from 'ol/interaction/Draw';
import Fill from 'ol/style/Fill';
import Stroke from 'ol/style/Stroke';
import Style from 'ol/style/Style';
import Circle from 'ol/style/Circle';

// 定义绘制工具类型
const type = ref('Polygon');

// 定义工具选项
const tools = ref([
  { value: 'LineString', label: '自由线' },
  { value: 'Polygon', label: '自由多边形' },
  { value: 'None', label: '无' },
]);

// 定义地图、绘制工具和数据源
const map = ref(null);
const draw = ref(null);
const source = new SourceVector({ wrapX: false });

// 初始化地图
const initMap = () => {
  const raster = new Tile({
    source: new OSM(), // 使用OSM底图
  });

  const vector = new LayerVector({
    source: source,
    style: new Style({
      fill: new Fill({
        color: '#f0f', // 填充颜色
      }),
      stroke: new Stroke({
        width: 2,
        color: '#00f', // 边框颜色
      }),
      image: new Circle({
        radius: 5,
        fill: new Fill({
          color: '#ff0000', // 点样式颜色
        }),
      }),
    }),
  });

  // 创建地图实例
  map.value = new Map({
    target: 'vue-openlayers', // 地图容器ID
    layers: [raster, vector], // 添加底图和矢量图层
    view: new View({
      projection: 'EPSG:4326', // 坐标系
      center: [113.1206, 23.034996], // 中心点
      zoom: 10, // 缩放级别
    }),
  });

  // 添加绘制工具
  addInteraction();
};

// 添加或更新绘制工具
const addInteraction = () => {
  if (draw.value !== null) {
    map.value.removeInteraction(draw.value); // 移除旧的绘制工具
  }

  if (type.value !== 'None') {
    draw.value = new Draw({
      source: source,
      type: type.value,
      freehand: true, // 启用自由绘制模式
      style: new Style({
        fill: new Fill({
          color: '#0f0', // 绘制时填充颜色
        }),
        stroke: new Stroke({
          width: 2,
          color: '#f00', // 绘制时边框颜色
        }),
        image: new Circle({
          radius: 5,
          fill: new Fill({
            color: '#00ff00', // 绘制时点样式颜色
          }),
        }),
      }),
    });

    // 添加绘制工具到地图
    map.value.addInteraction(draw.value);
  }
};

// 监听绘制类型的变化
watch(type, (newVal) => {
  addInteraction();
});

// 组件挂载后初始化地图
onMounted(() => {
  initMap();
});
</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. 代码详解

4.1 地图初始化
  • 使用 Map 和 View 创建地图实例。

  • 添加 OSM 底图和矢量图层。

  • 设置地图的中心点和缩放级别。

4.2 绘制工具
  • 使用 Draw 实现自由线段和自由多边形的绘制。

  • 通过 freehand: true 启用自由绘制模式。

  • 使用 watch 监听工具类型的变化,动态更新绘制工具。

4.3 样式设置
  • 使用 Style 设置绘制时的填充颜色、边框颜色和点样式。


5. 运行效果

运行项目后,页面会显示一个地图和一个下拉菜单。用户可以通过下拉菜单选择绘制类型(自由线、自由多边形),然后在地图上通过鼠标拖动绘制相应的图形。


总结

本文详细介绍了如何在 Vue 3 中使用 OpenLayers 绘制自由线段和自由多边形。通过结合 Vue 3 的 Composition API 和 OpenLayers 的强大功能,我们可以轻松实现复杂的地图交互。希望本文对你有所帮助,欢迎在评论区交流讨论!


参考文档

  • OpenLayers 官方文档

  • Vue 3 官方文档

  • Element Plus 官方文档


希望这篇博文能帮助你在 CSDN 上分享你的技术经验!如果有其他问题,欢迎随时提问!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

krpano 实现文字热点中的三角形和竖杆

krpano 实现文字热点中的三角形和竖杆 实现文字热点中的三角形和竖杆 一个后端写前端真的是脑阔疼 一个后端写前端真的是脑阔疼 一个后端写前端真的是脑阔疼 实现文字热点中的三角形和竖杆 上图看效果 v&#xff1a;2549789059

【算法】字符串算法技巧系列

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入&#xff1a;字符串相关算法技巧 1&#xff1a;字符串转数组 2&#xff1a;子字符串 3&#xff…

Linux x86_64 程序静态链接之重定位

文章目录 一、简介二、链接器2.1 简介2.2 可重定位目标模块2.3 符号解析2.4 重定位 三、重定位 demo 演示3.1 外部函数重定位3.2 static 函数重定位 四、补充参考链接 一、简介 编程的代码无非是由函数和各种变量&#xff0c;以及对这些变量的读、写所组成&#xff0c;而不管是…

【OJ刷题】同向双指针问题

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;OJ刷题入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…

ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found

问题描述&#xff1a;安装MMYOLO或者MMROTATE时&#xff0c;出现的问题&#xff1a; (base) rootautodl-container-78fc438fda-4132d99a:~/autodl-tmp/MMROTATE_PROJECT/mmrotate-1.x# python demo/image_demo.py demo/demo.jpg oriented-rcnn-le90_r50_fpn_1x_dota.py orient…

微信小程序防止重复点击事件

直接写在app.wpy里面&#xff0c;全局可以调用 // 防止重复点击事件preventActive(fn) {const self this;if (this.globalData.PageActive) {this.globalData.PageActive false;if (fn) fn();setTimeout(() > {self.globalData.PageActive true;}, 3000); //设置该时间内…

互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅

本文将给出关于互联网架构演进的一个不同视角。回顾一下互联网的核心理论基础产生的背景&#xff1a; 左边是典型的集中控制通信网络&#xff0c;很容易被摧毁&#xff0c;而右边的网络则没有单点问题&#xff0c;换句话说它很难被全部摧毁&#xff0c;与此同时&#xff0c;分…

css出现边框

前言 正常情况下&#xff0c;开启 contenteditable 属性后会出现 “黑色边框”。 如下图所示&#xff0c;很影响美观&#xff1a; 您可能想去掉它&#xff0c;就像下面这样&#xff1a; 解决方案 通过选择器&#xff0c;将 focus 聚焦时移除 outline 属性即可。 如下代码所示&a…

《机器学习》——随机森林

文章目录 什么是随机森林&#xff1f;随机森林的原理随机森林的优缺点优点缺点 随机森林模型API主要参数 实例实例步骤导入数据处理数据&#xff0c;切分数据构建模型训练模型测试数据并输出分类报告和混淆矩阵画出模型的前十重要性的特征 扩展 什么是随机森林&#xff1f; -随…

uniapp - 基于uniapp+vue3实现自定义增强版table表格组件体验「兼容H5+小程序+App端」

本文提供增强版table表格组件体验,打造跨端表格的新标杆. uv3-table&#xff1a;一款基于uniappvue3跨端自定义手机端增强版表格组件。支持固定表头/列、边框、斑马纹、单选/多选&#xff0c;自定义表头/表体插槽、左右固定列阴影高亮显示。支持编译兼容H5小程序端App端。 提供…

【机器学习】Gaussian Process (GP)

高斯过程&#xff08;Gaussian Process, GP&#xff09; 高斯过程是一种用于监督学习的非参数贝叶斯方法&#xff0c;特别适用于回归和分类任务。GP 提供了一种灵活的建模方式&#xff0c;可以自然地量化预测中的不确定性。 核心思想 高斯过程是定义在函数空间上的分布&#…

在 macOS 中,设置自动将文件夹排在最前

文章目录 1、第一步访达设置2、第二步排序方式 需要两步设置 1、第一步访达设置 按名称排序的窗口中 2、第二步排序方式 选择名称

安装rocketmq dashboard

1、访问如下地址&#xff1a; GitHub - apache/rocketmq-dashboard: The state-of-the-art Dashboard of Apache RoccketMQ provides excellent monitoring capability. Various graphs and statistics of events, performance and system information of clients and applica…

消息中间件面试

RabbitMQ 如何保证消息不丢失 消息重复消费 死信交换机 消息堆积怎么解决 高可用机制 Kafka 如何保证消息不丢失 如何保证消息的顺序性 高可用机制 数据清理机制 实现高性能的设计

Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)

章节3基础功能搭建 46.函数作为值三 package cn . itbaizhan . chapter03 // 函数作为值&#xff0c;函数也是个对象 object FunctionToTypeValue { def main ( args : Array [ String ]): Unit { //Student stu new Student() /*val a ()>{"GTJin"…

力扣 跳跃游戏

每次更新目标位置时&#xff0c;实际上是在做一个局部的最优选择&#xff0c;选择跳跃能够到达当前目标位置的最远位置。因为每次更新目标位置时&#xff0c;都是基于当前能跳跃到的最远位置&#xff0c;因此最终的结果是全局最优的。 题目 从前往后遍历&#xff0c;更新可以到…

hive迁移后修复分区慢,怎么办?

我有1个30TB的分区表&#xff0c;客户给的带宽只有600MB&#xff0c;按照150%的耗时来算&#xff0c;大概要迁移17小时。 使用hive自带的修复分区命令&#xff08;一般修复分区比迁移时间长一点&#xff09;&#xff0c;可能要花24小时。于是打算用前面黄大佬的牛B方案。 Hive增…

云计算是如何帮助企业实现高可用性的

想象一下&#xff0c;你正在享受一个悠闲的周末&#xff0c;突然接到同事的电话&#xff1a;公司的核心系统宕机了&#xff01;这个场景对很多IT从业者来说并不陌生。但在云计算时代&#xff0c;这样的噩梦正在逐渐远去。 一位前辈告诉我&#xff1a;"在技术世界里&#…

xtu oj 1614 数字(加强版)

输出格式# 每行输出一个样例的结果&#xff0c;为一个整数。 样例输入# 3 1 10 101 样例输出# 1 2 3 解题思路&#xff1a;这个题不要想复杂了&#xff0c;很容易超时。 首先需要注意的点&#xff0c;n<10的10000次方&#xff0c;用int或者long long都会爆&#xff0c;所…

欧拉公式和傅里叶变换

注&#xff1a;英文引文机翻&#xff0c;未校。 中文引文未整理去重&#xff0c;如有异常&#xff0c;请看原文。 Euler’s Formula and Fourier Transform Posted byczxttkl October 7, 2018 Euler’s formula states that e i x cos ⁡ x i sin ⁡ x e^{ix} \cos{x} i …