調(diào)用百度地圖API,實現(xiàn)兩種效果

效果一:
地圖拖動,中心定位標(biāo)注不動,準(zhǔn)確實時獲取地圖拖動后的中心點位置,并獲取中心點位置一定區(qū)域內(nèi)的十個具體位置。

解決思路:地圖拖動會觸發(fā)dragend事件,我們監(jiān)聽這個事件,并實時獲取拖動后的地圖的中心點位置,然后調(diào)用相關(guān)api由中心點位置來獲取附近的具體位置,中心點的標(biāo)注通過定位的方式固定到地圖中心。

//在HTML頁面
//需要兩個容器,一個裝地圖,一個裝中心點標(biāo)注
<div className="map">
     <div className="baiduMap" id="container" />
     <div className="h5-icon-gps-address" />
</div>
//中心標(biāo)注的樣式
.map{
    position: relative;
    .baiduMap{
         height: 270px;
         width: 100%;
    }
   .h5-icon-gps-address{
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translateX(-50%) translateY(-100%);
        font-size: 28px;
    }
 }
//Webview.js百度地圖獲取地理位置
getCurrentPosition(){
        return new Promise(function(resolve, reject){
            let geolocation = new BMap.Geolocation();
            geolocation.getCurrentPosition(function(r){
                //關(guān)于狀態(tài)碼
                //BMAP_STATUS_SUCCESS    檢索成功。對應(yīng)數(shù)值“0”。
                //BMAP_STATUS_CITY_LIST    城市列表。對應(yīng)數(shù)值“1”。
                //BMAP_STATUS_UNKNOWN_LOCATION    位置結(jié)果未知。對應(yīng)數(shù)值“2”。
                //BMAP_STATUS_UNKNOWN_ROUTE    導(dǎo)航結(jié)果未知。對應(yīng)數(shù)值“3”。
                //BMAP_STATUS_INVALID_KEY    非法密鑰。對應(yīng)數(shù)值“4”。
                //BMAP_STATUS_INVALID_REQUEST    非法請求。對應(yīng)數(shù)值“5”。
                //BMAP_STATUS_PERMISSION_DENIED    沒有權(quán)限。對應(yīng)數(shù)值“6”。(自 1.1 新增)
                //BMAP_STATUS_SERVICE_UNAVAILABLE    服務(wù)不可用。對應(yīng)數(shù)值“7”。(自 1.1 新增)
                //BMAP_STATUS_TIMEOUT    超時。對應(yīng)數(shù)值“8”。(自 1.1 新增)
                if(this.getStatus() === BMAP_STATUS_SUCCESS){
                    //精度為undefined 代表用戶拒絕授權(quán)地理位置
                    if(r.accuracy === null){
                        reject({
                            type: '1', //授權(quán)失敗
                            errorMessage: i18n.t('userRefuseRight'),
                        });
                    }
                    let myGeo = new BMap.Geocoder();
                    myGeo.getLocation(new BMap.Point(r.longitude, r.latitude), (result) => {
                        if(result){    
                            resolve({
                                longitude: r.longitude,
                                latitude: r.latitude,
                                address: result.address,
                            });
                        }else{
                            reject({
                                type: '2', //詳細地址解析失敗
                                errorMessage: i18n.t('addressResolveFail'),
                            });
                        }
                    });
                }else{
                    reject({
                        type: '0', //百度地圖api調(diào)用出錯
                        errorMessage: i18n.t('getPositionFail'),
                    });
                }
            }, function(err){
                //沒有網(wǎng)絡(luò)的返回值
                if(err.errorCode === 3){
                    reject({
                        type: '3', //超時,沒有網(wǎng)絡(luò)
                        errorMessage: i18n.t('positionOvertime'),
                    });
                }else{
                    reject({
                        type: '4', //未知的錯誤
                        errorMessage: 'unknown error',
                    });
                }
            });
        });
    }
getMap = () => {
        Webview.getCurrentPosition().then(action((position)=>{
            let map = new BMap.Map('container');
                let point = new BMap.Point(position.longitude, position.latitude);
                map.centerAndZoom(point, 17);
                this.getMovedArea(point, map);
            //向地圖添加控件(anchor: 位置;type:類型)
            let top_right_navigation = new BMap.NavigationControl({
                anchor: BMAP_ANCHOR_BOTTOM_RIGHT,
                type: BMAP_NAVIGATION_CONTROL_ZOOM
            });
            map.addControl(top_right_navigation);

            map.addEventListener('dragend', ()=>{
                let center = map.getCenter();
                let Point = new BMap.Point(center.lng, center.lat);
                this.getMovedArea(Point, map);
            });
        }));
    }

    getMovedArea = (Point, map) => {
        // 創(chuàng)建地理編碼實例
        let myGeo = new BMap.Geocoder();
        // 根據(jù)坐標(biāo)得到地址描述
        myGeo.getLocation(Point, (result)=>{
            if (result){
                let surroundingAddress = _.map(result.surroundingPois, 'title');
                let options = {
                    onSearchComplete: (results)=>{
                        if (local.getStatus() === BMAP_STATUS_SUCCESS){
                            for (var i = 0; i < results.getCurrentNumPois(); i ++){
                                this.moveAddress.push({
                                    title: results.getPoi(i).title,
                                    address: results.getPoi(i).address,
                                    point: results.getPoi(i).point,
                                });
                            }
                        }
                    }
                };
                let local = new BMap.LocalSearch(map, options);
                local.searchNearby(surroundingAddress[0] || result.address, Point, 3000);
            }
        });
    }

效果二:
根據(jù)關(guān)鍵字搜索具體地址的功能,不需要在地圖上顯示。

解決思路:我們需要利用百度地圖的關(guān)鍵字搜索功能,我們給input 框注冊onChange事件,來實時獲取用戶輸入的字符,將字符作為關(guān)鍵字傳給search方法中。

//HTML中寫一個輸入框
<input type="text"
      placeholder={i18n.t('authorization.pleaseSearch')}
      value={store.searchAddressKey}
      onChange={store.handleChange} />
@action
handleChange = (e) => {
        this.searchAddressKey = e.target.value;
        let point = new BMap.Point(gpsMapStore.longitude, gpsMapStore.latitude);
        let options = {
            onSearchComplete: action((results)=>{
                this.searchedAddressList = [];
                if (local.getStatus() === BMAP_STATUS_SUCCESS){
                    for (var i = 0; i < results.getCurrentNumPois(); i ++){
                        this.searchedAddressList.push({
                            title: results.getPoi(i).title,
                            address: results.getPoi(i).address,
                            point: results.getPoi(i).point,
                        });
                    }
                    if(!this.searchAddressKey){
                        this.searchedAddressList = [];
                    }
                }
            })
        };
        let local = new BMap.LocalSearch(point, options);
        local.search(e.target.value);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 因為要做一個地圖操作的項目,需要用到這個地圖庫,但是查詢官方API麻煩,而且這個地圖框架的API做的用起來確實太麻...
    虛幻的銹色閱讀 34,253評論 1 15
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,161評論 4 61
  • 很多賣家朋友,都已為,做淘寶就是把寶貝上架上去,然后坐等訪客進門就可以了,其實,不單是很多C店如此,前幾天認識的一...
    你也會偶爾想我嗎閱讀 946評論 0 7
  • 按照目前的發(fā)展態(tài)勢,我國在未來十年將成為經(jīng)濟收入靠前的國家行列。國民GDP上漲,也預(yù)示著環(huán)境污染可能會有加重的趨勢...
    貝瑪特丨聚業(yè)宸閱讀 344評論 0 0
  • 運動打卡第48天 自主訓(xùn)練:熱身走10分鐘,器械20分鐘,橢圓機30分鐘 大汗淋漓了,自在舒服了,練過后。 “我們...
    源依閱讀 147評論 0 0

友情鏈接更多精彩內(nèi)容