vue 使用百度地圖:搜索定點(diǎn)

需求:
1.以某一點(diǎn)為圓心,半徑5000米以?xún)?nèi)的地方進(jìn)行標(biāo)注遣铝;
2.點(diǎn)擊選擇定位佑刷,添加覆蓋物,并解析地址酿炸;
3.通過(guò)搜索進(jìn)行定位:↑↓鍵進(jìn)行選擇Enter鍵確定瘫絮,也可以點(diǎn)擊選擇,并添加覆蓋物填硕。

效果圖 ↓

官網(wǎng)地址:
https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi

這次的需求是麦萤,圓心五公里之內(nèi)的地方鹿鳖,需要可以搜索定點(diǎn)。根據(jù)文檔壮莹,需要用到的api是
https://api.map.baidu.com/place/v2/search?query=銀行&location=39.915,116.404&radius=2000&output=xml&ak=您的密鑰
具體參數(shù)看上面的網(wǎng)址就成~~
在解析地址時(shí)翅帜,可能會(huì)出現(xiàn)跨域問(wèn)題,所以我們還需要安裝一個(gè)vue-jsonp垛孔。

安裝 ↓

npm install vue-jsonp --s

main.js ↓

import {VueJsonp} from "vue-jsonp"; 
Vue.use(VueJsonp);

在utils中創(chuàng)建文件loadMap.js ↓

export default function loadBMap(ak) {
    return new Promise(function(resolve, reject) {
      if (typeof BMap !== 'undefined') {
        resolve(BMap)
        return true
      }
      window.onBMapCallback = function() {
        resolve(BMap)
      }
      let script = document.createElement('script')
      script.type = 'text/javascript'
      script.src =
        'http://api.map.baidu.com/api?v=2.0&ak=' + ak + '&callback=onBMapCallback'
      script.onerror = reject
      document.head.appendChild(script)
    })
  }

準(zhǔn)備工作就完成啦~~~~

正式代碼片段

html ↓

    <div class="baidu-map-container">
      <div id="tips-container">
        當(dāng)前定位地址:
        <el-input
          clearable
          v-model="locationTips"
          size="mini"
          @input="onInputLocation"
          @blur="dispearAddressDrop"
          @keyup.native="keydownChangeLocation"
          @focus="onFocusLocation"
        ></el-input>
        <!-- ↓ 為搜索時(shí)出現(xiàn)的下拉框 -->
        <div class="drop-container" v-if="addressSearchDropShow">
          <div
            class="loop-address-search"
            v-for="(address, idx) in addressSearchList"
            :key="address.uid"
            :class="addressNum === idx ? 'active-address' : ''"
            @click="handleChooseAddress(idx)"
          >
            <i class="el-icon-search icon"></i>
            <p class="name">{{ address.name }}</p>
            <p class="address">{{ address.city + address.area }}</p>
          </div>
        </div>
      </div>
      <!-- ↓ 地圖容器 -->
      <div id="baidu-map-container"></div>
    </div>

css ↓ (首先要確保容器有足夠的寬高)

.baidu-map-container {
  height: 480px;
  position: relative;
  #baidu-map-container {
    width: 100%;
    height: 100%;
    position: absolute;
    left: 0;
    top: 0;
  }
  #tips-container {
    z-index: 1;
    position: absolute;
    top: 10px;
    left: 10px;
    padding: 0px 7px;
    min-width: 400px;
    height: 70px;
    line-height: 35px;
    background: #fff;
    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
    border-bottom: 1px solid lightgrey;
    font-size: 12px;
    .drop-container {
      min-width: 400px;
      max-height: 400px;
      overflow: scroll;
      overflow-y: auto;
      overflow-x: hidden;

      position: absolute;
      left: 0;
      background: white;
      .loop-address-search {
        padding: 0 7px;
        display: flex;
        align-items: center;
        cursor: pointer;
        .icon,
        .name {
          margin-right: 10px;
        }
        .icon {
          line-height: 20px;
        }
        .address {
          color: #999999;
        }
      }
      .loop-address-search:hover {
        background: rgba(0, 0, 0, 0.1);
      }
      .active-address {
        background: rgba(0, 0, 0, 0.1);
      }
    }
    .drop-container::-webkit-scrollbar {
      display: none;
    }
  }
}

script ↓

  // 引入寫(xiě)好的使用百度地圖的方法
  import loadMap from "@/components/BaiduMap/loadMap";

  data() {
    return {
      addressSearchDropShow: false,
      addressNum: -1, // 控制地址搜索下拉框是否選中的變量
      addressSearchList: [], // 搜索下拉框的數(shù)組
      
      locationTips: "", 
      ifHasSearchAddress: false,
      // 不知道該怎么備注了藕甩。。周荐。狭莱。都是語(yǔ)義化自己理解吧
      currentSearchAddressInfo: {
        lng: "",
        lat: "",
      },
      // 中心點(diǎn)坐標(biāo)
      center: {
        lng: "119.587727",
        lat: "39.961482",
      },
    };
  },
  methods: {
    // 下拉框消失
    dispearAddressDrop() {
      // 設(shè)置定時(shí)器原因:
      // 當(dāng)點(diǎn)擊下拉框中的任意一條時(shí),會(huì)先執(zhí)行el-input的blur方法
      // 即概作,下拉框先消失腋妙,后面的語(yǔ)句都執(zhí)行不了啦
      setTimeout(() => {
        this.addressNum = -1;
        this.addressSearchDropShow = false;
      }, 100);
    },
    // 選中某條數(shù)據(jù)時(shí),將選中的地址放輸入框里讯榕,并保存經(jīng)緯度
    handleChooseAddress(idx) {
      let addressInfo = this.addressSearchList[idx];
      // 當(dāng)選擇了一個(gè)地址后保存一個(gè)變量骤素,地圖添加覆蓋物時(shí)會(huì)有用
      this.ifHasSearchAddress = true;
      // 文字入框 獲取經(jīng)緯度
      this.locationTips = addressInfo.name;
      this.currentSearchAddressInfo = { ...addressInfo.location };
      // 獲取到選中的經(jīng)緯度后需要重新加載地圖
      this.initBaiduMap();
      this.dispearAddressDrop();
    },
    onFocusLocation(e) {
      if (e.target.value) {
        this.addressNum = -1;
        this.addressSearchDropShow = true;
      }
    },
    keydownChangeLocation(e) {
      if (e.keyCode === 40) {
        // ↓
        if (this.addressNum < this.addressSearchList.length - 1) {
          this.addressNum++;
        } else {
          this.addressNum = 0;
        }
      }
      if (e.keyCode === 38) {
        // ↑
        if (this.addressNum <= 0) {
          this.addressNum = this.addressSearchList.length - 1;
        } else {
          this.addressNum--;
        }
      }
      if (e.keyCode === 13) {
        // Enter
        this.handleChooseAddress(this.addressNum);
      }
    },
    // 通過(guò)輸入的文字搜索一定范圍內(nèi)的地址
    onInputLocation(val) {
      this.addressNum = -1;
      this.addressSearchDropShow = true;
      // 獲取出現(xiàn)地址的API
      this.$jsonp(
        `https://api.map.baidu.com/place/v2/search?query=${val}&location=${this.center.lat},${this.center.lng}&radius=5000&output=json&ak=你的密鑰`
      ).then((res) => {
        this.addressSearchList = res.results;
      });
    },
    initBaiduMap() {
        loadMap("你的密鑰")
        .then(() => {
          // 之后在circle中添加點(diǎn)擊事件時(shí)this指向會(huì)發(fā)生改變所以先存一個(gè)
          let _this = this;
          // 初始化地圖
          this.myMap = new BMap.Map("baidu-map-container");
          // 中心點(diǎn)和縮放
          this.myMap.centerAndZoom(
            new BMap.Point(this.center.lng, this.center.lat),
            13
          );
          // 地圖可以使用鼠標(biāo)滾輪進(jìn)行縮小放大
          this.myMap.enableScrollWheelZoom();

          let geoc = new BMap.Geocoder();
          // 設(shè)置規(guī)定范圍的圓圈
          let circle = new BMap.Circle(
            new BMap.Point(this.center.lng, this.center.lat),
            5000,
            {
              strokeColor: "green",
              strokeWeight: 6,
              strokeOpacity: 0.5,
            }
          );
          // 添加覆蓋物 規(guī)定范圍的圈兒
          this.myMap.addOverlay(circle);
          // 圓圈兒在之后可能會(huì)進(jìn)行的clearOverlays()時(shí)不會(huì)被刪除
          circle.disableMassClear();

          let marker;
          // 選擇搜索地址后保存的變量
          if (this.ifHasSearchAddress) {
            marker = new BMap.Marker(
              new BMap.Point(
                this.currentSearchAddressInfo.lng,
                this.currentSearchAddressInfo.lat
              )
            );
            // 如果有選中的地址則添加marker
            this.myMap.addOverlay(marker);
          }

          // 給圈兒內(nèi)的地圖范圍添加點(diǎn)擊事件
          circle.addEventListener("click", function (e) {
            // 清空下拉框中的數(shù)據(jù)
            _this.addressSearchList = [];
            // 清空之前的覆蓋物
            _this.myMap.clearOverlays();

            let point = e.point;
            // 獲取點(diǎn)擊地點(diǎn)的經(jīng)緯度
            _this.longitude = point.lng;
            _this.latitude = point.lat;
            // 添加覆蓋物
            let markerPoint = new BMap.Marker(
              new BMap.Point(point.lng, point.lat)
            );
            _this.myMap.addOverlay(markerPoint);

            // 將點(diǎn)選的地址信息存入data中
            geoc.getLocation(point, function (rs) {
              let position = rs.addressComponents;

              _this.locationTips = `${position.province}${position.city}${position.district}${position.street}${position.streetNumber}`;
            });
          });
        })
        .catch((err) => {
          console.log("地圖加載失敗");
        });
    }
  },
  mounted() {
    this.initBaiduMap();
  },

tada~一個(gè)可以點(diǎn)選也可以搜索定點(diǎn)的地圖就完成啦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市愚屁,隨后出現(xiàn)的幾起案子济竹,更是在濱河造成了極大的恐慌,老刑警劉巖霎槐,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件送浊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡丘跌,警方通過(guò)查閱死者的電腦和手機(jī)袭景,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)闭树,“玉大人耸棒,你說(shuō)我怎么就攤上這事”ㄈ瑁” “怎么了与殃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)碍现。 經(jīng)常有香客問(wèn)我幅疼,道長(zhǎng),這世上最難降的妖魔是什么鸵赫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任衣屏,我火速辦了婚禮躏升,結(jié)果婚禮上辩棒,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好一睁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布钻弄。 她就那樣靜靜地躺著,像睡著了一般者吁。 火紅的嫁衣襯著肌膚如雪窘俺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天复凳,我揣著相機(jī)與錄音瘤泪,去河邊找鬼。 笑死育八,一個(gè)胖子當(dāng)著我的面吹牛对途,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播髓棋,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼实檀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了按声?” 一聲冷哼從身側(cè)響起膳犹,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎签则,沒(méi)想到半個(gè)月后须床,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怀愧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年侨颈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芯义。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哈垢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扛拨,到底是詐尸還是另有隱情耘分,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布绑警,位于F島的核電站求泰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏计盒。R本人自食惡果不足惜渴频,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望北启。 院中可真熱鬧卜朗,春花似錦拔第、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至逛万,卻和暖如春泳猬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宇植。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工得封, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人指郁。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓呛每,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親坡氯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晨横,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容