天地图开发实战:Vue结合OpenLayers实现动态点位地图

在Web开发中,地图功能是一个常见的需求,尤其是在需要展示地理位置信息的应用程序中。OpenLayers(简称OL)是一个强大的JavaScript库,用于创建交互式地图。本文将介绍如何利用OpenLayers和天地图API,实现一个地图组件,该组件可以渲染点位图标,并允许用户通过点击地图来实时获取和更新点位的经纬度。

效果图

准备工作

在开始之前,确保你已经安装了Node.js和npm,并且已经创建了一个Vue项目。此外,需要安装OpenLayers库:

npm install ol

创建地图组件

1. 父组件集成

在父组件中,我们使用Element UI的<el-dialog>组件作为地图的容器,并动态绑定dialogFormVisible来控制对话框的显示与隐藏。

<!-- 父组件模板 -->
<el-dialog title="修改" :visible.sync="dialogFormVisible" width="1200px" append-to-body>
  <div style="height: 550px; overflow: auto">
    <el-form :model="form" label-position="right" label-width="130px">
      <el-form-item label="经纬度:">
        <div style="margin-bottom: 10px">
          {{ form.longitude }}{{ form.longitude ? ',' : '' }}{{ form.latitude }}
        </div>
        <!-- 条件性渲染地图组件 -->
        <div style="width: 100%; height: 600px" v-if="dialogFormVisible">
          <mapDiv :formData="form"></mapDiv>
        </div>
      </el-form-item>
    </el-form>
  </div>
  <div slot="footer" class="dialog-footer">
    <el-button type="primary" @click="save()">确 定</el-button>
    <el-button @click="dialogFormVisible = false">取 消</el-button>
  </div>
</el-dialog>

import mapDiv from './mapDiv.vue'

components: { mapDiv},

2. 地图组件实现

模板部分

地图组件的模板非常简单,只有一个用于承载地图的div

<!-- mapDiv.vue -->
<template>
  <div id="mapDiv" style="height: 100%; width: 100%"></div>
</template>
脚本部分

导入必要的OpenLayers库和样式,创建地图组件类。在initMap方法中,我们设置地图的视图、图层,并添加点位图标。

<script>
import 'ol/ol.css'
import { Map, View, Feature } from 'ol'
import { defaults as defaultControls } from 'ol/control'
import { Tile, Vector as VectorLayer } from 'ol/layer'
import { XYZ, Vector as VectorSource } from 'ol/source'
import { fromLonLat, toLonLat } from 'ol/proj'
import { Style, Icon } from 'ol/style'
import { Point } from 'ol/geom'
import logoSrc from './mark.png'

export default {
  name: 'MapWithPoint',
  // 定义组件属性,formData接收父组件的传值
  props: {
    formData: {
      type: Object,
      default: {},
    },
  },
  computed: {},
  data() {
    return {
      map: null, // 地图实例
      pointFeature: null, // 点Feature实例
      vectorLayer: null, // 矢量图层实例
      center: [109.50726084078906, 36.587110167350126], // 默认地图中心点坐标
    }
  },
  // 在组件销毁前执行的方法,用于清理资源
  beforeDestroy() {
      // 检查地图实例是否存在,并进行销毁
      // 重置组件状态,确保所有相关变量为null
  },
  // 组件挂载后执行的钩子函数,用于初始化地图
  mounted() {
    this.initMap()
  },
  methods: {
    // 初始化地图的方法
    initMap() {
      // 创建地图视图,设置中心点坐标和缩放级别
        const view = new View({
          center: fromLonLat(this.center), // 地图初始中心点的经纬度坐标
          zoom: 9, // 初始缩放级别
          maxZoom: 18,
          // minZoom: 9,
        })
      // 初始化地图实例,配置地图容器、控件、图层和视图
      // 创建点Feature并定义其图标样式
      // 创建矢量图层,将点Feature添加到其中
      // 将矢量图层添加到地图实例
      // 为地图添加点击事件监听
    },
    // 地图点击事件处理函数
    mouseClick(event) {
      // 处理地图点击事件,获取点击位置的投影坐标和经纬度坐标
      // 更新组件属性 formData 中的经纬度数据
        const latLonCoord = toLonLat(projectedCoord)
        console.log(latLonCoord, '点击的经纬度坐标')
      // 更新点Feature的坐标位置
      // 刷新矢量图层以显示新的点Feature
      // 平滑移动地图视图到点击的位置
    },
  },
}
</script>

这段脚本定义了一个Vue组件,该组件集成了OpenLayers地图,并添加了点击地图更新点位图标和经纬度信息的功能。组件接收一个formData对象作为属性,其中包含点位的经纬度信息。组件挂载后会初始化地图,并在地图上添加一个点位图标。当用户点击地图时,会更新点位图标的位置和formData中的经纬度信息,并且平滑地移动地图视图到点击的位置。

样式

为地图容器添加样式,确保地图能够充满整个容器。

<style>
#mapDiv {
  height: 100%;
  width: 100%;
}
</style>
获取完整代码

由于篇幅限制,以上展示的代码省略了大部分的实现逻辑和数据结构定义。如需获取完整的组件代码,请访问我的个人主页-资源库下载。

总结

通过上述步骤,我们完成了一个基于Vue和OpenLayers的天地图组件,该组件不仅能够展示点位图标,还能通过用户交互实时更新点位的经纬度。这为开发涉及地图交互功能的应用提供了一个实用的示例。在未来的开发工作中,我们可以基于此组件进一步扩展更多功能,例如增加地图标记、绘制路线、实现路径规划等。此外,还可以考虑将组件与更多的后端服务集成,实现数据的实时同步和动态交互。

随着Web技术的发展和GIS领域的不断进步,地图组件的应用场景将越来越广泛。希望本篇博客能够为读者提供有价值的参考和启发,帮助大家在地图应用开发的道路上更进一步。让我们期待在未来的项目中,能够创造出更多创新且实用的地图解决方案。

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

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

相关文章

Mybatis save、saveOrUpdate、update的区别

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 1. save方法 Mybatis的save方法用于插入一条新的记录。当数据库中不存在相同的记录时&#xff0c;会执行插入操作&#xff1b;如果已经存在相同的记录&#xff0c;则会抛出异常。 int result sqlSession.insert(&…

电脑桌面提醒做事的app 好用的桌面提醒app

在快节奏的现代生活中&#xff0c;我们每天都要通过电脑处理大量的工作事项。然而&#xff0c;繁忙的工作节奏有时会导致我们遗忘某些重要任务&#xff0c;从而带来不必要的损失。为了避免这种情况&#xff0c;选择一款好用的桌面提醒app显得尤为重要。 想象一下&#xff0c;你…

Java中Transactional在不同方法间的穿透性,rollbackFor参数含义

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 在Java开发中&#xff0c;经常会遇到需要在一个事务中执行多个操作的场景。为了确保这些操作的原子性&#xff0c;可以使用Spring框架提供的Transactional注解来实现事务管理。然而&#xff0c;在实际开发过程中&…

CVE-2012-2122-mysql未授权访问漏洞复现-vulhub

1.原理 参考&#xff1a;CVE-2012-2122 Mysql身份认证漏洞及利用-CSDN博客 简单来说&#xff0c;除了配置上的问题以外&#xff0c;是密码的验证出现了漏洞&#xff0c;导致尝试次数多了之后直接可以登入 使用&#xff1a;kalivulhub 2.复现 开一下镜像&#xff0c;用的是v…

代码随想录算法训练营第五十八天 | 392.判断子序列

392.判断子序列 题目链接&#xff1a;代码随想录 视频讲解&#xff1a;动态规划&#xff0c;用相似思路解决复杂问题 | LeetCode&#xff1a;392.判断子序列_哔哩哔哩_bilibili 解题思路 本题和求最长公共子序列是一样的&#xff0c;值就是s字符串的长度&#xff0c;如果一致…

拥抱开源,构建未来:王嘉树与 TDengine 的开源之旅

在当代的技术浪潮中&#xff0c;开源文化不仅催生了无数创新技术&#xff0c;也为广大技术爱好者提供了一个展示才华、相互学习的平台。我们今天采访到的这位北京邮电大学电子工程学院的研究生&#xff0c;就是在这样的背景下&#xff0c;通过开源活动不断探索、学习并实现自我…

C++中extern “C“的用法

目的 extern "C"是经常用到的东西&#xff0c;面试题目也经常出现&#xff0c;然则&#xff0c;实际用时&#xff0c;还是经常遗忘&#xff0c;因此&#xff0c;深入的了解一下&#xff0c;以增强记忆。 extern "C"指令非常有用&#xff0c;因为C和C的近亲…

python -- 异步、asyncio

文章目录 协程实现协成的方法greenlet实现协程yield 关键字asyncio async & await&#xff08;**重点**&#xff09; 协程的意义异步编程事件循环快速上手awaitTask对象asyncio.Future对象concurrent.futures.Future 对象 协程 协成不是操作系统提供的&#xff0c;是程序员…

LLM-不要错过,教你如何快速且精准生成提示词?(总结Singapore首届GPT-4提示工程获奖者Sheila Teo博客)

文章目录 前置理论精炼介绍1. CO-STAR框架CO-STAR框架简单介绍CO-STAR简单示例 2. 创建系统提示【优化LLM问答丰富度】何为系统提示&#xff1f;系统提示示例 3. 使用分隔符分段提示【优化问答准度】分割符作特殊字符及CO-STAR示例分割符作XML标记 仅数据的CO-STAR实操前置分析…

如何用西语问候呢,柯桥零基础西班牙语培训

正式问候 在正式场合&#xff0c;如工作会议、正式介绍或第一次见面时&#xff0c;通常使用更为尊敬和礼貌的问候语。以下是一些例子&#xff1a; 1. Buenos das&#xff08;早上好&#xff09;:从早上到中午使用。这是一个非常常见和礼貌的问候。 2. Buenas tardes(下午好):…

HTML静态网页成品作业(HTML+CSS)—— 节日母亲节介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

2024年3月电子学会青少年软件编程 中小学生Python编程等级考试二级真题解析(判断题)

2024年3月Python编程等级考试二级真题解析 判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 26、元组中的元素可以是不同的数据类型 答案&#xff1a;对 考点分析&#xff1a;考查元元组相关知识&#xff0c;元组里面的元素是可以出现不同的数据…

流程设计的基本步骤

背景 公司为什么要流程&#xff0c;已经有专门章节进行阐述&#xff1b; 什么是流程&#xff0c;已经有专门章节进行专门阐述&#xff1b; 那么接下来这个章节讨论&#xff0c;流程设计的基本步骤&#xff0c;那么谁来设计流程呢&#xff0c;让一个部门的员工来设计一份流程…

30字以内免费翻译维吾尔语,汉维翻译工具推荐,维吾尔文字母OCR识别神器《维汉翻译通》App!

维吾尔文OCR文字识别 《维汉翻译通》App内置的OCR技术&#xff0c;能够快速识别图片中的文字和字母&#xff0c;无论是路标、菜单还是书籍&#xff0c;都能迅速转换为用户所需的语言&#xff0c;让语言障碍不再是问题。针对维吾尔语更是进行了专门的优化&#xff0c;即便是手写…

vue3+electron搭建桌面软件

vue3electron开发桌面软件 最近有个小项目, 客户希望像打开 网易云音乐 那么简单的运行起来系统. 前端用 Vue 会比较快一些, 因此决定使用 electron 结合 Vue3 的方式来完成该项目. 然而, 在实施过程中发现没有完整的博客能够记录从创建到打包的流程, 摸索一番之后, 随即梳理…

Android 14 系统启动流程 之 启动init进程、启动Zygote进程

Android 14 系统启动流程 之 启动init进程、启动Zygote进程 废话不多说&#xff0c;先上图&#xff0c;不清楚的可以在评论区留言。

C#下WinForm多语种切换

这是应一个网友要求写的&#xff0c;希望对你有所帮助。本文将介绍如何在一个WinForm应用程序中实现多语种切换。通过一个简单的示例&#xff0c;你将了解到如何使用资源文件管理不同语言的文本&#xff0c;并通过用户界面实现语言切换。 创建WinForm项目 打开Visual Studio&a…

ACL原理和基础配置

ACL&#xff08;Access Control List&#xff0c;访问控制列表&#xff09;是一种用于控制网络设备或操作系统上资源访问权限的方法。ACL能够基于规则和条件来允许或拒绝对资源的访问。 标准ACL&#xff08;Standard ACL&#xff09;&#xff1a;基于源IP地址来进行流量过滤&a…

实现一个vue js小算法 选择不同的时间段 不交叉

以上图片选择了时间段 现在需要判断 当前选择的时间段 不能够是 有交叉的所以现在需要循环判断 //判断时间段是否重叠交叉 export function areIntervalsNonOverlapping(intervals:any) {// 辅助函数&#xff1a;将时间字符串转换为从当天午夜开始计算的分钟数function conver…

视频格式转换avi格式怎么弄?分享视频转换方法

视频格式转换avi格式怎么弄&#xff1f;AVI作为一种广泛支持的视频格式&#xff0c;能够在多种设备和播放器上顺畅播放&#xff0c;确保我们的视频内容能够无障碍地分享给朋友或上传至各大平台。其次&#xff0c;AVI格式通常具有较好的兼容性&#xff0c;能够避免格式转换过程中…