Android学习笔记之使用百度地图实现Poi搜索
PS:装个系统装了一天.心力憔悴.感觉不会再爱了.
学习内容:
1.使用百度Map实现Poi搜索.
2.短串分享
3.在线建议查询
百度地图的研究也算是过半了.能够实现定位,实现相关信息的搜索,实现地图控制这也就算是掌握了一大部分了.这次主要是说说如何去实现poi搜索.那么什么是Poi.
Poi:poi中文翻译为兴趣点.捞干的说其实就是周边的一些ktv,酒店,餐馆,理发店等等都是一个poi.在实现了基础定位的前提后,去搜索附近的poi.这样就可以完成一些其他事情.比如说订一份外卖,预定一个房间等等.这些都是基于poi搜索才能够实现的.
百度SDK提供了三种Poi搜索:周边搜索,区域搜索,城市内搜索(com.baidu.mapapi.search.poi).
搜索是基于上面的api,实现Poi搜索还是需要分几个过程的.首先是需要实例化对象PoiSearch.
private PoiSearch poiSearch= PoiSearch.newInstance();
然后需要为PoiSearch设置上搜索的方式.方式就是上面所说的三种.三种搜索方式都在下面进行了列举,我们可以看到百度地图对检索的结果进行了分页处理,因此在显示的时候我们需要制定分页的页数以及每页的数量.
/**
* 城市内搜索,直接根据输入框的内容去实现Poi搜索.
*/
private void citySearch(int page) {
// 设置检索参数
PoiCitySearchOption citySearchOption = new PoiCitySearchOption();
citySearchOption.city(editCityEt.getText().toString());// 城市
citySearchOption.keyword(editSearchKeyEt.getText().toString());// 关键字
citySearchOption.pageCapacity(15);// 默认每页10条
citySearchOption.pageNum(page);// 分页编号
// 为PoiSearch设置搜索方式.
poiSearch.searchInCity(citySearchOption);
} /**
* 范围检索,范围搜索需要制定坐标.以矩形的方式进行范围搜索.
*/
private void boundSearch(int page) {
PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption();
LatLng southwest = new LatLng(latitude - 0.01, longitude - 0.012);// 西南
LatLng northeast = new LatLng(latitude + 0.01, longitude + 0.012);// 东北
LatLngBounds bounds = new LatLngBounds.Builder().include(southwest)
.include(northeast).build();// 得到一个地理范围对象
boundSearchOption.bound(bounds);// 设置poi检索范围
boundSearchOption.keyword(editSearchKeyEt.getText().toString());// 检索关键字
boundSearchOption.pageNum(page);
poiSearch.searchInBound(boundSearchOption);// 发起poi范围检索请求
} /**
* 附近检索,范围搜索需要指定圆心.以圆形的方式进行搜索.
*/
private void nearbySearch(int page) {
PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();
nearbySearchOption.location(new LatLng(latitude, longitude));
nearbySearchOption.keyword(editSearchKeyEt.getText().toString());
nearbySearchOption.radius(1000);// 检索半径,单位是米
nearbySearchOption.pageNum(page);
poiSearch.searchNearby(nearbySearchOption);// 发起附近检索请求
}
通过上面的方式我们就可以为PoiSearch制定搜索的方式.指定了搜索模式之后我们就需要指定检索后的相关监听.监听的设置通过api内部的OnGetPoiSearchResultListener这个回调接口去完成.这个接口接受PoiResult作为参数,当完成搜索后,回调当前这个接口,就可以去获取我们的搜索结果了以下就是实现Poi查找的结果监听.
OnGetPoiSearchResultListener poiSearchListener = new OnGetPoiSearchResultListener() {
// 获取poiResult
@Override
public void onGetPoiResult(PoiResult poiResult) {
if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
bdMap.clear();
MyPoiOverlay poiOverlay = new MyPoiOverlay(bdMap); //实例化poiOverlay对象.
poiOverlay.setData(poiResult); //设置poiOverlay数据.
bdMap.setOnMarkerClickListener(poiOverlay);//当标志物被点击时监听设置.
poiOverlay.addToMap();//将所有的poi添加到Map上.
poiOverlay.zoomToSpan();
totalPage = poiResult.getTotalPageNum();
Toast.makeText(
PoiSearchActivity.this,
"总共查到" + poiResult.getTotalPoiNum() + "个兴趣点,分为"
+ totalPage + "页", Toast.LENGTH_SHORT).show();
}
}
// 当点击覆盖物的时候,查询详细的数据信息,作为回调返回数据信息
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
}
};
这里我们可以看到.这个回调接口内部封装了两个方法.一个是对poi结果的查询,一个是对poi详细结果的查询.poi详细结果包含当前这个兴趣点的大部分信息(比如poi的名称,地理位置,坐标数据等等).这个是详细结果查询结果的获取.详细结果的查询是基于PoiResult的.因此才会封装两个函数.
poi详细结果查询则需要传递PoiDetailResult对象,作为接口回到的参数.这个对象通过下面的方式进行实例化,这里是指定了在点击的poi的时候去触发poi详细查询事件.这样就可以完成在poi查询的基础上实现poi更多信息的查询.
class MyPoiOverlay extends PoiOverlay {
public MyPoiOverlay(BaiduMap arg0) {
super(arg0);
}
// 检索Poi详细信息.获取PoiOverlay
@Override
public boolean onPoiClick(int arg0) {
super.onPoiClick(arg0);
PoiInfo poiInfo = getPoiResult().getAllPoi().get(arg0);
poiSearch.searchPoiDetail(new PoiDetailSearchOption()
.poiUid(poiInfo.uid));
return true;
}
}
这里通过使用PoiOverlay类内部提供的函数,可以讲我们获取的所有的Overlay直接添加到地图上.这样非常的方便.我们就不用将一组组的查询数据保存在List<T>列表中,然后通过遍历的方式将数据放置在Map上了.只需要通过使用PoiOverlay中的addToMap()函数直接就可以完成这个操作.如果我们想移除这些Overlay只需要调用removeFromMap()就可以全部移除.这样就使得搜索结果的显示变得更加的方便.
最后再说一些相关的小细节问题.就是关于Poi的问题.拿我们最熟悉的美团外卖来说吧.它能够定位到很多的poi,不仅仅是独立的店铺还是在商厦内部的店铺都能够精准的定位到.独立在外部的店铺很容易就搜索到.而商厦内部的店铺想要被定位到则需要店铺去百度地图中的百度地图商户中心去申请,填写店铺信息,申请成功之后这些店铺就自然而然的可以被搜索到了.如果没有去申请,那么在商厦内部的一些店铺是无法定位的.关于poi就说这么多吧.
2.短串共享
短串共享:表示定位到的地理位置以url的形式进行展示.这个url被百度优化成了一个短的url串,就被成为短串.这个短串我们可以通过短信,邮箱等方式去分享.
短串共享的实现还是非常的简单的.
首先需要实例化短串共享对象.
private ShareUrlSearch shareUrlSearch = ShareUrlSearch.newInstance();
然后设置短串检索监听.
/**
* 短串检索监听器
*/
OnGetShareUrlResultListener shareUrlResultListener = new OnGetShareUrlResultListener() {
//poi详情分享url
@Override
public void onGetPoiDetailShareUrlResult(ShareUrlResult arg0) { Toast.makeText(PoiSearchActivity.this, "详细url分享:"+arg0.toString(), Toast.LENGTH_SHORT).show();
}
//请求位置信息分享url
@Override
public void onGetLocationShareUrlResult(ShareUrlResult arg0) { Toast.makeText(PoiSearchActivity.this, "url分享:"+arg0.toString(), Toast.LENGTH_SHORT).show();
}
};
设置了检索监听之后需要发送请求,才能够实现短串的数据信息分享.
shareUrlSearch.requestLocationShareUrl(new LocationShareURLOption().location(poiInfo.location).name("共享点名称").snippet("123"));
shareUrlSearch.requestPoiDetailShareUrl(new PoiDetailShareURLOption().poiUid(poiInfo.uid));
3.在线建议查询.
看了某博主的博客,说在线建议查询和短串分享大同小异,代码就直接略了.于是乎自己又上网一顿搜.确实倒是那么回事.大同小异,不过还是简单的说一下首先需要实例化对象.
suggestionSearch = SuggestionSearch.newInstance();
suggestionSearch.requestSuggestion(new SuggestionSearchOption().keyword("百度").city("背景")); 发送请求
然后设置相关监听就可以了.
/**
* 在线建议
* */
OnGetSuggestionResultListener suggestionResultListener = new OnGetSuggestionResultListener() { @Override
public void onGetSuggestionResult(SuggestionResult arg0) {
// TODO Auto-generated method stub
Toast.makeText(PoiSearchActivity.this, arg0.toString(), Toast.LENGTH_SHORT).show();
}
};
我认为还是poi搜索是关键.poi检索更多的时候才是我们想要实现的功能.这里的相关监听我都设置的非常的简单,直接使用Toast框去打印.如果有更高的需求我们可以去进行自定义..
最后放一个源代码:http://files.cnblogs.com/files/RGogoing/BDMap.rar
Android学习笔记之使用百度地图实现Poi搜索的更多相关文章
- Android学习笔记之使用百度地图实现路线规划+公交信息检索
PS:装了个deepin,感觉真的很高大上. 学习内容: 1.公交信息检索 2.路线规划 关于百度地图的开发也就这么多了.重要的部分也就那么些.原本打算搞到poi搜索就算了,不过看到了这两个方面还 ...
- Android学习笔记之使用百度地图实现地图控制
PS:吾之荣耀,离别已久. 学习内容: 1.实现地图控制. 2.百度地图开发的一些细节 1.实现地图控制: 这一篇主要写在百度地图上添加一些其他控制.上一篇书写了覆盖物的添加,地理编码和反 ...
- android菜鸟学习笔记30----Android使用百度地图API(一)准备工作及在应用中显示地图
1.准备工作: 百度地图API是免费开放的,但是需要申请API Key: 1)先注册一个百度开发者帐号 2)进入百度开放服务平台http://developer.baidu.com/ 3)进入LBS云 ...
- android菜鸟学习笔记31----Android使用百度地图API(二)获取地理位置及地图控制器的简单使用
1.获取当前地理位置: Android中提供了一个LocationManager的类,用于管理地理位置.不能通过构造函数获取该类的实例,而是通过Context的getSystemService(): ...
- 【转】Pro Android学习笔记(十四):用户界面和控制(2):Text类控制
目录(?)[-] TextView 例子1在XML中设置autoLink属性 例子2在代码中设置autoLink属性 EditText AutoCompleteTextView MultiAutoCo ...
- udacity android 学习笔记: lesson 4 part a
udacity android 学习笔记: lesson 4 part a 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...
- Android学习笔记进阶之在图片上涂鸦(能清屏)
Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...
- android学习笔记36——使用原始XML文件
XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...
随机推荐
- c++ const放置的位置
标准中int const a 与 const int a 是完全等价的.正因为如此,会有很多各种不同的风格,同样的还有"*是跟类型还是变量?",比如char* p与 char *p ...
- iOS相册、相机、通讯录权限获取
iOS相册.相机.通讯录权限获取 说明 这是本人写的一个工具,用以便利的处理各种权限获取的操作,目前提供相册.照相机.通讯录的权限获取操作,参考了 http://www.jianshu.com/p/a ...
- 通过反射获取Android通知栏高度
public static int getStatusBarHeight(Context context){ Class<?> c = null; Object obj = null; F ...
- nginx+tomcat+java部署总结
昨天部署了一下nginx+tomcat+java出现了很多问题,以下为整理总结. 使用了两种部署方式,一种是源码部署,一种是war部署. java源码部署总结: 环境:nginx+tomcat 部署方 ...
- Java 时间和字符换的处理
/** * * @param timeStr 时间字符串 * @param diff 与起始值差距,单位为毫秒 * @throws ParseException */ public String de ...
- hdu 1845
一看题意就是二分匹配问题,建边是双向的,两个集合都是n个点 这题的图很特殊,每个点都要与三个点相连,在纸上画了六个点的图就感觉此图最大匹配肯定是六,除以2就是原图的匹配了,就感觉这样的图肯定会达到满匹 ...
- Fiddler高级技巧 - 映射路径到本地文件夹
适用场景: 你是前端开发人员,要开发一个小模块,需要用到线上的环境(账号.数据.跨域等),但你又没有权限往线上传文件 你是移动测试人员,需要将一组接口的返回结果替换为另一组,最简单的办法就是使用Fid ...
- 在redis一致性hash(shard)中使用lua脚本的坑
redis 2.8之前的版本,为了实现支持巨量数据缓存或者持久化,一般需要通过redis sharding模式来实现redis集群,普遍大家使用的是twitter开源的Twemproxy. twemp ...
- fio terse输出详解
fio, the flexible IO tester, is a very useful tool for benchmarking IO performance. It has an option ...
- BW CUBE 数据的聚集和压缩
大家都知道,压缩和聚集都是提高bw性能的方法,在新版bw里,压缩名称改成了折叠,聚集放在了滚动菜单里---集合.那么我们在使用这两种方法时需要注意的先创建聚集以后,再进行压缩,因为压缩的过程是把F表的 ...