使用vue-amap实现地图经纬度显示、具体地址显示、卫星图、路网路况、在鼠标按下的地方添加标注点和添加多个标注点

2023-11-15


写在开头

我的上篇博客已经写了如何在vue的工程中嵌入vue-amap组件,从而在网页中添加个地图功能。想要了解这部分的可以去看一下,链接如下:在VUE中导入高德地图组件模块(vue-amap)

一、本文目的

本文是上一篇博客在VUE中导入高德地图组件模块(vue-amap)
的延续,本篇博客将实现地图经纬度显示、具体地址显示、卫星图、路网路况、在鼠标按下的地方添加标注点和添加多个标注点这几个功能。

二、版本信息

{
  "name": "vueamap",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build"
  },
  "dependencies": {
    "core-js": "^3.6.5",
    "sass": "^1.27.0",
    "sass-loader": "^10.0.4",
    "vue": "^2.6.11",
    "vue-amap": "^0.5.10",
    "vue-router": "^3.2.0",
    "vuex": "^3.4.0"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-router": "~4.5.0",
    "@vue/cli-plugin-vuex": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "vue-template-compiler": "^2.6.11"
  }
}

三、在App.vue中调用其他.vue文件

上一篇博客写的关于地图的代码是放在App.vue中的,这种方法对后续的模块化开发并不适用,故本小节将创建一个map.vue文件,并在App.vue中调用此文件,从而实现模块化开发。
添加组件可以参考下面的链接:https://www.jb51.net/article/156127.htm

1、创建map.vue文件存放地图程序

2、给子组件map.vue命名一个全局id

export default {
  name: "mmap"
}

3、返回App.vue组件。先引入组件,之后再渲染界面。

<script>
    import mmap from "./components/map"
    export default {
        name:'App',
        components: {
            mmap
        }
    }
</script>

4、此时就可以在App.vue文件中调用map.vue文件了。

<mmap></mmap>

5、最终的代码
/components/map.vue**

<template>
    <div class="amap-wrapper">
      <el-amap
        class="amap-box"
        vid="amap-vue"
        :zoom="zoom"
        :center="center"
      ></el-amap>
    </div>
</template>


  <script>

export default {
  name: "mmap",
  data() {
    return {
      zoom: 11,
      center: [112.5862, 37.8268],
    };
  },
};
</script>

  <style>
.amap-wrapper {
  width: 100%;
  height: 800px;
  float: right;
}
</style>


App.vue

<template>
  <div id="app">
    <div id="nav">
      <router-link to="/">Home</router-link> |
      <router-link to="/about">About</router-link>
    </div>
    <router-view/>

    <mmap></mmap>
  </div>
</template>


<script>
    import mmap from "./components/map"
    export default {
        name:'App',
        components: {
            mmap
        }
    }
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

#nav {
  padding: 30px;
}

#nav a {
  font-weight: bold;
  color: #2c3e50;
}

#nav a.router-link-exact-active {
  color: #42b983;
}
</style>

四、点击地图显示经纬度和具体地址

参考链接:https://elemefe.github.io/vue-amap/#/zh-cn/examples/base/amap

1、添加Geocoder以使用坐标转换服务

main.js

window.VueAMap.initAMapApiLoader({
  key: 'YOUR_CODE',
  plugin: [... 'Geocoder']
});

2、修改map.vue中的代码以增加该功能

本博客代码在第六小节

3、踩过的坑

​ 代码中有一段控制台输出result ----- console.log(position_xy); 按F12之后看控制台的输出参数,如果显示的是INVALID_USER_KEY则检查main.js中的KEY是否是正确的,因为该提示是告诉你开发者发起请求时,传入的key不正确或者过期

五、添加卫星图和路网路况

参考链接:https://elemefe.github.io/vue-amap/#/zh-cn/base/amap

1、在map.vue的中添加组件amapManager和plugin。其中plugin是为了导入卫星图和路网,amapManager为地图管理对象
2、直接放代码
本博客代码在第六小节

六、在鼠标按下的地方添加标注点

参考链接https://elemefe.github.io/vue-amap/#/zh-cn/coverings/marker
设计目标:显示地图,在地图中按一下就可以在鼠标点击处添加标志点,在鼠标点击另外的地方时原先的标注点消失,即一直保持地图上只有一个标注点。

1、在第五节点击地图显示经纬度和具体地址已经获取了鼠标按下时该点的经纬度和具体地址,只是没有显示该点。

2、如果需要显示点需要将点的数据写入到markers里面,添加的的格式如下:

          let marker = {
            position: [lng, lat],
          };

3、将该点使用javascript的push方法存入到markers中,代码如下:

self.markers.push(marker);

4、因为每次点击都需要将上一个的标注点删除,故在添加标注点之前需要判断makers数组的长度是否为0,不为0则减一,即删除前一个标注点。

          //*****************在鼠标点击处添加标注点*******************//
          if (self.markers.length);
          self.markers.splice(self.markers.length - 1, 1);

5、放代码:
本博客代码在第六小节

七、在地图上显示多个标注点

设计目标:创建多个点坐标,并将这些点显示在地图上*

1、使用规定格式创建多个点坐标对象,代码如下:

      data_position : [
        // 只能使用position
        {position: [121.59996, 31.197646]},
        {position: [121.69996, 31.197646]},
        {position: [121.79996, 31.197646]},
        {position: [121.89996, 31.197646]},
        {position: [121.99996, 31.197646]},
      ],

2、将数据全部存入到markers内,使用push只能将最后一个数据放入到markers中,故添加for循环将数据全部推入到markers中,代码如下:

      for (let x of this.data_position)
      {
        this.markers.push(x);
      }
      console.log(this.markers);

3、添加按钮优化效果,并添加移除点按钮,先判断markers是否为空,不为空则每次按一个移除一个点,代码如下:

      if (!this.markers.length) return;
      this.markers.splice(this.markers.length - 1, 1);

4、全部代码如下:

map.vue

<template>
  <div class="amap-page-container">
    <el-amap
      vid="amapDemo"
      :center="center"
      :zoom="zoom"
      :events="events"
      :amap-manager="amapManager"
      :plugin="plugin"
      class="amap-demo"
    >
      <!-- 遍历显示 -->
      <el-amap-marker
        v-for="marker in markers"
        :position="marker.position"
        :events="marker.events"
      ></el-amap-marker>
    </el-amap>

    <div class="toolbar">
      position: [{{ lng }}, {{ lat }}] address: {{ address }}
      <button type="button" name="button" v-on:click="addMarker">
        add markers
      </button>
      <button type="button" name="button" v-on:click="removeMarker">
        remove markers
      </button>
    </div>
  </div>
</template>

  <style>
.amap-page-container {
  width: 100%;
  height: 500px;
}
</style>

  <script>
// NPM 方式
import { AMapManager } from "vue-amap";
import VueAMap from "vue-amap";
//import AMap from 'AMap'

let amapManager = new VueAMap.AMapManager();

export default {
  name: "mmap",
  data: function () {
    let self = this;

    return {
      //*******************地图和组件初始化设置**********************//
      amapManager,
      zoom: 12,
      center: [121.59996, 31.197646],
      data_position : [
        // 只能使用position
        {position: [121.59996, 31.197646]},
        {position: [121.69996, 31.197646]},
        {position: [121.79996, 31.197646]},
        {position: [121.89996, 31.197646]},
        {position: [121.99996, 31.197646]},
      ],

      address: "",
      markers: [],
      events: {
        init(o) {
          o.getCity((result) => {
            //result 为地图初始化时所在位置的行政区域信息
            console.log(result);
          });
        },

        //*******************鼠标点击产生确定地址**********************//
        click(e) {
          let { lng, lat } = e.lnglat;
          self.lng = lng;
          self.lat = lat;
          //这里是通过高德地图 SDK 完成的
          var geocoder = new AMap.Geocoder({
            radius: 1000,
            extensions: "all",
          });
          var position_xy = [lng, lat];
          console.log(position_xy);

          //*****************在鼠标点击处添加标注点*******************//
          if (self.markers.length);
          self.markers.splice(self.markers.length - 1, 1);
          let marker = {
            position: [lng, lat],
          };
          self.markers.push(marker);

          geocoder.getAddress(position_xy, function (status, result) {
            //console.log(result)
            if (status === "complete" && result.info === "OK") {
              if (result && result.regeocode) {
                self.address = result.regeocode.formattedAddress;
                console.log(self.address);
                self.$nextTick();
              }
            }
          });
        },

        // //鼠标在点标记上按下时触发事件
        // mousedown() {
        //   var a = "hahaha";
        //   console.log(a);
        // },
      },

      lng: 0,
      lat: 0,
      //*******************卫星+路网+路况**********************//
      plugin: [
        "ToolBar",
        {
          pName: "MapType",
          defaultType: 0,
          events: {
            init(o) {
              //console.log(o);
            },
          },
        },
      ],
    };
  },

  //*******************在地图上添加点**********************//
  methods: {
    addMarker() {
      // console.log(this.data_position);
      for (let x of this.data_position)
      {
        this.markers.push(x);
      }
      console.log(this.markers);
    },
    removeMarker() {
      if (!this.markers.length) return;
      this.markers.splice(this.markers.length - 1, 1);
    },
  },
};
</script>

写在最后

最近有了一个做网站的项目,我负责项目的地图部分,以上是我在实现功能的过程中学习实现的内容,拿出来和大家分享分享,正所谓前人栽树后人乘凉,我也是在网上查阅了很多前辈的资料,结合自己的实际情况做出来的,希望各位在看了之后可以有所启发有所收获,那也就不枉我花这些时间写这篇博客了。
转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用vue-amap实现地图经纬度显示、具体地址显示、卫星图、路网路况、在鼠标按下的地方添加标注点和添加多个标注点 的相关文章

随机推荐

  • OpenGL中光源的三种移动区别

    1 光源不动 需要在设置完视图模型变换之后 然后再设置光源的位置并且开启 伪代码如下 glmatrixmode gl projection glloadidentity xxxxxxxxxx glmatrixmode gl modelvie
  • Vue 移动端、PC 端适配

    Vue 移动端 PC 端适配可以使用 lib flexible amfe flexible postcss pxtorem postcss px2rem 和 postcss px to viewport 这几个插件 lib flexible
  • BLE蓝牙协议 — BLE连接建立过程梳理(一)

    文章出处 枫之星雨 转载文章 如有不妥 通知后我会立即删除 连接建立 应付比广播更为复杂的数据传输 或者要在设备之间实现可靠的数据交付 这些都要依赖于连接 连接使用数据信道在两个设备之间可靠地发送信息 它采取了自适应跳频增强鲁棒性 同时使用
  • Idea:applicationcontext in module file is included in 5 contexts

    今天使用IDEA做项目的时候出现了这个东西 经过查询资料 应该是编译器自动导入配置文件的时候发生了某些错误 提示修正 解决方法 依次打开 Project Settings gt Modules gt Spring 按减号删除右侧所有文件 然
  • 国产ChatGpt、AI模型盘点

    个人中心 DownLoad 一 百度 文心一言 百度的文心一言是一款基于深度学习技术的自然语言生成模型 能够生成各种类型的文本 包括新闻 小说 诗歌等 它采用了Transformer模型和GPT 2模型 能够生成高质量的文本 并且速度非常快
  • 2022-1-12 java运算符的学习记录

    2022 1 12 java运算符的学习记录 算数运算符 在java中有i 和 i俩种操作 前一种是先使用变量再自增 后一种是先自增再使用变量 因为java是强运算符号 所以不同的类型的变量加减 最终会趋向于高等级的类型的运算类型 是取整符
  • vggNet网络学习(网络架构及代码搭建)

    原论文 翻译链接 VERY DEEP CONVOLUTIONAL NETWORKSFOR LARGE SCALE IMAGE RECOGNITION VGGnet论文翻译 附原文 机器学习我不学习的博客 CSDN博客 网络架构 vggnet
  • 巨人互动

    游戏出海是指将原本面向国内市场的游戏产品进行调整和优化 以适应海外市场的需求 并进行推广和销售 下面小编讲讲关于游戏出海对于游戏效果的影响的一些讨论点 1 市场扩大 通过游戏出海 可以将游戏产品的目标受众从国内扩展到全球范围内 从而获得更多
  • 前后端node设置art-template,以及express后端搭建

    前后端node设置art template 以及express后端搭建 首先全局安装express generator yarn add express generator g express e npm i yarn add cross
  • 第十二章 Spring Cloud Config 统一配置中心详解

    目录 一 配置问题分析及解决方案 1 问题分析 2 解决方案 二 Spring Cloud Config 介绍 1 Spring Cloud Config特性 2 Spring Cloud Config作用 3 Spring Cloud C
  • 希尔排序(ShellSort)

    最后分析的基于比较的排序 之所以放在前面几个排序算法之后主要是因为虽然希尔排序很容易编写却很难分析 尤其是它的时间复杂度 希尔排序思想的提出是有原因的 在那个排序还基本都是2次型 插入 选择 冒泡 的年代 当人们经常使用 插入排序时发现有时
  • Kafka实战——简单易懂的生产者消费者demo

    单线程版本适合本地调试 多线程版本适合做压测 1 引入maven依赖
  • 泊松分布的矩母函数与特征函数

    矩母函数与特征函数 矩 母 函 数 与 特 征 函 数
  • 【企业了解】人人都是产品经理、鸟哥笔记、CSDN、稀土掘金(2020年11月稀土掘金被字节跳动,金融与科技)

    企业了解 人人都是产品经理 鸟哥笔记 CSDN 稀土掘金 前言 今天早上看 今日热榜官网 的时候 被一篇文章吸引 中国成功学迭代史 内容挺有意思的 然后发现这篇文章来自一个网站 人人都是产品经理 和我上次写 企业分析 鸟哥笔记 一样 我因为
  • Hive三种不同的数据导出的方式

    Hive三种不同的数据导出的方式 1 导出到本地文件系统 insert overwrite local directory home anjianbing soft export data app order city d row form
  • 2021-09-22

    linux防火墙查看状态 操作防火墙的命令 查看防火墙状态 systemctl status firewalld 让防火墙可用 systemctl enable firewalld 让防火墙不可用 systemctl disable fir
  • 信号——产生、处理、捕捉、接收、阻塞

    一个信号是一条小消息 它通知系统进程中发生了一个某种类型的事件 提供了一种处理异步事件的方法 每一种信号都有一个名字 在头文件
  • 用Matlab作函数的图像

    函数简介 1 作图函数是plot 其调用格式如下 plot y plot x y plot x y LineSpec plot x1 y1 s1 x2 y2 s2 x3 y3 s3 说明 1 plot y 绘出以向量y为纵坐标 y的个元素的
  • IPV6基本报头

    version 版本号 值为6 与ipv4作用相同 4bit Traffic class 流分类 相当于ipv4的TOS字段 用于qos 表示报文的类或者优先级 8bit Flow label 流标签 用于区分实时流量 标签 源地址可以确定
  • 使用vue-amap实现地图经纬度显示、具体地址显示、卫星图、路网路况、在鼠标按下的地方添加标注点和添加多个标注点

    文章目录 写在开头 一 本文目的 二 版本信息 三 在App vue中调用其他 vue文件 四 点击地图显示经纬度和具体地址 五 添加卫星图和路网路况 六 在鼠标按下的地方添加标注点 七 在地图上显示多个标注点 写在最后 写在开头 我的上篇