最近一直在优化软件的bug.. 然后后面可能又要大改.. 所以趁这两天有时间赶紧码两篇博文..=.=
地图功能可以说是现在APP中最常用的功能… 呃.. 之一.. 不管是电商,社交,o2o,b2c,p2p,锟斤拷,烫烫烫都需要用地图来辅助..
博客里基本的地图实现已经很多了.. 定位(LBS) .. marker(大头针) .. 弹出窗覆盖物(InfoWindow)..等的基础解决方案已经很多.. 如果有从0开始使用百度地图的哥们我建议你先去看我男神洪神写的
Android 百度地图 SDK v3.0.0
注意其中定位的LocationClientOption中 option.setCoorType(“bd09ll”); 是必须要添加的.. 所有的定位都要基于这一TYPE… 不然定位是很不准的.. 相差近一公里.. 至于为什么有偏移=.= 据说是出于国家安全考虑… 我跟您说… 我党可是牛逼了.. 据说啊…咱们的地图位置.. 等会… 我拿个忄
百度地图的API到现在仍然没有太大变化.. 实现基础的功能依然没有问题.. 好了大家去看他写的吧.. 我走了.. 哎哎哎.. 把刀放下!! 都是同行那么暴躁干嘛..
先说官方的解释吧.. 周边雷达功能,是面向移动端开发者的一套SDK功能接口。同步支持Android和iOS端。它的本质是一个连接百度LBS开放平台前端SDK产品和后端LBS云的中间服务。 (。_°☆ ╲ (- – ).. 扯什么犊子呢..
说白了就是能看见周围用同一款软件人的位置.. 而且这个数据由百度维护.. 很大程度降低了服务器的压力.. 不然服务器还要提供数据.. 算用户之间距离什么的.. 这些都可以交给雷达完成..
基础的实现其实是非常简单的.. 无非是去取回信息.. 调用雷达就可以取得周围的用户的list.. 然后遍历list获取你想要的用户就行了..
注册雷达
其中你需要让自己的类实现 RadarSearchListener, RadarUploadInfoCallback
一个是上传完成后的监听.. 一个是检索雷达信息后的回调
上传分为单次上传和多次上传.. 单次上传了解一下就行了.. 估计没什么公司有这需求.. 就传一次不能保证雷达里有你实时的位置不就没意义了么..
这样数据就能实时上传了 ..
有存当然有取.. 取的方法其实很简单… 但是此处有元古巨坑.. 后面会讲到及处理方法.. 先看文档里的做法..
//构造请求参数,其中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(); } }你会很开心的发现回调中result里有个list.. 拿出来看一下变量.. list里的对象有userID.. 有pt.. 在测试时可能就天真得以为已经大功告成了.. 实际上= =; 我很抱歉..
先把流程说完.. 最后需要打完收工..
//移除监听 mManager.removeNearbyInfoListener(this); //清除用户信息 //如果你希望雷达里保留用户最后的位置.. 可以不做这一步.. mManager.clearUserInfo(); //释放资源 mManager.destroy(); mManager = null;至此.. 官方给出的文档流程已经走完了.. 然后就可以用了.. 如果你结合了marker的话就已经可以看到周围同事的位置了.. 然后性♂奋的拿着成品去给产品经理.. 期望升职加薪.. 出任总经理当上CEO迎娶白富美.. ( ̄ε(# ̄)☆╰╮( ̄▽ ̄///) 憋做梦了..
百度很不厚道的一点就是在上述第四步上遗漏了解释… 实际上.. 取回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是由远及近.. 反过来了.. 所以使用起来非常要注意妈呀.. 你有隐藏属性就算了… 隐藏属性还自带混淆技能的啊… 可怕.. 所以用起来要倍加小心..
当然这才取回了第一页.. 你要在回调中..
@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);//重新去获取当前页数据 } }经过这样一搞.. 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) { //没有找到检索结果 } //获取反向地理编码结果 } };地理编码的使用还是很简单的…