调用百度地图API,实现两种效果

效果一:
地图拖动,中心定位标注不动,准确实时获取地图拖动后的中心点位置,并获取中心点位置一定区域内的十个具体位置。

解决思路:地图拖动会触发dragend事件,我们监听这个事件,并实时获取拖动后的地图的中心点位置,然后调用相关api由中心点位置来获取附近的具体位置,中心点的标注通过定位的方式固定到地图中心。

//在HTML页面
//需要两个容器,一个装地图,一个装中心点标注
<div className="map">
     <div className="baiduMap" id="container" />
     <div className="h5-icon-gps-address" />
</div>
//中心标注的样式
.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){
                //关于状态码
                //BMAP_STATUS_SUCCESS    检索成功。对应数值“0”。
                //BMAP_STATUS_CITY_LIST    城市列表。对应数值“1”。
                //BMAP_STATUS_UNKNOWN_LOCATION    位置结果未知。对应数值“2”。
                //BMAP_STATUS_UNKNOWN_ROUTE    导航结果未知。对应数值“3”。
                //BMAP_STATUS_INVALID_KEY    非法密钥。对应数值“4”。
                //BMAP_STATUS_INVALID_REQUEST    非法请求。对应数值“5”。
                //BMAP_STATUS_PERMISSION_DENIED    没有权限。对应数值“6”。(自 1.1 新增)
                //BMAP_STATUS_SERVICE_UNAVAILABLE    服务不可用。对应数值“7”。(自 1.1 新增)
                //BMAP_STATUS_TIMEOUT    超时。对应数值“8”。(自 1.1 新增)
                if(this.getStatus() === BMAP_STATUS_SUCCESS){
                    //精度为undefined 代表用户拒绝授权地理位置
                    if(r.accuracy === null){
                        reject({
                            type: '1', //授权失败
                            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调用出错
                        errorMessage: i18n.t('getPositionFail'),
                    });
                }
            }, function(err){
                //没有网络的返回值
                if(err.errorCode === 3){
                    reject({
                        type: '3', //超时,没有网络
                        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) => {
        // 创建地理编码实例
        let myGeo = new BMap.Geocoder();
        // 根据坐标得到地址描述
        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);
            }
        });
    }

效果二:
根据关键字搜索具体地址的功能,不需要在地图上显示。

解决思路:我们需要利用百度地图的关键字搜索功能,我们给input 框注册onChange事件,来实时获取用户输入的字符,将字符作为关键字传给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);
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容

  • 因为要做一个地图操作的项目,需要用到这个地图库,但是查询官方API麻烦,而且这个地图框架的API做的用起来确实太麻...
    虚幻的锈色阅读 33,890评论 1 15
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,102评论 4 62
  • 很多卖家朋友,都已为,做淘宝就是把宝贝上架上去,然后坐等访客进门就可以了,其实,不单是很多C店如此,前几天认识的一...
    你也会偶尔想我吗阅读 885评论 0 7
  • 按照目前的发展态势,我国在未来十年将成为经济收入靠前的国家行列。国民GDP上涨,也预示着环境污染可能会有加重的趋势...
    贝玛特丨聚业宸阅读 278评论 0 0
  • 运动打卡第48天 自主训练:热身走10分钟,器械20分钟,椭圆机30分钟 大汗淋漓了,自在舒服了,练过后。 “我们...
    源依阅读 130评论 0 0