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检索.在线建议检索非常相似,也是把你需要检索的信息发送给百度地图 ...
随机推荐
- 如何用pdfbox-app-1.8.10.jar批处理将pdf文档转换成text文档
1.首先下载pdfbox-app-1.8.10.jar(下载地址:http://pdfbox.apache.org/download.html) 2.将pdfbox-app-1.8.10.jar加载到 ...
- 【Permutations】cpp
题目: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the fo ...
- Java 死锁诊断 -- 线程转储
java线程转储 java的线程转储可以被定义为JVM中在某一个给定的时刻运行的所有线程的快照.一个线程转储可能包含一个单独的线程或者多个线程.在多线程环境中,比如J2EE应用服务器,将会有许多线程和 ...
- Android 动态Tab分页效果实现
当前项目使用的是TabHost+Activity进行分页,目前要做个报表功能,需要在一个Tab页内进行Activity的切换.比方说我有4个Tab页分别为Tab1,Tab2,Tab3,Tab4,现在的 ...
- Leetcode#126 Word Ladder II
原题地址 既然是求最短路径,可以考虑动归或广搜.这道题对字典直接进行动归是不现实的,因为字典里的单词非常多.只能选择广搜了. 思路也非常直观,从start或end开始,不断加入所有可到达的单词,直到最 ...
- ffmpeg iOS 编译
编译模拟器版本1 到https://github.com/yuvi/gas-preprocessor下载gas-preprocessor.p并拷贝到/usr/sbin目录中2 下载ffmpeg源码.h ...
- Redis Master/Slave 实践
本次我们将模拟 Master(1) + Slave(4) 的场景,并通过ASP.NET WEB API进行数据的提交及查询,监控 Redis Master/Slave 数据分发情况,只大致概述,不会按 ...
- WPF编程学习——样式
本文目录 1.引言 2.怎样使用样式? 3.内联样式 4.已命名样式 5.元素类型样式 6.编程控制样式 7.触发器 1.引言 样式(Style),主要是用来让元素或内容呈现一定外观的属性.WPF中的 ...
- Virtualbox网络设置和无UI启动
因工作需要,在Macbook上安装Ubuntu 14.04.2虚拟机,需要ssh连接操作. 一番查找资料,实践后可以正常工作了,记录一些信息以备用 无UI启动虚拟机,可使用以下命令: VBoxMana ...
- ios frame、bound和center定义及使用场景总结
frame:指的是视图在父视图的坐标系统中的大小和位置. bound:指的是视图在视图本身的坐标系统中的大小(位置起点是原点). center:指的是视图在父视图坐标系统中的中心点. frame和bo ...