关闭

百度地图 雷达/地理编码 功能使用

标签: 地图百度地图android界面ui
180人阅读 评论(0) 收藏 举报
分类:

最近一直在优化软件的bug.. 然后后面可能又要大改.. 所以趁这两天有时间赶紧码两篇博文..=.=

地图功能可以说是现在APP中最常用的功能… 呃.. 之一.. 
不管是电商,社交,o2o,b2c,p2p,锟斤拷,烫烫烫都需要用地图来辅助..

博客里基本的地图实现已经很多了.. 定位(LBS) .. marker(大头针) .. 弹出窗覆盖物(InfoWindow)..等的基础解决方案已经很多.. 如果有从0开始使用百度地图的哥们我建议你先去看我男神洪神写的

Android 百度地图 SDK v3.0.0

注意其中定位的LocationClientOption中 option.setCoorType(“bd09ll”); 是必须要添加的.. 所有的定位都要基于这一TYPE… 不然定位是很不准的.. 相差近一公里.. 至于为什么有偏移=.= 据说是出于国家安全考虑… 我跟您说… 我党可是牛逼了.. 据说啊…咱们的地图位置.. 等会… 我拿个忄

百度地图的API到现在仍然没有太大变化.. 实现基础的功能依然没有问题.. 好了大家去看他写的吧.. 我走了.. 哎哎哎.. 把刀放下!! 都是同行那么暴躁干嘛..

地图雷达

先说官方的解释吧.. 
周边雷达功能,是面向移动端开发者的一套SDK功能接口。同步支持AndroidiOS端。它的本质是一个连接百度LBS开放平台前端SDK产品和后端LBS云的中间服务。 
(。_°☆ ╲ (- – ).. 扯什么犊子呢..

说白了就是能看见周围用同一款软件人的位置.. 而且这个数据由百度维护.. 很大程度降低了服务器的压力.. 不然服务器还要提供数据.. 算用户之间距离什么的.. 这些都可以交给雷达完成..

1. 基本使用

基础的实现其实是非常简单的.. 无非是去取回信息.. 调用雷达就可以取得周围的用户的list.. 然后遍历list获取你想要的用户就行了..

1.首先你需要在你的API控制台注册你的雷达..

注册雷达

2.初始化并注入你的信息

RadarSearchManager mManager = RadarSearchManager.getInstance();//初始化

//设置信息
//周边雷达设置监听
mManager.addNearbyInfoListener(this);
//周边雷达设置用户身份标识,id为空默认是设备标识
mManager.setUserID(userID); //注意ID是一定要设置的.. 而且必须是String类型..如果不设置拿回来的ID是设备号(我也不知道是啥).. 反正跟server上的肯定对不上号..
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

其中你需要让自己的类实现 
RadarSearchListener, RadarUploadInfoCallback

一个是上传完成后的监听.. 一个是检索雷达信息后的回调

3.开始上传

上传分为单次上传和多次上传.. 单次上传了解一下就行了.. 估计没什么公司有这需求.. 就传一次不能保证雷达里有你实时的位置不就没意义了么..

单次上传

//上传位置
RadarUploadInfo info = new RadarUploadInfo();
info.comments = “用户备注信息”;
info.pt = pt; //pt里封装了你的经纬度.. 可以从LBS(百度定位)的回调里获取..
mManager.uploadInfoRequest(info);
然后在RadarUploadInfoCallback重写的方法里对上传后的事件做处理
@Override
public void onGetUploadState(RadarSearchError error) {
    // TODO Auto-generated method stub
    if (error == RadarSearchError.RADAR_NO_ERROR) {
        //上传成功
        Toast.makeText(RadarDemo.this, "单次上传位置成功", Toast.LENGTH_LONG)
                .show();
    } else {
        //上传失败
        Toast.makeText(RadarDemo.this, "单次上传位置失败", Toast.LENGTH_LONG)
                .show();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

定时重复上传

//设置自动上传的callback和时间间隔(单位毫秒)
mManager.startUploadAuto(this, 5000);
//实现上传callback,自动上传 
//自动上传这里直接在接口里设置好就行了... pt的经纬度数据可以由OnLocationListener里动态的去修改提供
@Override
public RadarUploadInfo OnUploadInfoCallback() {
    // TODO Auto-generated method stub
    RadarUploadInfo info = new RadarUploadInfo();
    info.comments = “用户备注信息”;
    info.pt = pt;
    return info;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这样数据就能实时上传了 ..

4.取回信息

有存当然有取.. 取的方法其实很简单… 但是此处有元古巨坑.. 后面会讲到及处理方法.. 
先看文档里的做法..

//构造请求参数,其中centerPt是自己的位置坐标
RadarNearbySearchOption option = new RadarNearbySearchOption()
.centerPt(pt)//中心点
.pageNum(pageIndex) //页码...? 这是啥 此处大坑
.radius(2000); //半径.. 不用说了
//发起查询请求
mManager.nearbyInfoRequest(option);
@Override
public void onGetNearbyInfoList(RadarNearbyResult result,
        RadarSearchError error) {
    // TODO Auto-generated method stub
    if (error == RadarSearchError.RADAR_NO_ERROR) {
        Toast.makeText(RadarDemo.this, "查询周边成功", Toast.LENGTH_LONG)
            .show();
        //获取成功,处理数据
    } else {
        //获取失败
        Toast.makeText(RadarDemo.this, "查询周边失败", Toast.LENGTH_LONG)
            .show();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

你会很开心的发现回调中result里有个list.. 拿出来看一下变量.. list里的对象有userID.. 有pt.. 在测试时可能就天真得以为已经大功告成了.. 实际上= =; 我很抱歉..

5.打完收工

先把流程说完.. 最后需要打完收工..

//移除监听
mManager.removeNearbyInfoListener(this);
//清除用户信息
//如果你希望雷达里保留用户最后的位置.. 可以不做这一步..
mManager.clearUserInfo();
//释放资源
mManager.destroy();
mManager = null;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

至此.. 官方给出的文档流程已经走完了.. 然后就可以用了.. 如果你结合了marker的话就已经可以看到周围同事的位置了.. 然后性♂奋的拿着成品去给产品经理.. 期望升职加薪.. 出任总经理当上CEO迎娶白富美.. 
( ̄ε(# ̄)☆╰╮( ̄▽ ̄///) 憋做梦了..

2. 元古巨坑

百度很不厚道的一点就是在上述第四步上遗漏了解释… 实际上.. 取回list是分页的.. 
其实讲道理来说这样做是合理的.. 不然一下几万条数据直接取回来…万一炸了怎么办… 所以可以根据需求去取..

但是问题又来了.. 分页咋分的.. 最大页码在哪.. 一页有几条?

实际上这里还需要继续添加参数..

 //构造请求参数,其中centerPt是自己的位置坐标
RadarNearbySearchOption option = new RadarNearbySearchOption()
.centerPt(pt)//中心点
.pageNum(pageIndex) //页码...? 这是啥 此处大坑
.radius(2000); //半径.. 不用说了
.pageCapacity(50) //一页容量(1号坑:而且经过亲测.. 一页容量最大为50 .. 如果你写了>50的容量的话.. 他就按默认容量10取回了.. 坑的不行)
.sortType(RadarNearbySearchSortType.distance_from_far_to_near) //排序类型.. 按距离和按最后上传时间排序都行.. 
2号坑:而且在我用的百度地图v4.0.0里这个参数是有问题的... distance_from_far_to_near反而是由近及远.. distance_from_near_to_far是由远及近.. 反过来了.. 所以使用起来非常要注意
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

妈呀.. 你有隐藏属性就算了… 隐藏属性还自带混淆技能的啊… 可怕.. 所以用起来要倍加小心..

当然这才取回了第一页.. 
你要在回调中..

@Override
    public void onGetNearbyInfoList(RadarNearbyResult radarNearbyResult, RadarSearchError radarSearchError) {

        if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) {
            if (radarNearbyResult.pageIndex < radarNearbyResult.pageNum -1 ) {//如果当前页码还没到最后一页的话
                radarInfos.addAll(radarNearbyResult.infoList);//数据保存起来

                option.pageNum(radarNearbyResult.pageIndex + 1);//页码加一

                mManager.nearbyInfoRequest(option);//再次发起请求




            } else { //如果已经达到最后一页
                radarInfos.addAll(radarNearbyResult.infoList);//保存数据
                addInfosOverlay(radarInfos);// 添加图层

            }

        } else {//如果获取失败
            mManager.nearbyInfoRequest(option);//重新去获取当前页数据



        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

经过这样一搞.. bug总算是修复了.. 终于不会因为用户多过十个就看不到人了.. 不过重复请求几十次(2000人的话) .. 这样是很卡的.. 那只能用progressbar让用户等等了.. 毕竟数据不是我们自己维护的.. 没办法啊TAT

至此百度地图雷达功能算是完善了.. 然而我被经理骂了一顿… 你看看人家IOS怎么没bug… 妈呀TAT IOS真是一下取回几万条的么… IOS的哥们都不知道有分页这回事毛事没有哎…

地理编码

地理编码功能分为正向编码和反向编码.. 说白了.. 就是你要拿地址查坐标还是拿坐标查地址..

正向地理编码官网上已经写得很清楚了.. 也没啥问题.. 参考

地理编码

而反向地理编码的使用也是大同小异.. 只需要在


geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(new LatLng(latitude, longtitude))); //把经纬度传进去开始查找

OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {  
    public void onGetGeoCodeResult(GeoCodeResult result) {  
        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {  
            //没有检索到结果  
        }  else {
            Toast.showToast(getActivity(),result.getAddress()); //把地址吐司出来
            //获取地理编码结果  你就可以做爱做的事情了=.= 嘿嘿嘿 
        }

    }  

    @Override  
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {  
        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {  
            //没有找到检索结果  
        }  
        //获取反向地理编码结果  
    }  
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

地理编码的使用还是很简单的…

效果图

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3728次
    • 积分:102
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:12篇
    • 译文:0篇
    • 评论:0条