记一次vue端使用百度地图获取经纬度的问题(详细版)

支持 搜索位置 获取经纬度,以及 点击地图 获取经纬度

第一步安装依赖

npm i --save vue-baidu-map

或者

yarn add vue-baidu-map

第二步引入百度地图key值和sdk
key值要去百度地图开放平台申请
在这里插入图片描述
第三步写一个div,并给上id
在这里插入图片描述
第四步在script首行定义BMap对象,否则底下每次new BMap都要加上window
在这里插入图片描述
第五步创建并初始化BMap

this.bMap = new BMap.Map("container");
      const _this = this;
      this.bMap.addEventListener("click", function(e) {
        _this.setPosion(e.point);
});
this.bMap.addControl(new BMap.MapTypeControl()); // 添加地图类型控件
this.bMap.enableScrollWheelZoom(true); // 开启鼠标滚轮缩放
this.setPosion({ lng: lngLat[0], lat: lngLat[1] });

setPosion方法如下

setPosion(lngLat) {
      // 清除所有地图坐标
      this.bMap.clearOverlays();
      // 添加地图坐标
      const point = new BMap.Point(lngLat.lng, lngLat.lat);
      this.bMap.centerAndZoom(point, 15); // 初始化地图
      this.bMap.addOverlay(new BMap.Marker(lngLat));
      this.lngLat = [lngLat.lng, lngLat.lat];
      this.showDropDownList = false;
}

以上设置即可显示地图,点击地图即可获取经纬度

========================================
下面说一下实现搜索位置获取经纬度的功能
第一步定义一个输入框

<a-input
    type="text"
    v-model="searchText"
  />

第二步监听该输入框值的变化,将该输入框的值拿去搜索所有的位置

const _this = this;
const search = new BMap.LocalSearch(this.bMap);
search.setSearchCompleteCallback(function(searchResult) {
  let locArr = searchResult.Kr;
  locArr = locArr.map((o) => {
    return {
      id: o.uid,
      name: `${o.title}>${o.address}>${o.city}`,
      lngLat: { lng: o.point.lng, lat: o.point.lat },
    };
  });
  _this.selectList = locArr;
});
search.search(val);

这里 selectList 即使所有的搜索结果,可以展示出来,点击获取经纬度,这里我是放在下拉框组件中的。
最后的实现效果是这样的
在这里插入图片描述
最后上完整代码,我是将它写成组件的,另外我是用的是Ant Design of Vue,你们可以自己复制下来根据自己的需求更改

<template>
  <div>
    <a-row>
      <a-col :span="12">
        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="经度">
          {{ lngLat[0] }}
        </a-form-item>
      </a-col>
      <a-col :span="12">
        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="纬度">
          {{ lngLat[1] }}
        </a-form-item>
      </a-col>
      <a-col :span="24">
        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="搜索">
          <a-dropdown
            ref="drop"
            :visible="showDropDownList && showModal"
            @focusout="
              () => {
                showDropDownList = false;
              }
            "
          >
            <a-input
              type="text"
              v-model="searchText"
              @click="
                () => {
                  showDropDownList = !showDropDownList;
                }
              "
            />
            <a-menu slot="overlay">
              <a-menu-item
                v-for="x of selectList"
                :key="x.id"
                @click="setPosion(x.lngLat)"
              >
                <span>{{ x.name }}</span>
                <span style="font-weight: bolder; margin-left: 10px"
                  >点击定位</span
                >
              </a-menu-item>
            </a-menu>
          </a-dropdown>
        </a-form-item>
      </a-col>
      <a-col :span="24">
        <span style="color: #aaa"
          >*双击地图可以进行跳转。标注可定位的搜索项能够直接定位到准确位置,标注可搜索的搜索项点击后将以其内容进行再次搜索。</span
        >
      </a-col>
    </a-row>
    <div
      id="container"
      :style="{ width: '100%', height: mapHeight, margin: '10px 0' }"
    />
    <a-row style="margin-top: 20px">
      <a-col :span="24" style="display: flex; justify-content: center">
        <a-button-group>
          <a-button @click="updateLngLat(lngLat)">更新</a-button>
          <a-button @click="handleCloseModal">取消</a-button>
        </a-button-group>
      </a-col>
    </a-row>
  </div>
</template>

<script>
const BMap = window.BMap;
export default {
  name: "BMapSelector",
  props: {
    itemData: {
      type: Object,
      default: () => {},
    },
    updateLngLat: {
      type: Function,
      default: () => {},
    },
    defaultLngLat: {
      type: Array,
      default: () => {
        return [120.545532, 31.282485];
      },
    },
    handleCloseModal: {
      type: Function,
      default: () => {},
    },
    showModal: {
      type: Boolean,
      default: true,
    },
    mapHeight: {
      type: String,
      default: "500px",
    },
  },
  data() {
    return {
      bMap: {},
      showDropDownList: true,
      selectList: [],
      searchText: "",
      lngLat: [0, 0],
      labelCol: { xs: { span: 24 }, sm: { span: 5 } },
      wrapperCol: { xs: { span: 24 }, sm: { span: 12 } },
    };
  },
  created() {
    if (this.itemData.lng && this.itemData.lat) {
      this.lngLat = [this.itemData.lng * 1, this.itemData.lat * 1];
    } else {
      this.lngLat = this.defaultLngLat;
    }
  },
  mounted() {
    this.createMap();
    this.createMarker(this.lngLat);
  },
  methods: {
    createMap() {
      this.bMap = new BMap.Map("container");
      const _this = this;
      this.bMap.addEventListener("click", function(e) {
        _this.setPosion(e.point);
      });
    },
    createMarker(lngLat) {
      this.bMap.addControl(new BMap.MapTypeControl()); // 添加地图类型控件
      this.bMap.enableScrollWheelZoom(true); // 开启鼠标滚轮缩放
      this.setPosion({ lng: lngLat[0], lat: lngLat[1] });
    },
    update() {
      this.showDropDownList = false;
      this.updateLngLat(this.lngLat);
    },
    setPosion(lngLat) {
      // 清除所有地图坐标
      this.bMap.clearOverlays();
      // 添加地图坐标
      const point = new BMap.Point(lngLat.lng, lngLat.lat);
      this.bMap.centerAndZoom(point, 15); // 初始化地图
      this.bMap.addOverlay(new BMap.Marker(lngLat));
      this.lngLat = [lngLat.lng, lngLat.lat];
      this.showDropDownList = false;
    },
  },
  watch: {
    searchText(val) {
      const _this = this;
      const search = new BMap.LocalSearch(this.bMap);
      search.setSearchCompleteCallback(function(searchResult) {
        let locArr = searchResult.Kr;
        locArr = locArr.map((o) => {
          return {
            id: o.uid,
            name: `${o.title}>${o.address}>${o.city}`,
            lngLat: { lng: o.point.lng, lat: o.point.lat },
          };
        });
        _this.selectList = locArr;
      });
      search.search(val);
      this.showDropDownList = true;
    },
  },
};
</script>
<style scoped></style>

这里是调用

<BMapSelector
        mapHeight="360px"
        :itemData="{ lng: itemData.customer_lng, lat: itemData.customer_lat }"
        :updateLngLat="
        () => {
          //更新按钮监听事件
          }
        "
        :handleCloseModal="
          () => {
          //关闭按钮监听事件
          }
        "
      />
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要根据经纬度获取位置,你可以使用百度地图的逆地址解析服务。以下是一个示例代码,可以在 Vue 中根据经纬度获取位置信息: 首先,在你的 Vue 组件中引入百度地图的 JavaScript API: ```html <script src="http://api.map.baidu.com/api?v=2.0&ak=YOUR_API_KEY"></script> ``` 请将 `YOUR_API_KEY` 替换为你自己的百度地图 API 密钥。 然后,在你的 Vue 组件中,可以使用 `mounted` 钩子函数和 `Geocoder` 对象来进行逆地址解析: ```javascript export default { mounted() { // 创建地图实例 const map = new BMap.Map("mapContainer"); // 创建点坐标 const point = new BMap.Point(经度, 纬度); // 初始化地图,设置中心点坐标和地图级别 map.centerAndZoom(point, 15); // 创建逆地址解析器 const geocoder = new BMap.Geocoder(); // 根据坐标获取位置信息 geocoder.getLocation(point, function(result) { if (result) { console.log(result.address); } }); }, }; ``` 请将 `经度` 和 `纬度` 替换为你要获取位置信息的具体经纬度值。 最后,在你的 Vue 模板中添加一个容器来显示地图: ```html <template> <div id="mapContainer" style="width: 100%; height: 400px;"></div> </template> ``` 这样,根据经纬度就可以在 Vue获取到对应的位置信息了。请确保你已经正确引入百度地图的 JavaScript API,并且替换了正确的 API 密钥和经纬度值。获取到的位置信息可以通过 `result.address` 获取,你可以根据需要进行处理或展示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值