首页 > 其他分享 >vue 高德地图异步引用

vue 高德地图异步引用

时间:2024-01-11 14:45:51浏览次数:21  
标签:mapOption 异步 vue val map setStatus AMap true 高德

先建立一个文件,引入高德  gDMapLoader.js

const ak = '4e9f15de14b05fd8f19e1d8fbe91f0a3'

export default function load() {
  return new Promise(function(resolve, reject) {

    if (window.AMap) {
      resolve(window.AMap)
    } else {
      var script = document.createElement('script')
      script.type = 'text/javascript'
      script.async = true
      script.src = 'http://webapi.amap.com/maps?v=1.4.15&callback=initAMap&key=4e9f15de14b05fd8f19e1d8fbe91f0a3&plugin=AMap.Geolocation,AMap.Autocomplete,AMap.PlaceSearch,AMap.Geocoder,AMap.PolyEditor,AMap.MapType,AMap.LabelsLayer,AMap.LabelMarker'
      script.onerror = reject
      document.head.appendChild(script)
    }
    window.initAMap = () => {
      resolve(window.AMap)
    }

    let mapvglScript = document.createElement('script')
    mapvglScript.type = 'text/javascript'
    mapvglScript.src =
        'https://code.bdstatic.com/npm/[email protected]/dist/mapvgl.min.js'
    document.head.appendChild(mapvglScript)
  })
}

后面建立vue文件,使用高德

<template>
  <div class="w-h-full b-map">
    <div class="toolbar" v-if="!$store.state.release.pageMetadata">
      <Tooltip content="重置地图位置信息,恢复地图初始化时的中心点和缩放级别,当在设计器中调整地图所属布局块的尺寸之后,可以通过点击此按钮,实现地图的自动适配容器" :max-width="200" placement="right">
<!--        <Button @click="resetMap" type="primary">重置</Button>-->
      </Tooltip>
    </div>
    <div class="w-h-full map-container"></div>
  </div>
</template>

<script>
import PnDesigner from "@/utils/PnDesigner";
import gDMapLoader from "@/utils/gDMapLoader";

export default {
  name: "gDMap",
  props: {
    mapOption: {
      type: Object,
      default () {
        return PnDesigner.buildgDMapOptionConfigData()
      }
    }
  },
  data() {
    return {
      map: null
    }
  },
  mounted() {
    this.initMap()
  },
  methods: {
    initMap() {
      gDMapLoader().then(() => {

        let mapElement = this.$el.querySelector('.map-container');
        const elementID = this.$PnUtil.uuid();
        mapElement.id = elementID;
        this.map = new AMap.Map(elementID, {
          // restrictCenter: false,
          resizeEnable: true,
          rotateEnable: true,
          pitchEnable: true,
          pitch: 65,
          rotation: -15,
          viewMode: '3D',//开启3D视图,默认为关闭
          buildingAnimation: true,//楼块出现是否带动画
          enableHighAccuracy: true,//是否使用高精度定位,默认:true
          expandZoomRange: true,
          // center:[112.86589,27.88369],
          // zoom: 17,
          zooms:[2,20],
        });
        // 设置中心点
        this.setCenter(this.mapOption)

        // // 设置地图类型
        this.setMapType(this.mapOption.mapType)
        // // 设置主题
        this.setMapStyle(this.mapOption.stylesJson)

        //
        this.map.setStatus({dragEnable: true});
        this.map.setStatus({scrollWheel: true});
        this.map.setStatus({doubleClickZoom: true});
        this.map.setRotation(this.mapOption.heading)
        this.map.setPitch(this.mapOption.tilt)
        // this.map.setDisplayOptions({
        //   skyColors: this.mapOption.skyColors
        // })
        //

        this.mapOption.dragEnable ? this.map.setStatus({dragEnable: true}) : this.map.setStatus({dragEnable: false})
        this.mapOption.scrollWheel ? this.map.setStatus({scrollWheel: true}) : this.map.setStatus({scrollWheel: false})
        this.mapOption.doubleClickZoom ? this.map.setStatus({doubleClickZoom: true}) : this.map.setStatus({doubleClickZoom: false})

        this.$emit('on-load-map-success', this.map)
      })
    },
    // 设置中心点
    setCenter (mapOption) {
      if (mapOption.centerCity) {
        // this.map.setZoomAndCenter( mapOption.zoom,([mapOption.center[0], mapOption.center[1]]));
        this.map.setCenter(mapOption.centerCity);
        this.map.setZoom(mapOption.zoom)
      }else {
        // 同时传入缩放级别和中心点经纬度
        // map.setZoomAndCenter(14, [116.205467, 39.907761]);
        this.map.setZoomAndCenter( mapOption.zoom,([mapOption.center[0], mapOption.center[1]]));
        // this.map.setCenter(mapOption.center[0], mapOption.center[1])
        // this.map.setZoom(mapOption.zoom)
      }
    },

    setMapType (mapType) {
      switch (mapType) {
        case "BMAP_NORMAL_MAP":
          this.map.addControl(new AMap.MapType({
            defaultType:0, //0代表默认,1代表卫星
            showRoad:true//显示路况(右上角也可点击)
          }));
          break
        case "BMAP_SATELLITE_MAP":
          this.map.addControl(new AMap.MapType({
            defaultType:1, //0代表默认,1代表卫星
            showRoad:true//显示路况(右上角也可点击)
          }));
          break
        case "BMAP_HYBRID_MAP":
          this.map.addControl(new AMap.MapType({
            defaultType:0, //0代表默认,1代表卫星
            showRoad:true//显示路况(右上角也可点击)
          }));
          break
        case "BMAP_EARTH_MAP":
          this.map.addControl(new AMap.MapType({
            defaultType:1, //0代表默认,1代表卫星
            showRoad:true//显示路况(右上角也可点击)
          }));
          break
      }
    },
    // 个性化设置地图
    setMapStyle (stylesJson) {
      if (stylesJson) {
        this.map.setMapStyle('amap://styles/'+stylesJson)
      }else {
        this.map.setMapStyle('amap://styles/blue')
      }
    },

    resetMap () {
      this.map.clearMap()
    }

  },
  computed: {},
  watch: {
    'mapOption.mapType': function (val) {
      this.setMapType(val)
    },
    'mapOption.styleJson': function (val) {
      this.setMapStyle(val)
    },
    'mapOption.center': {
      handler: function (val) {
        if (!this.mapOption.centerCity) {
          this.map.setCenter((val[0], val[1]))
        }
      },
      deep: true
    },
    'mapOption.centerCity': function (val) {
      val ? this.map.setCenter(val) : this.map.setCenter((this.mapOption.center[0], this.mapOption.center[1]))
    },
    'mapOption.zoom': function (val) {
      this.map.setZoom(val)
    },
    'mapOption.heading': function (val) {
      this.map.setRotation(val)
    },
    'mapOption.tilt': function (val) {
      this.map.setPitch(val)
    },
    'mapOption.skyColors': {
      handler: function (val) {
        // this.map.setDisplayOptions({
        //   skyColors: val
        // })
      },
      deep: true
    },
    'mapOption.dragEnable': function (val) {
      val ? this.map.setStatus({dragEnable: true}) : this.map.setStatus({dragEnable: false})
    },
    'mapOption.scrollWheel': function (val) {
      val ? this.map.setStatus({scrollWheel: true}) : this.map.setStatus({scrollWheel: false})
    },
    'mapOption.doubleClickZoom': function (val) {
      val ? this.map.setStatus({doubleClickZoom: true}) : this.map.setStatus({doubleClickZoom: false})
    }
  }
}
</script>

<style lang="less" scoped>
.b-map {
  position: relative;
  .toolbar {
    position: absolute;
    left: 10px;
    top: 10px;
    z-index: 3;
  }
  .map-container {
    z-index: 1;
  }
}

</style>

一个工具类 抽出高德的主要map的内容

const buildgDMapOptionConfigData = function (otherConfig = {}) {
  return PnUtil.deepMerge({
    mapType: 'BMAP_NORMAL_MAP',
    stylesJson: 'blue',
    center: [112.86589,27.88369],
    centerCity: '',
    zoom: 17,
    heading: 0,
    tilt: 30,
    skyColors: ['rgba(0,0,0,0)','rgba(33,150,243,0.3)'],
    // viewMode:'3D', //开启3D视图,默认为关闭
    dragEnable: true, // 地图拖拽
    scrollWheel: true, // 滚轮放大缩小
    doubleClickZoom: true, // 双击放大
  }, otherConfig)
}

 

标签:mapOption,异步,vue,val,map,setStatus,AMap,true,高德
From: https://www.cnblogs.com/easyjie/p/17958541

相关文章

  • SpringBoot中使用SpringEvent业务解耦神器实现监听发布事件同步异步执行任务
    场景SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135504554设计模式-观察者模式在Java中的使用示例-环境监测系统:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det......
  • Vue2 使用 Knova Canvas 合成图片、多个视频、音频在一个画面中并播放,自定义 video co
    本文转载https://blog.csdn.net/RosaChampagne/article/details/128020428?spm=1001.2014.3001.5502的文章安装插件npminstallvue-konva@2konva--save在main.js中使用importVuefrom'vue';importVueKonvafrom'vue-konva';Vue.use(VueKonva);相关实现代......
  • Vue-Router: 如何在Vue应用程序中使用编程式导航?
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • Vue(三)基础继续补充
    插件:新建一个pluginsindex.jsimportVuefrom'vue'exportdefault{install(a){console.log(a)//自定义一个,加入混入Vue.mixin({methods:{handleShowName(){alert(this.name)......
  • 250-AMap.InfoWindow 高德地图信息窗体关闭后的回调
    varinfoWindow2=newAMap.InfoWindow({content:infoWindowContent,offset:[50,-60],closeWhenClickMap:true,//autoMove:false,/*close:function(){console.log("infoWindow2.close")windowMap.get(parseInt(id)......
  • 创建一个vue项目全过程
    1.安装node环境,cmd检查node是否安装成功命令:node-v2.安装vue.js,命令:npminstall-gvue(默认安装的是vue3)3.安装webpack模块,命令:npminstallwebpack-g4.安装webpack脚手架,命令:npminstall--globalwebpack-cli5.全局安装vue-cli,命令:npminstall-globalvue-cli(安装的是vu......
  • vue入门-???? 05days
    购物车案例回顾:-v-for循环商品-checkbox多选:数组,input--->checkbox--->value 对象  [在input中只能使用v-model]getprice()---->方法------>变量发生变化,这个会重新运算加全选与全不选-chekbox--->单独的------>布尔类型-checkbox的cha......
  • SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662设计模式-单例模式-饿汉式单例模式、懒汉式单例模式、静态内部类在Java中的使用示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/......
  • 使用Nginx部署VUE3+VITE项目时无法访问后端接口的一个情况
    在使用VUE3作为前端,ABPVNEXT6.0作为后端框架。使用Nginx部署后无法访问api,接口报错404找错思路很重要,网上找到了很多Nginx配置信息,但是都不起作用,即使更换服务器重新部署也无法生效后来才发现,ABPNEXT对于未找到对应实体的报错就是404,按照正常的程序逻辑,404应该就是notfound,这一......
  • netcore webpi 通过signalr 给vue项目推送消息
     最近项目上需要做个服务给前端推消息,首先就想到了signalr,关于signalr详情可以参考微软官方文档(ASP.NETCoreSignalR概述|MicrosoftLearn),微软现在也有使用教程(ASP.NETCoreSignalR入门|MicrosoftLearn)微软教程是通过使用库管理器(LibMan)从unpkg 获取客户端库,如......