vue点击地图位置获取金纬度以及获取省市区

点击地图获取金纬度跟地址详情。同时解决地图标记一直不在中央,在左上角的问题。

先上效果图:

第一步引入百度地图:

在目录public -> index.html中引用该地址

 <script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=自己百度地图申请"></script>

第二代码:

<!--获取经纬度-->
<template>
  <div>
    <div class="content-box">
      <span style="margin-right: 20px;">{{sendO.lng}} , {{sendO.lat}}</span>
      <el-input v-model="searchVal" placeholder="请输入内容" maxlength="20" style="width: 220px;"></el-input>
      <el-button @click="searchFun">搜索</el-button>
      <div class="search-list" v-if="isOpen">
        <div class="select-item" v-for="item in resutSearchList" @click="handlerSelect(item)">{{item.address}}</div>
      </div>
    </div>
    <div id="mapApp" v-if="isOpenMap">
    </div>
  </div>
</template>

<script>
  export default {
    name: "showMap",
    data() {
      return {
        isOpen: false,
        sendO: {
          lng: this.lng,
          lat: this.lat,
          info: {}
        },
        map: null,
        local: null,
        searchVal: null,
        resutSearchList: [],
        myGeo: new BMap.Geocoder(),
      }
    },
    mounted() {
      this.initMap2();
    },
    updated() {
      this.initMap2();
    },
    methods: {
      addEvent() {
        this.map.addEventListener("click", (r) => {
          this.sendO.lng = r.point.lng;
          this.sendO.lat = r.point.lat;
          this.reverse();
          this.addMarker(this.map);
        })
      },
      initMap2() {
        if(!this.isOpenMap)return;
        this.map = new BMap.Map("mapApp");
        this.addEvent();
        if (!this.sendO.lat) {
          this.sendO.lat = 39.915573;
        }
        if (!this.sendO.lng) {
          this.sendO.lng = 116.401314;
        }

        this.map.enableScrollWheelZoom(true);
        this.addMarker(this.map);

        this.local = new BMap.LocalSearch(this.map, { //智能搜索
          onSearchComplete: this.search
        });
        //ac.addEventListener("onhighlight", function(e) { //鼠标放在下拉列表上的事件
        // var str = "";
        // var _value = e.fromitem.value;
        // var value = "";
        // if (e.fromitem.index > -1) {
        //   value = _value.province + _value.city + _value.district + _value.street + _value.business;
        // }
        // str = "FromItem<br />index = " + e.fromitem.index + "<br />value = " + value;

        // value = "";
        // if (e.toitem.index > -1) {
        //   _value = e.toitem.value;
        //   value = _value.province + _value.city + _value.district + _value.street + _value.business;
        // }
        // str += "<br />ToItem<br />index = " + e.toitem.index + "<br />value = " + value;
        //console.log(str)
        //G("searchResultPanel").innerHTML = str;
        //});

        //var myValue;
        //ac.addEventListener("onconfirm", function(e) { //鼠标点击下拉列表后的事件
        // var _value = e.item.value;
        // myValue = _value.province + _value.city + _value.district + _value.street + _value.business;
        //console.log(myValue)
        //G("searchResultPanel").innerHTML ="onconfirm<br />index = " + e.item.index + "<br />myValue = " + myValue;

        //setPlace();
        //});

      },

      reverse() {
        let then = this;
        // 创建地理编码实例
        // var myGeo = new BMap.Geocoder();
        // 根据坐标得到地址描述
        this.myGeo.getLocation(new BMap.Point(this.sendO.lng, this.sendO.lat), function(result) {
          if (result) {
            then.sendO.info = result;
          }
          then.sendData();
        })
      },

      addMarker(map) {
        map.clearOverlays();
        map.centerAndZoom(new BMap.Point(this.sendO.lng, this.sendO.lat), 12);
        let marker1 = new BMap.Marker(new BMap.Point(this.sendO.lng, this.sendO.lat));
        map.addOverlay(marker1);
      },
      search() {
        let slist = this.local.getResults();
        console.log(slist);
        if (slist.length <= 0) {
          this.$message('没找到信息');
          return;
        }
        this.isOpen = true;
        this.resutSearchList = this.local.getResults().Yr;
        // var pp = this.local.getResults().getPoi(0).point; //获取第一个智能搜索的结果
      },
      searchFun(v) {
        this.map.clearOverlays(); //清除地图上所有覆盖物
        this.local.search(this.searchVal);
      },
      handlerSelect(v) {
        this.isOpen = false;
        this.map.clearOverlays(); //清除地图上所有覆盖物
        this.sendO.lng = v.point.lng;
        this.sendO.lat = v.point.lat;
        this.addMarker(this.map);
        this.reverse();
      },
      sendData() {
        this.$emit("getMapInfo", this.sendO);
      },
    },
    created() {},
    watch: {
      lat(n, o) {
        this.sendO.lat = n;
      },
      lng(n, o) {
        this.sendO.lng = n;
      }
    },
    props: {
      lng: {
        type: [Number],
        default: null
      },
      lat: {
        type: [Number],
        default: null
      },
      isOpenMap: {
        type: [Boolean],
        default: false
      }
    }
  }
</script>

<style scoped lang="scss">
  #mapApp {
    overflow: hidden;
    width: 760px;
    height: 400px;
    margin: 0;
    font-family: "微软雅黑";
  }

  .content-box {
    width: 800px;
    position: relative;

    .search-list {
      position: absolute;
      border: 1px solid #ccc;
      z-index: 88888;
      background-color: #fff;
      min-width: 200px;
      border-radius: 5px;
      margin-left: 170px;
    }

    .select-item:hover {
      background-color: #ccc;
      cursor: pointer;
    }
  }
</style>

第三引入模块:

 <el-dialog title="获取位置" :visible.sync="openMap" width="800px" append-to-body>
      <showMap @getMapInfo="mapInfo" :lng="Number(form.longitude)" :lat="Number(form.latitude)" :isOpenMap="openMap" />
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="affirmMap">确 定</el-button>
        <el-button @click="cancelMap">取 消</el-button>
      </div>
    </el-dialog>

export defualt{
    data(){
         openMap: false,
    },
    methods:{
 handlerOpenMap(id) {
        if(id){
          getAddress(id).then(response => {
            this.form = response.data;
          });
        }else{
           this.reset();
        }

        this.openMap = true;
      },
  mapInfo(v) {
        this.mapInfos = v;
      },
}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过高德地图JavaScript API 提供的逆地理编码服务来获取点标记所在的省市区信息。具体步骤如下: 1. 在 Vue 组件中引入高德地图 JavaScript API: ```javascript <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值"></script> ``` 2. 初始化地图对象,并创建点标记: ```javascript mounted() { // 初始化地图对象 this.map = new AMap.Map('map-container', { zoom: 10, center: [116.397428, 39.90923] }) // 创建点标记 this.marker = new AMap.Marker({ position: [116.397428, 39.90923], map: this.map }) // 监听点标记点击事件 this.marker.on('click', this.handleMarkerClick) }, ``` 3. 在点标记点击事件处理函数中获取经纬度,并调用逆地理编码服务解析省市区信息: ```javascript methods: { handleMarkerClick() { // 获取点标记经纬度 const position = this.marker.getPosition() // 调用逆地理编码服务解析省市区信息 AMap.plugin('AMap.Geocoder', () => { const geocoder = new AMap.Geocoder({ city: '全国', radius: 1000 }) geocoder.getAddress(position, (status, result) => { if (status === 'complete' && result.regeocode) { const { province, city, district } = result.regeocode.addressComponent console.log(`省份:${province},城市:${city},区县:${district}`) } else { console.log('获取地址失败') } }) }) } } ``` 在逆地理编码服务的回调函数中,可以通过 `result.regeocode.addressComponent` 对象获取省市区信息。 需要注意的是,如果点标记所在的位置距离城市边界比较远,有可能会出现获取不到地址信息的情况,此时需要调整 `radius` 参数的值来扩大逆地理编码服务的范围。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值