首页 > 其他分享 >Vue项目接入高德地图

Vue项目接入高德地图

时间:2024-12-26 16:52:02浏览次数:6  
标签:map Vue 接入 lat AMap marker new lng 高德

说明:最近开发中有需要使用英文版本的地图,比较下采用了高德地图(百度不支持英文JS API,谷歌需要visa信用卡认证),记录一下开发过程。

  1. 申请密钥,地址:高德地图开放平台
  2. 在index.html中引入对应文件
<link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
<link rel="stylesheet" type="text/css" href="https://a.amap.com/jsapi_demos/static/demo-center/css/prety-json.css">


<script type="text/javascript">
    window._AMapSecurityConfig = {
      securityJsCode: "安全密钥",
  }
</script>
<script src="https://cache.amap.com/lbs/static/es5.min.js"></script>
<script src="https://webapi.amap.com/maps?v=1.4.15&key=密钥KEY&plugin=AMap.Autocomplete"></script>
<script type="text/javascript" src="https://a.amap.com/jsapi_demos/static/demo-center/js/jquery-1.11.1.min.js" ></script>
<script type="text/javascript" src="https://a.amap.com/jsapi_demos/static/demo-center/js/underscore-min.js" ></script>
<script type="text/javascript" src="https://a.amap.com/jsapi_demos/static/demo-center/js/backbone-min.js" ></script>
<script type="text/javascript" src='https://a.amap.com/jsapi_demos/static/demo-center/js/prety-json.js'></script>
  1. 组件开发
  • 组件一:用于标记位置和查找地点
<template>
  <div>
    <div id="container"></div>
  </div>
</template>

<script>
export default {
  props: {
    center: {
      type: Object,
      default: () => ({ lng: 0, lat: 0 }) 
    },
    zoom: {
      type: Number,
      default: 13
    }
  },
  data() {
    return {
      selectedLang: this.$i18n.locale === 'en' ? 'en' : 'zh_cn',
      map: null,
      marker: null,
      currentCenter: { lng: this.center.lng, lat: this.center.lat }, // 当前中心点
      searchMarkers: []  // 查找标记点
    };
  },
  mounted() {
    this.initMap();
  },
  beforeDestroy() {
    if (this.map) {
      this.map.destroy();
    }
  },
  methods: {
    // 初始化地图
    initMap() {
      this.initializeMap(this.currentCenter);

      // 地图点击事件
      AMap.event.addListener(this.map, 'click', (e) => {
        this.currentCenter = { lng: e.lnglat.getLng(), lat: e.lnglat.getLat() }; 
        this.addMarker(this.currentCenter); 
        this.$emit('updateCenter', this.currentCenter); 
      });

      // 语言切换
      this.$watch('selectedLang', (newLang) => {
        this.map.setLang(newLang);
      });

      // 地图缩放事件,告诉父组件当前层级
      AMap.event.addListener(this.map, 'zoomend', () => {
        const currentZoom = this.map.getZoom();
        this.$emit('curMapLevel', currentZoom); 
      });
    },
    
    // 初始化地图
    initializeMap(center) {
      if(center.lng == null || center.lat == null){
        this.map = new AMap.Map('container', {
          resizeEnable: true,
          lang: this.selectedLang,
          zoom: this.zoom
        });
      }else{
        this.map = new AMap.Map('container', {
          resizeEnable: true,
          center: [center.lng, center.lat],
          lang: this.selectedLang,
          zoom: this.zoom
        });
        this.addMarker(center);
      }
    },
    // 搜索关键词
    searchKeywords(keywords) {
      AMap.plugin('AMap.Autocomplete', () => {
        var autoOptions = {
          city: '全球',
          lang: this.selectedLang
        }
        var autoComplete = new AMap.Autocomplete(autoOptions);
        autoComplete.search(keywords, (status, result) => {
          console.log(result);
          if (status === 'complete' && result.info === 'OK') {
              this.addSearchMarkers(result.tips); 
          } else {
              console.error('自动完成失败:', result.info);
          }
        });
      });
    },
    addMarker(position) {
      if (this.marker) {
        this.marker.setMap(null); 
      }
      this.marker = new AMap.Marker({
        position: [position.lng, position.lat]
      });
      this.marker.setMap(this.map);
    },
    // 添加搜索标记点
    addSearchMarkers(tips) {
      this.searchMarkers.forEach(marker => marker.setMap(null));
      this.searchMarkers = [];

      if (tips.length > 0) {
        this.map.setCenter([tips[0].location.lng, tips[0].location.lat]);
        
        const firstTip = tips[0];
        const firstMarkerPosition = [firstTip.location.lng, firstTip.location.lat];
        const infoWindow = new AMap.InfoWindow({
          content: `<div><strong>${firstTip.name}</strong> <span style="color: #3d6dcc; cursor: pointer;" onclick="window.open('https://www.amap.com/detail/${firstTip.id}')">` + this.$t('common.detail') +`»</span><br>${firstTip.address}</div>`,
          offset: new AMap.Pixel(0, -30) 
        });
        infoWindow.open(this.map, firstMarkerPosition); 
      }
      // 添加搜索标记点
      tips.forEach(tip => {
        const marker = new AMap.Marker({
          position: [tip.location.lng, tip.location.lat],
          icon: new AMap.Icon({
            size: new AMap.Size(25, 34), 
            image: '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-red.png',
            imageSize: new AMap.Size(25, 34), 
          })
        });
        marker.setMap(this.map);
        this.searchMarkers.push(marker); 

        // 点击事件,显示详情
        marker.on('click', () => {
          const infoWindow = new AMap.InfoWindow({
            content: `<div><strong>${tip.name}</strong> <span style="color: #3d6dcc; cursor: pointer;" onclick="window.open('https://www.amap.com/detail/${tip.id}')">` + this.$t('common.detail') +`»</span><br>${tip.address}</div>`, // Display name and detail button in the same line
            offset: new AMap.Pixel(0, -30) 
          });
          infoWindow.open(this.map, marker.getPosition()); 
          this.currentCenter = { lng: tip.location.lng, lat: tip.location.lat };
          this.$emit('updateCenter', this.currentCenter);
        });
      });
    },
  }
};
</script>

<style scoped>
#container {
  width: 100%;
  height: calc(100vh - 200px);
  margin: 0px;
}
</style>
- 组件二:用户显示多个标记点位置及标记点详情

标签:map,Vue,接入,lat,AMap,marker,new,lng,高德
From: https://www.cnblogs.com/IamHzc/p/18633531

相关文章

  • vue关闭eslint校验及开启debugger
    文章目录在Vue项目中关闭ESLint检查,可以通过以下几种方式实现:修改package.json文件中的eslintScript,将其设置为空字符串或者直接删除。在项目根目录下创建.eslintrc.js文件,并设置rules为关闭所有规则。如果使用VueCLI创建的项目,可以在vue.config.js文件中配置,关闭lintOn......
  • AI 驱动的前端开发:从接入到应用的实战指南
    "能不能给我们的应用加上AI功能?"产品经理兴奋地问我。作为一个海外电商网站的前端负责人,我深知AI不是简单地调用几个API就完事了。特别是在前端应用中,如何优雅地集成AI能力,如何处理流式响应,如何优化用户体验,都是需要仔细考虑的问题。最近两个月,我们成功地在项目中......
  • 农家乐系统|Java|SSM|VUE| 前后端分离
                 【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apachetomca......
  • 企业销售人员培训系统|Java|SSM|VUE| 前后端分离
                  【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apacheto......
  • Vue - vue 前端项目基础框架搭建流程
    1.初始化项目pnpmcreatevue//添加路由支持pnpmaddvue-router//添加数据状态管理支持pnpmaddpinia//添加UI模块支持pnpmaddelement-plus//添加图标支持pnpmadd@element-plus/icons-vue//增加网络请求模块支持pnpmaddaxios//添加国际化支持pnpmadd......
  • vue学习(一)
    一、谈谈你对vue的理解1 jquery是命令式   vue是声明式框架2.vue借鉴了mvvm的思想 3. vue采用虚拟DOM传统更新页面,拼接一个完整的字符串innerHTML全部重新渲染。添加虚拟DOM后,可以比较新旧虚拟节点(diff算法),找到变化再进行更新。虚拟DOM就是一个对象,用来描述真实DO......
  • 再战博客园美化(三)——Vue和Element UI
    新的技术终究是新的技术,不适合初学者直接使用既然一口气吃不成胖子,那不如从Vue和ElementUI这两个大名鼎鼎的库开始。其实也是因为我发现我原本套用的模板自带了这两个库的使用。我得说我这path是越来越臃肿了这是gpt的输出,gpt更胜一筹(好吧赛道都不一样,vue和elementui这么......
  • Vue.js组件开发-图片加载失败自动显示默认图片
    在Vue.js组件开发中,处理图片加载失败并自动显示默认图片可以通过Vue的指令和事件绑定来实现这一功能。示例:展示如何在图片加载失败时自动显示默认图片:<template><div><!--使用:src绑定图片的URL,并使用@error事件处理加载失败--><img:src="imageSrc......
  • Vue.js组件开发-使用vue-pdf显示PDF
    安装vue-pdf‌:首先,需要在Vue项目中安装vue-pdf。可以使用npm或yarn来安装。npminstallvue-pdf或者yarnaddvue-pdf‌在Vue组件中引入并使用vue-pdf‌:在Vue组件中引入vue-pdf,并使用<pdf>标签来展示PDF文件。<template><div><pdfsrc="path/to/local/pdf/f......
  • VUE前端实现防抖节流 Lodash
    方法一:采用Lodash工具库Lodash是一个一致性、模块化、高性能的JavaScript实用工具库。(1)采用终端导入Lodash库$npmi-gnpm$npmi--savelodash(2)应用示例:搜索框输入防抖在这个示例中,我们希望用户在输入框中停止输入500毫秒后才执行搜索操作,避免频繁请求.<input......