vue3中使用高德地图

vue3中使用高德地图

地图文档地址:https://vue-amap.guyixi.cn/
仓库地址:https://gitee.com/guyangyang/vue-amap

插件介绍

@vuemap/vue-amap](https://vue-amap.guyixi.cn/)插件是在vue-amap基础上重新处理封装,vue版本升级为3.0,事件绑定方式调整为v-on,支持typescript,支持IDE提示(webstorm和vscode),支持tree-shaking,对高德可视化组件loca进行封装,提供默认的图层样式处理。

组件优势

  • 支持vue2、vue3,0.0.x版本支持vue2,1.x.x和2.x.x版本支持vue3
  • 所有事件使用v-on方式绑定,更接近于vue开发习惯
  • vue2与vue3版本参数、事件使用方法一致,升级成本基本为0
  • 组件基本覆盖了高德JSAPI2.0和可视化loca2.0的所有功能
  • vue3版本支持常用IDE提示
  • vue3版本支持tree-shaking

安装方法

npm安装

npm install @vuemap/vue-amap --save


import App from './App.vue'
import VueAMap, {initAMapApiLoader} from '@vuemap/vue-amap';
import '@vuemap/vue-amap/dist/style.css'
initAMapApiLoader({
    key: 'YOUR_KEY'
})

createApp(App)
    .use(VueAMap)
    .mount('#app')

CDN安装

<script src="https://unpkg.com/@vuemap/vue-amap/dist/index.js"></script>
<script src="https://unpkg.com/@vuemap/vue-amap/dist/style.css"></script>

window.VueAmap.initAMapApiLoader({
  key: 'YOUR_KEY',
});

自动导入

首先你需要安装unplugin-vue-componentsunplugin-auto-import@vuemap/unplugin-resolver这三款插件

npm install -D unplugin-vue-components unplugin-auto-import @vuemap/unplugin-resolver

然后在main.ts中导入css和进行初始化key

import App from './App.vue'
import {initAMapApiLoader} from '@vuemap/vue-amap';
import '@vuemap/vue-amap/dist/style.css'
initAMapApiLoader({
    key: 'YOUR_KEY'
})

createApp(App)
    .mount('#app')

再修改配置文件,把下列代码插入到你的 Vite 或 Webpack 的配置文件中

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import {VueAmapResolver} from '@vuemap/unplugin-resolver'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      resolvers: [VueAmapResolver()],
    }),
    Components({
      resolvers: [VueAmapResolver()],
    }),
  ]
})

使用示例

加载地图

<template>
  <div class="map-page-container">
    <el-amap
      :center="center"
      :zoom="zoom"
      @init="init"
    />
  </div>
  <div class="toolbar">
    <button @click="add()">
      添加标号
    </button>
  </div>
</template>

<script lang="ts">
import {defineComponent} from "vue";

export default defineComponent({
  data() {
    return {
      zoom: 12,
      center: [121.59996, 31.197646],
      map: null
    };
  },

  methods: {
    init(map) {
      const marker = new AMap.Marker({
        position: [121.59996, 31.197646]
      });
      map.add(marker);
      this.map = map;
      console.log('map init: ', map)
    },
    add() {
      const marker = new AMap.Marker({
        position: [121.59996, 31.177646]
      });
      this.map.add(marker);
    }
  }
})
</script>

<style>
</style>

添加交通图层

<template>
  <div class="map-page-container">
    <el-amap :center="center" :zoom="zoom">
      <el-amap-layer-traffic :visible="visible"></el-amap-layer-traffic>
    </el-amap>
  </div>
  <div class="toolbar">
    <button @click="switchVisible()">{{visible? '隐藏' : '显示'}}</button>
  </div>
</template>

<style>
</style>

<script lang="ts">
import {defineComponent} from "vue";

export default defineComponent({
  data() {
    return {
      zoom: 12,
      center: [121.59996, 31.197646],
      visible: true
    };
  },

  methods: {
    switchVisible() {
      this.visible = !this.visible;
    },
  }
});
</script>

添加标号

<template>
  <div class="map-page-container">
    <el-amap
      :show-label="false"
      :center="center"
      :zoom="zoom"
      @click="clickMap"
      @init="initMap"
    >
      <el-amap-marker
        :position="componentMarker.position"
        :visible="componentMarker.visible"
        :draggable="componentMarker.draggable"
        @init="markerInit"
        @click="clickMarker"
      >
        <div style="padding: 5px 10px;white-space: nowrap;background: blue;color: #fff;">
          测试content
        </div>
      </el-amap-marker>
      <el-amap-marker
        :position="componentMarker2.position"
        :content="componentMarker2.content"
      />
      <el-amap-marker
        v-for="(marker, index) in markers"
        :key="index"
        :position="marker.position"
        @click="(e) => {clickArrayMarker(marker, e)}"
      />
    </el-amap>
  </div>
  <div class="control-container">
    <button @click="changePosition">
      更换位置
    </button>
    <button @click="toggleVisible">
      {{ componentMarker.visible ? '隐藏标记' : '显示标记' }}
    </button>
    <button @click="changeDraggable">
      {{ componentMarker.draggable ? '禁止标记移动' : '允许标记移动' }}
    </button>
  </div>
</template>

<script lang="ts">
import {defineComponent} from "vue";

export default defineComponent({
  name: "Map",
  data(){
    return {
      center: [121.5273285, 31.21515044],
      zoom: 16,
      markers: [
        {
          position: [121.5273285, 31.21515044],
          id: 1
        }
      ],
      componentMarker: {
        position: [121.5273285, 31.21315058],
        visible: true,
        draggable: false
      },
      componentMarker2: {
        position: [121.5283285, 31.21315058],
        content: 'hello world'
      },
    }
  },
  methods: {
    clickMap(e){
      console.log('click map: ', e);
    },
    initMap(map){
      console.log('init map: ', map);
    },
    changeCenter(){
      const lng = this.center[0]+0.01;
      const lat = this.center[1]+0.01;
      this.center = [lng, lat];
    },
    changePosition() {
      const position = this.componentMarker.position;
      this.componentMarker.position = [position[0] + 0.002, position[1] - 0.002];
    },
    changeDraggable() {
      this.componentMarker.draggable = !this.componentMarker.draggable;
    },
    toggleVisible() {
      this.componentMarker.visible = !this.componentMarker.visible;
    },
    markerInit(e){
      console.log('marker init: ', e);
    },
    clickMarker(){
      alert('点击了标号')
    },
    clickArrayMarker(marker){
      alert(`点击了标号,标号ID: ${marker.id}`)
    }
  }
})
</script>

<style scoped>
</style>

Loca的Icon图层

<template>
  <div class="map-page-container">
    <el-amap
      view-mode="3D"
      :pitch="pitch"
      :show-label="false"
      :center="center"
      :zoom="zoom"
      @click="clickMap"
      @init="initMap"
    >
      <el-amap-loca>
        <el-amap-loca-icon
          :visible="visible"
          :source-data="sourceData"
          :layer-style="layerStyle"
        />
      </el-amap-loca>
    </el-amap>
  </div>
  <div class="toolbar">
    <button @click="changeVisible">
      {{ visible ? '隐藏' : '显示' }}
    </button>
  </div>
</template>

<script lang="ts">
import {defineComponent} from "vue";


export default defineComponent({
  name: "Map",
  data() {
    const trafficIcons = {
      1: 'https://a.amap.com/Loca/static/loca-v2/demos/images/traffic-control.png',
      2: 'https://a.amap.com/Loca/static/loca-v2/demos/images/jam.png',
      3: 'https://a.amap.com/Loca/static/loca-v2/demos/images/construction.png',
      4: 'https://a.amap.com/Loca/static/loca-v2/demos/images/close.png',
      5: 'https://a.amap.com/Loca/static/loca-v2/demos/images/fog.png',
      0: 'https://a.amap.com/Loca/static/loca-v2/demos/images/accident.png',
    };
    return {
      center: [105.601, 35.32],
      zoom: 4.8,
      pitch: 55,
      visible: true,
      sourceData: {},
      layerStyle: {
        unit: 'px',
        icon: (index, feature) => {
          const data = feature.properties.rawData;
          const url = trafficIcons[data.type % Object.keys(trafficIcons).length];
          return url;
        },
        iconSize: [40,40],
        rotation: 0,
      }
    }
  },
  methods: {
    clickMap(e) {
      console.log('click map: ', e);
    },
    initMap(map) {
      console.log('init map: ', map);
      this.createData();
    },
    changeVisible() {
      this.visible = !this.visible;
    },
    createData(){
      fetch('/json/events.json').then(response => response.json()).then(events => {
        const _events = events[0].events;
        const list = _events.map(e => {
          const ll = e.lngLat.split(',');
          const arr = [parseFloat(ll[0]), parseFloat(ll[1])]
          return {
            "type": "Feature",
            "properties": {
              rawData: e
            },
            "geometry": {
              "type": "Point",
              "coordinates": arr
            }
          }
        })

        this.sourceData = Object.freeze({
          "type": "FeatureCollection",
          "features": list,
        });
      })
    },
  }
})
</script>

<style scoped>
</style>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3使用高德地图的逆地理编码,可以按照以下步骤进行: 1. 在项目引入高德地图的JS API,可以在index.html添加以下代码: ```html <script src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script> ``` 2. 在Vue3的组件,可以使用`mounted`钩子函数来初始化地图,并获取当前位置的经纬度: ```javascript mounted() { var map = new AMap.Map('map-container', { zoom: 13 }); var geolocation = new AMap.Geolocation({ enableHighAccuracy: true, // 是否使用高精度定位,默认为false timeout: 10000, // 超过10秒后停止定位,默认:无穷大 }); geolocation.getCurrentPosition(function(status, result) { if (status == 'complete') { var lng = result.position.lng; var lat = result.position.lat; // 在这里可以进行逆地理编码 } else { console.log('定位失败'); } }); } ``` 3. 获取到当前位置的经纬度后,可以使用`AMap.Geocoder`类进行逆地理编码,从而获取当前位置的地址信息: ```javascript var geocoder = new AMap.Geocoder({ city: "全国", // 城市,默认:“全国” radius: 1000 // 范围,默认:500 }); geocoder.getAddress([lng, lat], function(status, result) { if (status == 'complete' && result.regeocode) { var address = result.regeocode.formattedAddress; console.log(address); } else { console.log('逆地理编码失败'); } }); ``` 在上述代码,`[lng, lat]`表示当前位置的经纬度数组,`result.regeocode.formattedAddress`表示逆地理编码后获取到的地址信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值