【腾讯地图】录入经纬度功能 - 支持地图选点

目录

  • 效果展示
  • 代码
    • 引入地图服务地址
    • 弹框中输入框 - 支持手动输入经纬度/地图选点按钮
    • 地图选点弹框组件

当前文章 - 地图功能与 https://blog.csdn.net/m0_53562074/article/details/143677335 功能类似

效果展示

在这里插入图片描述

代码

引入地图服务地址

public/index.html

<!-- 互联网地图 -->
<script src="https://map.qq.com/api/gljs?v=2.exp&key=自己申请的key"></script>

<!-- 如果有用到编辑器 new TMap.tools.GeometryEditor() ,地图服务地址上查询参数要加 libraries=tools -->
<!-- https://map.qq.com/api/gljs?libraries=tools&v=2.exp&key=自己申请的key -->

弹框中输入框 - 支持手动输入经纬度/地图选点按钮

已删除无关代码,只展示地图选点相关代码

<template>
  <el-dialog
    v-if="dialogVisible"
    title="弹框展示选点"
    :visible.sync="dialogVisible"
    :show-close="true"
    width="700px"
    :close-on-click-modal="false"
    :close-on-press-escape="false"
    :before-close="handleClose"
    append-to-body
  >
    <!-- ... -->
    <div class="position">
      <el-input v-model="formData.position" placeholder="请输入勤务地点" size="mini" />
      <i class="iconfont ico-dituxuanze" @click="setPosition" />
    </div>

    <SetPointMap ref="SetPointMapRef" @updatePoint="updatePointHandler" />
  </el-dialog>
</template>

<script>
// ...
import SetPointMap from './SetPointMap'

export default {
  name: 'ResultEntry',
  components: { SetPointMap },

  data() {
    return {
      // /...
      formData: {
        position: ''
      },
      dialogVisible: false
    }
  },

  methods: {
    // ...
    showDetail() {
      this.dialogVisible = true
    },
    setPosition() {
      const { position } = this.formData

      const arr = position.split(/,|,/)

      const pointer = {
        jd: arr[0],
        wd: arr[1]
      }
      this.$refs.SetPointMapRef.open(pointer)
    },
    updatePointHandler({ jd, wd }) {
      this.formData.position = `${jd},${wd}`
    },
    handleClose() {
      // ...
      // 关闭弹窗
      this.dialogVisible = false
    }
  }
}
</script>
<style lang="scss" scoped>
// ...

.position {
  display: flex;
  .el-input {
    flex: 1;
    margin-right: 10px;
  }
  .iconfont {
    cursor: pointer;
  }
}
</style>

地图选点弹框组件

SetPointMap.vue

<!-- 地图选点 -->
<template>
  <el-drawer
    v-if="drawerVisible"
    title="地图标注"
    size="65%"
    append-to-body
    :before-close="handleClose"
    :visible.sync="drawerVisible"
  >
    <div :id="idName" class="TMap" />
  </el-drawer>
</template>

<script>
import { mapGetters } from 'vuex'

export default {
  name: 'SetPointMap',
  data() {
    return {
      drawerVisible: false,

      idName: 'setPointMap',

      map: null,
      multiMarker: null, // 点位图标

      point: {},
      clickPoint: {}
    }
  },

  computed: {
    ...mapGetters(['sysConfigData'])
  },

  watch: {
    clickPoint: {
      handler(val) {
        if (val.jd) {
          this.$confirm(
            `确定标注以下经纬度吗?<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;经度 ${val.jd}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;纬度 ${val.wd}`,
            '提示',
            {
              confirmButtonText: '确定',
              cancelButtonText: '取消',
              type: 'warning',
              dangerouslyUseHTMLString: true
            }
          )
            .then((_) => {
              this.drawerVisible = false
              this.$emit('updatePoint', val)
            })
            .catch((_) => {
              this.$message.info('取消经纬度标注')
              this.clickPoint = {}
            })
        }
      }
    }
  },

  mounted() {
    this.initMap()
  },
  methods: {
    open(pointer) {
      this.drawerVisible = true
      this.point = pointer // 保存初始经纬度
    },
    initMap() {
      var location = (this.sysConfigData.map_location || '121.427648,28.661939').split(',')

      this.map = new TMap.Map(this.idName, {
        zoom: this.sysConfigData.map_level || 14,
        center: new TMap.LatLng(Number(location[1]), Number(location[0]))
      })

      this.map.removeControl(TMap.constants.DEFAULT_CONTROL_ID.ROTATION) // 移除腾讯地图旋转控件
      this.map.removeControl(TMap.constants.DEFAULT_CONTROL_ID.ZOOM) // 移除腾讯地图缩放控件

      if (this.point.jd && this.point.wd) {
        // 将初始经纬度在地图上进行标点
        this.setPoint({ ...this.point }, true)
      }

      this.map.on('click', (e) => {
        // 点击地图获取经纬度
        this.removePoint() // 移除已有标点

        this.clickPoint = {
          jd: e.latLng.lat,
          wd: e.latLng.lng
        }
        // 点击位置进行标点
        this.setPoint({ ...this.clickPoint })
      })
    },

    setPoint({ jd, wd }, isSetCenter = false) {
      isSetCenter && this.map.setCenter(new TMap.LatLng(Number(jd), Number(wd)))

      this.MultiMarker = new TMap.MultiMarker({
        id: 'marker-layer',
        map: this.map,
        styles: {
          marker: new TMap.MarkerStyle({
            width: 25,
            height: 35,
            anchor: { x: 16, y: 32 }
          })
        },
        geometries: [
          {
            id: 'demo',
            styleId: 'marker',
            position: new TMap.LatLng(jd * 1, wd * 1),
            properties: {
              title: 'marker'
            }
          }
        ]
      })
    },

    removePoint() {
      this.MultiMarker?.setMap(null)
    },

    handleClose(done) {
      this.$confirm('还有未保存的工作,确定关闭吗?')
        .then((_) => {
          done()
        })
        .catch((_) => {})
    }
  }
}
</script>

<style lang='scss' scoped>
.TMap {
  width: 100%;
  height: 100%;
}

::v-deep .el-drawer {
  .el-drawer__body {
    padding: 0;
  }
}
</style>

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

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

相关文章

机器学习 - 大数定律、可能近似正确学习理论

一、大数定律&#xff1a; 大数定律是概率论中的一个基本定理&#xff0c;其核心思想是&#xff1a;当独立重复的随机试验次数足够大时&#xff0c;样本的平均值会趋近于该随机变量的期望值。下面从直观和数学两个角度来说明这一概念&#xff1a; 1. 直观理解 重复试验的稳定…

算法很美笔记(Java)——树(知识点)

性质 树 上面的性质因为两个结点由一条边连成 结点数目越多&#xff0c;算法复杂度越高 二叉树 结构 层次遍历&#xff08;bfs&#xff09; 利用队列&#xff0c;弹一个&#xff0c;加N个&#xff08;队列里弹出一个元素&#xff0c;就把这个元素的所有孩子加进去&#xff…

Mediamtx+Python读取webrtc流

一、功能思路&#xff1a; 1、我采用ffmpeg -re -stream_loop -1 -i xcc.mp4 -c:v libx264 -profile:v baseline -x264opts "bframes0:repeat_headers1" -b:v 1500k -preset fast -f flv rtmp://127.0.0.1:1835/stream/111推流到mediamtx的rtmp上 2、通过mediamtx自…

数据库第三次作业

第一题&#xff1a; 学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;S…

「软件设计模式」单例模式

深入解析单例模式&#xff1a;从思想到C实战实现 一、设计模式与单例模式思想 1.1 设计模式的价值 设计模式是软件工程领域的经验结晶&#xff0c;如同建筑领域的经典蓝图。它们提供了经过验证的解决方案模板&#xff0c;能有效解决以下问题&#xff1a; 提高代码复用性提升…

python后端调用Deep Seek API

python后端调用Deep Seek API 需要依次下载 ●Ollama ●Deepseek R1 LLM模型 ●嵌入模型nomic-embed-text / bge-m3 ●AnythingLLM 参考教程&#xff1a; Deepseek R1打造本地化RAG知识库:安装部署使用详细教程 手把手教你&#xff1a;deepseek R1基于 AnythingLLM API 调用本地…

Linux自旋锁:探秘内核同步利器

在 Linux 操作系统那复杂而精妙的内核世界里&#xff0c;自旋锁宛如一颗独特而关键的 “螺丝钉”&#xff0c;虽看似微小却有着不可忽视的力量。它紧密地与多任务处理、并发控制以及资源共享等核心机制相互交织&#xff0c;深刻地影响着系统的性能、稳定性与可靠性。 当我们开…

Moretl 增量文件采集工具

永久免费: <下载> <使用说明> 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架构 技术架构: Asp…

【Uniapp】关于实现下拉刷新的三种方式

在小程序、h5等地方中&#xff0c;常常会用到下拉刷新这个功能&#xff0c;今天来讲解实现这个功能的三种方式&#xff1a;全局下拉刷新&#xff0c;组件局部下拉刷新&#xff0c;嵌套组件下拉刷新。 全局下拉刷新 这个方式简单&#xff0c;性能佳&#xff0c;最推荐&#xf…

九.Spring Boot使用 ShardingSphere + MyBatis + Druid 进行分库分表

文章目录 前言一、引入依赖二、创建一个light-db_1备用数据库三、配置文件 application-dev.yml四、创建shardingsphere-config.yml完整项目结构 五、测试总结 前言 在现代化微服务架构中&#xff0c;随着数据量的不断增长&#xff0c;单一数据库已难以满足高可用性、扩展性和…

游戏引擎学习第101天

回顾当前情况 昨天的进度基本上完成了所有内容&#xff0c;但我们还没有进行调试。虽然我们在运行时做的事情大致上是对的&#xff0c;但还是存在一些可能或者确定的bug。正如昨天最后提到的&#xff0c;既然现在时间晚了&#xff0c;就不太适合开始调试&#xff0c;所以今天我…

鸿蒙HarmonyOS NEXT开发:横竖屏切换开发实践

文章目录 一、概述二、窗口旋转说明1、配置module.json5的orientation字段2、调用窗口的setPreferredOrientation方法 四、性能优化1、使用自定义组件冻结2、对图片使用autoResize3、排查一些耗时操作 四、常见场景示例1、视频类应用横竖屏开发2、游戏类应用横屏开发 五、其他常…

【新品解读】AI 应用场景全覆盖!解码超高端 VU+ FPGA 开发平台 AXVU13F

「AXVU13F」Virtex UltraScale XCVU13P Jetson Orin NX 继发布 AMD Virtex UltraScale FPGA PCIE3.0 开发平台 AXVU13P 后&#xff0c;ALINX 进一步研究尖端应用市场&#xff0c;面向 AI 场景进行优化设计&#xff0c;推出 AXVU13F。 AXVU13F 和 AXVU13P 采用相同的 AMD Vir…

(篇六)基于PyDracula搭建一个深度学习的软件之新版本ultralytics-8.3.28调试

ultralytics-8.3.28版本debug记录 1传入文件 代码太多不粘贴在这里了&#xff0c;完整代码写在了篇三 def open_src_file(self):config_file config/fold.jsonconfig json.load(open(config_file, r, encodingutf-8))open_fold config[open_fold]if not os.path.exists(op…

计算机毕业设计PySpark+hive招聘推荐系统 职位用户画像推荐系统 招聘数据分析 招聘爬虫 数据仓库 Django Vue.js Hadoop

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

docker配置镜像加速

1.配置方法见阿里云 图1 图2 图3 CentOS脚本 阿里云、腾讯云的镜像仓库从2022年就没有更新了&#xff0c;所以添加以下这么多仓库 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://g4f7bois.mirro…

互联网大厂中面试的高频计算机网络问题及详解

前言 哈喽各位小伙伴们,本期小梁给大家带来了互联网大厂中计算机网络部分的高频面试题,本文会以通俗易懂的语言以及图解形式描述,希望能给大家的面试带来一点帮助,祝大家offer拿到手软!!! 话不多说,我们立刻进入本期正题! 一、计算机网络基础部分 1 …

位图,晶圆MAP 边缘算法

例如这样的一张图: 如果想要求外边缘点&#xff0c;即红色区域,首先遍历所有点位&#xff0c;求出每行每列X轴和Y轴的最大值MAX和最小值MIN。然后再次遍历每个点&#xff0c;判断该点的X值&#xff0c;Y值是否是最大值或者最小值&#xff0c;如果是&#xff0c;那么它就是外边…

微信小程序医院挂号系统

第3章 系统设计 3.1系统体系结构 系统的体系结构非常重要&#xff0c;往往决定了系统的质量和生命周期。针对不同的系统可以采用不同的系统体系结构。本系统为微信小程序医院挂号系统&#xff0c;属于开放式的平台&#xff0c;所以在管理端体系结构中采用B/s。B/s结构抛弃了固…

建筑兔零基础自学python记录18|实战人脸识别项目——视频检测07

本次要学视频检测&#xff0c;我们先回顾一下图片的人脸检测建筑兔零基础自学python记录16|实战人脸识别项目——人脸检测05-CSDN博客 我们先把上文中代码复制出来&#xff0c;保留红框的部分。 ​ 然后我们来看一下源代码&#xff1a; import cv2 as cvdef face_detect_demo(…