Android百度地图开发04之POI检索
POI检索
POI~~~ Point of Interest,翻译过来就是“兴趣点”。我们在使用地图的时候,搜索周边的ktv,饭店,或者宾馆的时候,输入关键字,然后地图展示给我们很多个点, 这些点就是我需要的信息。这就是所谓的兴趣点,也就是一个普通的查询,然后结果的反馈罢了。
百度地图SDK提供了三种类型的POI检索:周边检索、区域检索和城市内检索。
还是从API看起。找到com.baidu.mapapi.search.poi程序包:
看到这个包中有一个回调接口,用于接收检索结果;PoiSearch类用于检索请求;PoiResult类表示搜索结果,相比它应该在OnGetPoiSearchResultListener这个接口的某个函数中最为参数~~
最后还有4个xxxOption参数类,分别对应周边检索、城市内检索、区域检索、poi详情检索。
PoiSearch :POI检索接口,是我们应该重点关注的类。
从api中可以看出,此类是一个静态类,构造方法被私有化处理,只能通过newInstance()获得实例。看到它的方法,就发现正好有4个方法对应上面四个检索参数类。
| 名称 | 方法 | 参数 |
| 范围检索 | searchInBound() | PoiBoundSearchOption |
| 城市内检索 | searchInCity() | PoiCitySearchOption |
| 周边检索 | searchInNearby() | PoiNearbySearchOption |
| 详情检索 | searchPoiDetail() | PoiDetailSearchOption |
实际上,详情检索与其他三种类型不算一类,它是在通过其他三种检索类型得到的结果在去查询得到详细的信息。
通过这几个类可以对不同的类型设置检索参数,下面看一下监听接口:
该接口有两个回调函数,一个用于接收返回的poi查询结果,一个用于接收返回的详情查询结果。而结果分别封装在PoiResult和PoiDetailResult这两个类中了。
PoiResult:
从这里可以看出,百度对检索结果进行了分页处理。所以在设置参数的时候,需要设置单页容量和页号。
- // 实例化PoiSearch对象
- poiSearch = PoiSearch.newInstance();
- // 设置检索监听器
- poiSearch.setOnGetPoiSearchResultListener(poiSearchListener);
- /**
- * POI检索监听器
- */
- OnGetPoiSearchResultListener poiSearchListener = new OnGetPoiSearchResultListener() {
- @Override
- public void onGetPoiResult(PoiResult poiResult) {
- if (poiResult == null
- || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果
- Toast.makeText(PoiSearchActivity.this, "未找到结果",
- Toast.LENGTH_LONG).show();
- return;
- }
- if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回
- bdMap.clear();
- MyPoiOverlay poiOverlay = new MyPoiOverlay(bdMap);
- poiOverlay.setData(poiResult);// 设置POI数据
- bdMap.setOnMarkerClickListener(poiOverlay);
- poiOverlay.addToMap();// 将所有的overlay添加到地图上
- poiOverlay.zoomToSpan();
- //
- totalPage = poiResult.getTotalPageNum();// 获取总分页数
- Toast.makeText(
- PoiSearchActivity.this,
- "总共查到" + poiResult.getTotalPoiNum() + "个兴趣点, 分为"
- + totalPage + "页", Toast.LENGTH_SHORT).show();
- }
- }
- /**
- * 城市内搜索
- */
- 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.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);// 发起附近检索请求
- }
通过以上代码,就可以完成三种类型的检索,分组的时候只不过是改一下pageNum()参数。
查询出这一组组的结果之后,可以通过添加覆盖物的方式显示在地图上。但是如果按照之前的添加覆盖物的方式进行添加的话,需要在得到的List<PoiInfo>中得到经纬度数据,然后循环构造出覆盖物对象,添加到地图上。
这样做未尝不可,但是百度提供了更简便的方式给我们。
打开com.baidu.mapapi.overlayutil这个包,看到有一个类用于显示poi的overlay。
从api中得知,该类已经实现了marker点击事件的接口了。我们在接口的毁掉函数onGetPoiResult()中得到了PoiResult对象,然后可以通过setData(PoiResult poiResult)这个方法设置poi数据显示在地图上。
API中说明onPoiClick(int i)可以覆写,这样我们可覆写此方法,当点击底图上覆盖物的时候查询POI详细信息。
- class MyPoiOverlay extends PoiOverlay {
- public MyPoiOverlay(BaiduMap arg0) {
- super(arg0);
- }
- @Override
- public boolean onPoiClick(int arg0) {
- super.onPoiClick(arg0);
- PoiInfo poiInfo = getPoiResult().getAllPoi().get(arg0);
- // 检索poi详细信息
- poiSearch.searchPoiDetail(new PoiDetailSearchOption()
- .poiUid(poiInfo.uid));
- return true;
- }
- }
PoiOverlay从OverlayManager这个类中继承了:
1. addToMap() -- 将所有overlay添加到地图上
2. removeFromMap() -- 将所有overlay从地图上移除
3. zoomToSpan() -- 缩放地图,使所有overlay都在合适的视野内
这样可以在返回poi结果的时候,把poi标注在地图上了:
- if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回
- bdMap.clear();
- MyPoiOverlay poiOverlay = new MyPoiOverlay(bdMap);
- poiOverlay.setData(poiResult);// 设置POI数据
- bdMap.setOnMarkerClickListener(poiOverlay);
- poiOverlay.addToMap();// 将所有的overlay添加到地图上
- poiOverlay.zoomToSpan();
- //
- totalPage = poiResult.getTotalPageNum();// 获取总分页数
- Toast.makeText(
- PoiSearchActivity.this,
- "总共查到" + poiResult.getTotalPoiNum() + "个兴趣点, 分为"
- + totalPage + "页", Toast.LENGTH_SHORT).show();
- }
当我们点击一个覆盖物的时候,去查询详细信息:
- @Override
- public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
- if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) {
- Toast.makeText(PoiSearchActivity.this, "抱歉,未找到结果",
- Toast.LENGTH_SHORT).show();
- } else {// 正常返回结果的时候,此处可以获得很多相关信息
- Toast.makeText(
- PoiSearchActivity.this,
- poiDetailResult.getName() + ": "
- + poiDetailResult.getAddress(),
- Toast.LENGTH_LONG).show();
- }
- }
短串分享
短串分享时指:用户查询得到的地理位置对应到一个url链接地址,百度将这种地址做短了,就俗称短串。我们可以把这个短传通过短信、邮箱或者第三方分享给其他用户,当其他用户可以点击短串可以打开手机上的百度地图客户端或者手机浏览器进行查看。
目前短串分享开放了【poi搜索结果分享】和【反向地理编码结果分享】。
打开com.baidu.mapapi.search.share这个包:
我们看到这个包结构与POI的包结构非常相似。按照之前的经验,可以猜想:ShareUrlSearch是用来发起短串检索请求的;2个
xxxOption()方法用来对不同的请求类型设置参数的;onGetShareUrlResultListener是用来监听返回结果
的;ShareUrlShare就是返回结果的包装类。
- // 实例化共享URL查询接口对象
- shareUrlSearch = ShareUrlSearch.newInstance();
- // 设置共享URL结果监听函数
- shareUrlSearch.setOnGetShareUrlResultListener(shareUrlResultListener);
- /**
- * 短串检索监听器
- */
- OnGetShareUrlResultListener shareUrlResultListener = new OnGetShareUrlResultListener() {
- @Override
- public void onGetPoiDetailShareUrlResult(ShareUrlResult shareUrlResult) {
- if (shareUrlResult.error != SearchResult.ERRORNO.NO_ERROR) {
- Toast.makeText(PoiSearchActivity.this, "抱歉,未搜索到短串",
- Toast.LENGTH_SHORT).show();
- } else {
- Toast.makeText(PoiSearchActivity.this, "poi详情分享url:" + shareUrlResult.getUrl(),
- Toast.LENGTH_LONG).show();
- }
- }
- @Override
- public void onGetLocationShareUrlResult(ShareUrlResult shareUrlResult) {
- if (shareUrlResult.error != SearchResult.ERRORNO.NO_ERROR) {
- Toast.makeText(PoiSearchActivity.this, "抱歉,未搜索到短串",
- Toast.LENGTH_SHORT).show();
- } else {
- Toast.makeText(PoiSearchActivity.this, "请求位置信息分享url:" + shareUrlResult.getUrl(),
- Toast.LENGTH_LONG).show();
- }
- }
- };
发起请求:
- // 请求位置信息分享URL
- shareUrlSearch.requestLocationShareUrl(new LocationShareURLOption()
- .location(poiInfo.location).name("共享点名称").snippet("123"));
- // 共享点位置 --- 共享点名称 --- 通过短URL调起客户端时作为附加信息显示在名称下面
- //请求poi详情分享URL的时候参数xxxOption中只有一个uid
- shareUrlSearch
- .requestPoiDetailShareUrl(new PoiDetailShareURLOption()
- .poiUid(poiInfo.uid));
在线建议查询
指根据关键词查询在线建议词。
实现方式与短串分享大同小异。代码就略了吧~~~
下载:
Android百度地图开发04之POI检索的更多相关文章
- Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图
标签: Android百度地图API Key 分类: Android 百度地图开发(2) 最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地 ...
- android 百度地图开发实例(转载)
因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点androi ...
- [android] 百度地图开发 (两).所在地的城市定位和城市POI搜索
一个. 百度地图城市位置和POI搜索知识 上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定 ...
- [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题
近期做android百度地图,可是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so显示百度地图时总是遇到问题--仅仅显示网格而没有显示地图,网 ...
- Android 百度地图开发之一(Hello BaiDu Map)
之前也接触过百度地图的开发,但那是在网上找的案例或代码,而且是比较老的版本.打算重新学习一下百度地图的开发. 本次使用的百度地图的版本是 Android SDK v3.0.0 本篇文章主要讲述百度地图 ...
- 百度地图总结第二篇--POI检索功能
简单介绍: 眼下百度地图SDK所集成的检索服务包含:POI检索.公交信息查询.线路规划.地理编码.行政区边界数据检索.在线建议查询.短串分享(包含POI搜索结果分享.驾车/公交/骑行/步行路线规划分享 ...
- android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索
最近跟着百度地图API学地图开发,先是学了路径搜索,对于已知坐标的两点进行驾车.公交.步行三种路径的搜索(公交路径运行没效果,待学习中),后来又 学了定位功能,能够获取到自己所在位置的经纬度,但当将两 ...
- Android百度地图开发(一)之初体验
转载请注明出处:http://blog.csdn.net/crazy1235/article/details/42614603 做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需 ...
- Android百度地图开发05之公交信息检索 + 路线规划
在上一篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索和线路规划的内容. 公交信息检索 实际上,公交信息检索与POI检索.在线建议检索非常相似,也是把你需要检索的信息发送给百度地图 ...
随机推荐
- Node.js 学习(四)Node.js 回调函数
Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了. 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,Node 所有 API 都 ...
- Matlab梯度下降解决评分矩阵分解
for iter = 1:num_iters %梯度下降 用户向量 for i = 1:m %返回有0有1 是逻辑值 ratedIndex1 = R_training(i,:)~=0 ; %U(i,: ...
- DepthClipEnable error
刚刚呢又遇到这种鬼扯的问题,ps就return个(1,1,0,1) nisight的汇编都写对了,但结果就是画不出任何东西,按照经验,必然是某个state.... 我就找啊找啊,被我找到一个 Rast ...
- .NET设计模式(3):抽象工厂模式(Abstract Factory)(转)
概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来 ...
- php __FILE__,__CLASS__等魔术变量,及实例(转)
今天看到一个魔术变量,是以前没见过的,__DIR__,我查了查,发现原来是php5.3新增的,顺便举几个例子,解释一下php的魔术变量 1,__FILE__ 文件的完整路径和文件名.如果用在被包含文件 ...
- UML对象图(转载)
概述: 对象图都来源于类图,依赖类图对象图. 对象图表示一个类图的一个实例.类图和对象图的基本概念是相似的.对象图也代表了一个系统的静态视图,但这种静态视图是系统在某一时刻的一个快照. 对象图是用于呈 ...
- Codeforces Round #263 (Div. 2)
吐槽:一辈子要在DIV 2混了. A,B,C都是简单题,看AC人数就知道了. A:如果我们定义数组为N*N的话就不用考虑边界了 #include<iostream> #include &l ...
- codeforces #232 div2 解题报告
A:简单题:我们可以把点换成段处理,然后枚举段看是否被霸占了: #include<iostream> #include<]; ]=; ;i<=n;i++) { ...
- win7/8下VirtualBox虚拟Ubuntu共享文件夹设置
实验环境: 主机:win8.1 虚拟机软件:VirtualBox4.3 虚拟的主机:centos6.5 final 亲测可用! 1. 安装增强功能包(VBoxGuestAdditions) 打开虚拟 ...
- 使用Assetbundle时可能遇到的坑
原地址:http://www.cnblogs.com/realtimepixels/p/3652128.html 一 24 十一郎未分类 No Comments 转自 http://www.unity ...