vue-高德地图-点击地图-获取省市区-获取经纬度-获取街道地址

1.html 首页要有注册的高德地图KEY    申请注册的方式百度一下就OK啦  我这个vue 是针对3.0以后的cli3 以后的  默认进入 是自动定位获取当前位置 和 经纬度的。

1.  <script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=你的key&plugin=AMap.Geocoder"></script>

效果图是下面的,写这个功能花了一天半的时间  有引入过别人的代码 然后自己再优化了一部分。 

2.下载安装amp  main.js配置     还要vue.config.js 的配置

npm install -S vue-amap

// 下面是main.js配置  

import AMap from 'vue-amap'
Vue.use(AMap)
AMap.initAMapApiLoader({
    key: 你的key,
    plugin: ['AMap.Scale', 'AMap.OverView', 'AMap.ToolBar', 'AMap.MapType', 'AMap.PlaceSearch', 'AMap.Geolocation', 'AMap.Geocoder'],
    v: '1.4.4',
})
// 这是vue.config.js 配置 将AMap作为全局变量

module.exports = {

    publicPath: "./",
    chainWebpack: (config) => {
        config.resolve.alias
            .set('@', resolve('src'))
            .set('@components', resolve('src/components'))
            .set('@img', resolve('src/assets/imgs'))
    },
    configureWebpack: {
        externals: {
            'AMap': 'AMap'
        }
    }
}

 3.然后写子组件 父组件调用     这是一个完整子组件  可以直接调用 

<template>
  <div class="map-box" :style="{ width: width, height: height }">
    <div id="amap" class="amap"></div>
    <div class="detail">
      <p>经度:{{point ? point[0] : '-'}}</p>
      <p>纬度:{{point ? point[1] : '-'}}</p>
      <p>地址:{{address}}</p>
      <button size="mini" class="btnmap" @click="commit">确定</button>
    </div>
  </div>
</template>

<script>
import AMap from "AMap";
export default {
  props: {
    width: { type: String, default: "100%" },
    height: { type: String, default: "400px" }
  },
  data() {
    return { address: "", point: this.lnglat, marker: "" };
  },
  mounted() {
    this.init(this.point);
  },
  methods: {
    // 初始化
    init() {
      // 地图实例对象 (amap 为容器的id)
      let amap = new AMap.Map("amap", {
        resizeEnable: true,
        zoom: 15
      });

      // 注入插件(定位插件,地理编码插件)
      amap.plugin(["AMap.Geolocation", "AMap.Geocoder"]);
      // 定位

      this.currentPosition(amap);
      let that = this;
      amap.on("click", function(e) {
        //地图被点击的时候
        amap.remove(that.marker);
        let lnglat = [e.lnglat.lng, e.lnglat.lat];
        amap.setCenter(lnglat);
        that.addMark(amap, lnglat);
        that.point = [e.lnglat.lng, e.lnglat.lat];
        that.getAddress([e.lnglat.lng, e.lnglat.lat]);
      });
    },

    // 定位
    currentPosition(map) {
      // 获取地图的位置
      // 没有传入坐标点,则定位到当前所在位置
      let geolocation = new AMap.Geolocation({
        enableHighAccuracy: true,
        timeout: 10000,
        zoomToAccuracy: true,
        buttonPosition: "RB"
      });
      geolocation.getCurrentPosition((status, result) => {
        if (status === "complete") {
          let points = [result.position.lng, result.position.lat];
          map.setCenter(points); // 设置中心点
          this.addMark(map, points); // 添加标记
          // 存下坐标与地址
          this.point = points; // 复制给展示html页面
          this.getAddress(points); // 传入坐标  获取地址
        } else {
          console.log("定位失败", result);
        }
      });
    },

    // 添加标记  就是感叹号标记
    addMark(map, points) {
      this.marker = new AMap.Marker({
        map: map,
        position: points,
        draggable: true, // 允许拖动
        cursor: "move",
        raiseOnDrag: true,
        title: "中心"
      });
      this.marker.on("dragend", e => {
        console.log(e);
        let position = this.marker.getPosition();
        // 存下坐标与地址
        this.point = [position.lng, position.lat];
        this.getAddress([position.lng, position.lat]);
      });
    },

    // 根据坐标返回地址(逆地理编码)
    getAddress(points) {
      let geocoder = new AMap.Geocoder({ radius: 1000 });
      geocoder.getAddress(points, (status, result) => {
        if (status === "complete" && result.regeocode) {
          let s_addr =
            result.regeocode.addressComponent.province +
            "-" +
            result.regeocode.addressComponent.city +
            "-" +
            result.regeocode.addressComponent.district;
          let addreesd = result.regeocode.formattedAddress; // 全部地址名称
          let houzhi = addreesd.substring(s_addr.length); // 获取具体街道
          console.log(s_addr);
          console.log(houzhi);
          console.log(addreesd);
          this.address = s_addr + "," + houzhi;
        }
      });
    },

    commit() {
      this.$emit("location", this.point, this.address);
    }
  }
};
</script>

<style lang="scss" >
.map-box {
  box-sizing: border-box;
  background-color: #ddd;
  padding-top: 10px;
  &:after {
    content: "";
    display: block;
    clear: both;
  }
  .amap,
  .detail {
    float: left;
    height: 100%;
  }
  .amap {
    width: 100%;
  }

  .detail {
    width: 100%;
    background-color: #fff;
    padding: 0 15px;
    border-left: 1px solid #eee;
    box-sizing: border-box;
    word-wrap: break-word;
    height: 20%;
    top: 0px;
    position: absolute;
    p {
      margin-top: 10px;
    }
  }
  .btnmap {
    width: 100%;
    padding: 5px 0;
    color: #fff;
    cursor: pointer;
    background-color: #409eff;
    border: none;
    border-radius: 3px;
    margin-top: 5px;
    &:hover {
      background-color: #66b1ff;
    }
  }
}
</style>

4.写父组件调用的代码  引入子组件  子组件在父组件里面显示。

 // 这个是地图显示  isditu 控制是否展示地图 
 <div class="box" v-show="isditu">
      <xmap width="100%" height="100%" @location="location"></xmap>
    </div>


// 这个是点击事件 触发 控制地图显示 
       <div class="dandee">
          <div class="danone">所在区域</div>
          <div class="dantwo">
            <el-input v-model="s_addr" placeholder="请选择所在区域" @click="xuanzeditu"></el-input>
          </div>
          <img src="../../assets/imgs/xingxing.png" class="xingxing" />
          <img src="../../assets/imgs/jinru.png" @click="xuanzeditu" class="jinrud" />
        </div>


   <div class="dandee">
          <div class="danone">详细地址</div>
          <div class="dantwo">
            <el-input v-model="s_house_number" @change="changedd" placeholder="请输入街道门牌号"></el-input>
          </div>
          <img src="../../assets/imgs/xingxing.png" class="xingxing" />
        </div>
      </div>


//js 写法

import xmap from "./ceshimap";   //引入子组件
import axios from "axios";    // vue axios安装我就不说了

export default {
  components: {
    xmap
  },

  data() {
    return {
      isditu: false,
      provinceValue: "",
      cityValue: "",
      regionValue: "",
      s_addr:"",
      s_house_number: "",
      s_latitude :"",
      s_longitude :"",
    };
  },
 
 methods: {
    // 这个是点击子组件里面的确定
     location(point, address) {
      this.isditu = false;
      this.s_latitude = point[1];       
      this.s_longitude = point[0];
      let s_addrs = address.split(",")[0];
      this.provinceValue = s_addrs.split("-")[0];  //省会
      this.cityValue = s_addrs.split("-")[1];   // 城市
      this.regionValue = s_addrs.split("-")[2]; // 区域
      this.s_addr = this.provinceValue + this.cityValue + this.regionValue; //省市区 拼接
      console.log(address.split(",")[1]);
      this.s_house_number = address.split(",")[1];   // 门牌号
    },
  // 这个是点击父组件选择区域 显示地图
    xuanzeditu() {
      this.isditu = true;
    },

   // 注意如果 客户修改具体的门牌号 那么我们需要重新获取经纬度   
      changedd() {
      axios
        .get("https://restapi.amap.com/v3/geocode/geo", {   //这个但是调用官方的方法  将地址解析成经纬度
          params: {
            key: 你的key,
            address:
              this.provinceValue +
              this.cityValue +
              this.regionValue +
              this.s_house_number
          }
        })
        .then(response => {
          console.log(response.data.geocodes[0].location.split(","));
          let shuzu = response.data.geocodes[0].location.split(",");
          this.s_latitude = shuzu[1];
          this.s_longitude = shuzu[0];
        })
        .catch(function(error) {
          // 请求失败处理
          console.log(error);
        });
    },


}

}

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要实现在vue点击高德地图获取经纬度和详细地址,可以按照以下步骤进行: 1. 在vue项目中安装 `vue-amap` 插件。可以使用npm安装,命令如下: ``` npm install vue-amap --save ``` 2. 在 `main.js` 中引入 `vue-amap` 并进行初始化配置。 ```javascript import VueAMap from 'vue-amap'; Vue.use(VueAMap); VueAMap.initAMapApiLoader({ key: 'your amap key', plugin: ['AMap.Geocoder'] }); ``` 其中 `your amap key` 是你的高德地图开发者Key,需要在高德开放平台上申请。 3. 在组件中引入 `Amap` 组件,并在 `mounted` 钩子函数中进行地图初始化以及监听地图点击事件。 ```vue <template> <div> <div id="map" style="height: 500px;"></div> </div> </template> <script> export default { data() { return { map: null, geocoder: null, marker: null, address: '', lnglat: null } }, mounted() { this.initMap(); this.initGeocoder(); this.addMapClickEvent(); }, methods: { initMap() { this.map = new AMap.Map('map', { zoom: 13, center: [116.397428, 39.90923] }); }, initGeocoder() { this.geocoder = new AMap.Geocoder({ city: "北京" }); }, addMapClickEvent() { let self = this; this.map.on('click', function(e) { self.lnglat = e.lnglat; self.getAddressByLngLat(); self.addMarker(); }); }, getAddressByLngLat() { let self = this; this.geocoder.getAddress(this.lnglat, function(status, result) { if (status === 'complete' && result.regeocode) { self.address = result.regeocode.formattedAddress; } }); }, addMarker() { if (this.marker) { this.map.remove(this.marker); } this.marker = new AMap.Marker({ position: this.lnglat, }); this.map.add(this.marker); } } } </script> ``` 4. 在 `data` 中定义需要用到的变量,如 `map` 表示地图对象、 `geocoder` 表示逆地址解析对象、 `marker` 表示标记点对象、 `address` 表示详细地址、 `lnglat` 表示经纬度。 5. 在 `mounted` 钩子函数中,先调用 `initMap` 方法初始化地图对象,然后调用 `initGeocoder` 方法初始化逆地址解析对象,最后调用 `addMapClickEvent` 方法监听地图点击事件。 6. 在 `addMapClickEvent` 方法中,使用 `map.on('click', function(e) {...})` 监听地图点击事件,并在回调函数中获取点击位置的经纬度并保存到 `lnglat` 变量中,然后调用 `getAddressByLngLat` 方法通过经纬度获取详细地址,并调用 `addMarker` 方法在地图上添加标记点。 7. 在 `getAddressByLngLat` 方法中,调用逆地址解析对象的 `getAddress` 方法,根据经纬度获取详细地址,并将地址保存到 `address` 变量中。 8. 在 `addMarker` 方法中,先判断是否已有标记点,如果有则先移除旧的标记点,然后创建新的标记点并添加到地图上。 9. 最后,在模板中使用 `id="map"` 定义地图容器,并添加样式 `style="height: 500px;"`。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值