vue 对接腾讯地图

1 篇文章 0 订阅

1、从腾讯地图API官网注册一个开发秘钥
2.、index.html引入相关js文件

//地图api
<script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=yourkey"></script>
//定位
 <script type="text/javascript" src="https://3gimg.qq.com/lightmap/components/geolocation/geolocation.min.js"></script>

3.在vue页面中编写

<template>
  <div>
    <el-form :model="formData">
      <el-form-item label="地理位置:">
        <el-input type="text" placeholder="" v-model.trim="formData.location"></el-input>
      </el-form-item>
      <el-form-item label="详细地址:">
        <div class="map-box">
          <el-popover popper-class="createBook-pop" placement="bottom-start" ref="pop" trigger="manual" :visible-arrow="false">
            <ul>
              <li v-for="(item,index) in placeList" :key="index" @click="selectCom(item)">
                {{ item.address }}
              </li>
            </ul>
            <el-input v-model.trim="formData.address" maxlength="30" @keyup.native="
                    e => (formData.name = e.target.value.replace(/\s/g, ''))
                  " placeholder="搜索地址" @input="getSearchPlace" @focus="focusShow" slot="reference"></el-input>
          </el-popover>
          <!-- 地图插件-->
          <div id="container" style="width:800px;height:450px" class="mt-30"></div>
        </div>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
var _this;


export default {
  data () {
    return {
      formData: {
        address: "",
        location: "",
        lng: "",
        lat: ""
      },
      //地图对象
      map: null,
      //地图中心
      center: { lat: 22.55329, lng: 113.88308 },
      marker: null,
      //周边地址检索列表
      placeList: []
    };
  },
  mounted () {
    _this = this;
    this.initMap();
  },
  methods: {
    //选择周边地址
    selectCom (row) {
      this.$refs["pop"].doClose();
      this.center = row.latLng;
      this.removeMarker();
      this.createMarker(row.latLng);
      this.formData.address = row.address
      this.formData.location = [row.latLng.lat, row.latLng.lng].join(",");
      this.formData.lat = row.latLng.lat;
      this.formData.lng = row.latLng.lng;
      this.map.setCenter(row.latLng);
    },
    //显示搜索列表
    focusShow (e) {
      if (this.placeList.length) {
        this.$refs["pop"].doShow();
      }
    },
    // 根据输入地址进行逆向解析
    async getSearchPlace () {
      if (this.formData.address === '') {
        _this.placeList = []
        this.$refs["pop"].doClose();
        return
      }
      //设置Poi检索服务,用于本地检索、周边检索
      let searchService = new qq.maps.SearchService({
        pageCapacity: 20,
        complete: function (res) {
          if (res.detail && res.detail.pois && res.detail.pois.length) {
            let placeList = res.detail.pois.map(v => {
              return { latLng: v.latLng, address: v.address ? v.address : '' + v.name ? v.name : '' }
            })
            _this.placeList = placeList
            _this.$refs["pop"].doShow();
          } else {
            _this.$refs["pop"].doClose();
          }
        },
      })
      searchService.setLocation('');
      searchService.search(this.formData.address);
    },
    //地址逆向解析
    geocoderAddress ({ lat, lng }) {
      var geocoder = new qq.maps.Geocoder({
        complete: function (res) {
          // 标志位置
          let center = new qq.maps.LatLng(lat, lng);
          _this.center = center;
          _this.formData.address =
            res.detail.nearPois[0].address + res.detail.nearPois[0].name;
          _this.formData.location = [
            res.detail.nearPois[0].latLng.lat,
            res.detail.nearPois[0].latLng.lng
          ].join(",");
          _this.formData.lat = res.detail.nearPois[0].latLng.lat;
          _this.formData.lng = res.detail.nearPois[0].latLng.lng;
        }
      });
      var latLng = new qq.maps.LatLng(lat, lng);
      geocoder.getAddress(latLng);
    },
    // 定位
    getGeolocation () {
      var geolocation = new qq.maps.Geolocation(
        "yourkey",
        "xxxx"
      );
      // 定位成功之后调用的方法
      function showPosition (position) {
        _this.map.setCenter(new qq.maps.LatLng(position.lat, position.lng));
        // 逆地址解析(经纬度到地名转换过程)
        _this.geocoderAddress(position);
      }
      function showErr () {
        console.log("定位失败");
      }
      geolocation.getLocation(showPosition, showErr);
    },
    //创建标记
    createMarker (center) {
      //创建一个Marker
      _this.marker = new qq.maps.Marker({
        position: center,
        map: _this.map
      });
      //自定义marker
      //设置Marker的可见性,为true时可见,false时不可见,默认属性为true
      _this.marker.setVisible(true);
      //设置Marker的动画属性为从落下
      _this.marker.setAnimation(qq.maps.MarkerAnimation.DOWN);
      //设置Marker是否可以被拖拽,为true时可拖拽,false时不可拖拽,默认属性为false
      _this.marker.setDraggable(true);
      // 设置Marker自定义图标的属性,size是图标尺寸,该尺寸为显示图标的实际尺寸,origin是切图坐标,该坐标是相对于图片左上角默认为(0, 0)的相对像素坐标,anchor是锚点坐标,描述经纬度点对应图标中的位置
      var anchor = new qq.maps.Point(0, 39),
        size = new qq.maps.Size(42, 68),
        origin = new qq.maps.Point(0, 0),
        icon = new qq.maps.MarkerImage(
          "https://wqbjz-pro.oss-cn-shenzhen.aliyuncs.com/4RWt4w_1602323235266.png",
          size,
          origin,
          anchor
        );
      _this.marker.setIcon(icon);
      //标记Marker点击事件
      // qq.maps.event.addListener(marker, 'click', function () {
      // TODO
      // });
      //设置Marker停止拖动事件
      qq.maps.event.addListener(_this.marker, 'dragend', function () {
        _this.center = _this.marker.getPosition();
        // 获取经纬度逆解析地址
        _this.geocoderAddress(_this.marker.getPosition());
      });

    },
    //移除marker事件
    removeMarker () {
      if (_this.marker) {
        _this.marker.setMap(null);
        _this.marker = null;
      }
    },
    // 初始化地址
    initMap () {
      var center = new qq.maps.LatLng(this.center.lat, this.center.lng);
      var map = new qq.maps.Map(document.getElementById("container"), {
        center: center,
        zoom: 15
      });
      this.map = map;
      this.createMarker(center);
      this.geocoderAddress(center);

      // // 监听地图点击事件
      // qq.maps.event.addListener(map, "click", function (event) {
      //  
      //   // 获取经纬度逆解析地址
      //   _this.geocoderAddress(event.latLng);
      //   // map.setCenter(event.latLng);
      // });
      setTimeout(() => {
        this.getGeolocation();
      }, 500)
    }
  },

};
</script>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值