最近一直在优化软件的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云的中间服务。
(。_°☆ ╲ (- – ).. 扯什么犊子呢..
说白了就是能看见周围用同一款软件人的位置.. 而且这个数据由百度维护.. 很大程度降低了服务器的压力.. 不然服务器还要提供数据.. 算用户之间距离什么的.. 这些都可以交给雷达完成..
1. 基本使用
基础的实现其实是非常简单的.. 无非是去取回信息.. 调用雷达就可以取得周围的用户的list.. 然后遍历list获取你想要的用户就行了..
1.首先你需要在你的API控制台注册你的雷达..
注册雷达
2.初始化并注入你的信息
RadarSearchManager mManager = RadarSearchManager.getInstance();
mManager.addNearbyInfoListener(this);
mManager.setUserID(userID);
其中你需要让自己的类实现
RadarSearchListener, RadarUploadInfoCallback
一个是上传完成后的监听.. 一个是检索雷达信息后的回调
3.开始上传
上传分为单次上传和多次上传.. 单次上传了解一下就行了.. 估计没什么公司有这需求.. 就传一次不能保证雷达里有你实时的位置不就没意义了么..
单次上传
RadarUploadInfo info = new RadarUploadInfo();
info.comments = “用户备注信息”;
info.pt = pt;
mManager.uploadInfoRequest(info);
然后在RadarUploadInfoCallback重写的方法里对上传后的事件做处理
@Override
public void onGetUploadState(RadarSearchError error) {
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
定时重复上传
mManager.startUploadAuto(this, 5000);
@Override
public RadarUploadInfo OnUploadInfoCallback() {
RadarUploadInfo info = new RadarUploadInfo();
info.comments = “用户备注信息”;
info.pt = pt;
return info;
}
这样数据就能实时上传了 ..
4.取回信息
有存当然有取.. 取的方法其实很简单… 但是此处有元古巨坑.. 后面会讲到及处理方法..
先看文档里的做法..
RadarNearbySearchOption option = new RadarNearbySearchOption()
.centerPt(pt)
.pageNum(pageIndex)
.radius(2000);
mManager.nearbyInfoRequest(option);
@Override
public void onGetNearbyInfoList(RadarNearbyResult result,
RadarSearchError error) {
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
你会很开心的发现回调中result里有个list.. 拿出来看一下变量.. list里的对象有userID.. 有pt.. 在测试时可能就天真得以为已经大功告成了.. 实际上= =; 我很抱歉..
5.打完收工
先把流程说完.. 最后需要打完收工..
mManager.removeNearbyInfoListener(this);
mManager.clearUserInfo();
mManager.destroy();
mManager = null;
至此.. 官方给出的文档流程已经走完了.. 然后就可以用了.. 如果你结合了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是由远及近.. 反过来了.. 所以使用起来非常要注意
妈呀.. 你有隐藏属性就算了… 隐藏属性还自带混淆技能的啊… 可怕.. 所以用起来要倍加小心..
当然这才取回了第一页..
你要在回调中..
@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
经过这样一搞.. 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
地理编码的使用还是很简单的…

转自:http://blog.youkuaiyun.com/jupiterxx/article/details/53208436