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:

从这里可以看出,百度对检索结果进行了分页处理。所以在设置参数的时候,需要设置单页容量和页号。

  1. // 实例化PoiSearch对象
  2. poiSearch = PoiSearch.newInstance();
  3. // 设置检索监听器
  4. poiSearch.setOnGetPoiSearchResultListener(poiSearchListener);
  1. /**
  2. * POI检索监听器
  3. */
  4. OnGetPoiSearchResultListener poiSearchListener = new OnGetPoiSearchResultListener() {
  5. @Override
  6. public void onGetPoiResult(PoiResult poiResult) {
  7. if (poiResult == null
  8. || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果
  9. Toast.makeText(PoiSearchActivity.this, "未找到结果",
  10. Toast.LENGTH_LONG).show();
  11. return;
  12. }
  13. if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回
  14. bdMap.clear();
  15. MyPoiOverlay poiOverlay = new MyPoiOverlay(bdMap);
  16. poiOverlay.setData(poiResult);// 设置POI数据
  17. bdMap.setOnMarkerClickListener(poiOverlay);
  18. poiOverlay.addToMap();// 将所有的overlay添加到地图上
  19. poiOverlay.zoomToSpan();
  20. //
  21. totalPage = poiResult.getTotalPageNum();// 获取总分页数
  22. Toast.makeText(
  23. PoiSearchActivity.this,
  24. "总共查到" + poiResult.getTotalPoiNum() + "个兴趣点, 分为"
  25. + totalPage + "页", Toast.LENGTH_SHORT).show();
  26. }
  27. }
  1. /**
  2. * 城市内搜索
  3. */
  4. private void citySearch(int page) {
  5. // 设置检索参数
  6. PoiCitySearchOption citySearchOption = new PoiCitySearchOption();
  7. citySearchOption.city(editCityEt.getText().toString());// 城市
  8. citySearchOption.keyword(editSearchKeyEt.getText().toString());// 关键字
  9. citySearchOption.pageCapacity(15);// 默认每页10条
  10. citySearchOption.pageNum(page);// 分页编号
  11. // 发起检索请求
  12. poiSearch.searchInCity(citySearchOption);
  13. }
  14. /**
  15. * 范围检索
  16. */
  17. private void boundSearch(int page) {
  18. PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption();
  19. LatLng southwest = new LatLng(latitude - 0.01, longitude - 0.012);// 西南
  20. LatLng northeast = new LatLng(latitude + 0.01, longitude + 0.012);// 东北
  21. LatLngBounds bounds = new LatLngBounds.Builder().include(southwest)
  22. .include(northeast).build();// 得到一个地理范围对象
  23. boundSearchOption.bound(bounds);// 设置poi检索范围
  24. boundSearchOption.keyword(editSearchKeyEt.getText().toString());// 检索关键字
  25. boundSearchOption.pageNum(page);
  26. poiSearch.searchInBound(boundSearchOption);// 发起poi范围检索请求
  27. }
  28. /**
  29. * 附近检索
  30. */
  31. private void nearbySearch(int page) {
  32. PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();
  33. nearbySearchOption.location(new LatLng(latitude, longitude));
  34. nearbySearchOption.keyword(editSearchKeyEt.getText().toString());
  35. nearbySearchOption.radius(1000);// 检索半径,单位是米
  36. nearbySearchOption.pageNum(page);
  37. poiSearch.searchNearby(nearbySearchOption);// 发起附近检索请求
  38. }

通过以上代码,就可以完成三种类型的检索,分组的时候只不过是改一下pageNum()参数。

查询出这一组组的结果之后,可以通过添加覆盖物的方式显示在地图上。但是如果按照之前的添加覆盖物的方式进行添加的话,需要在得到的List<PoiInfo>中得到经纬度数据,然后循环构造出覆盖物对象,添加到地图上。

这样做未尝不可,但是百度提供了更简便的方式给我们。

打开com.baidu.mapapi.overlayutil这个包,看到有一个类用于显示poi的overlay。

        
    从api中得知,该类已经实现了marker点击事件的接口了。我们在接口的毁掉函数onGetPoiResult()中得到了PoiResult对象,然后可以通过setData(PoiResult poiResult)这个方法设置poi数据显示在地图上。
API中说明onPoiClick(int i)可以覆写,这样我们可覆写此方法,当点击底图上覆盖物的时候查询POI详细信息。

  1. class MyPoiOverlay extends PoiOverlay {
  2. public MyPoiOverlay(BaiduMap arg0) {
  3. super(arg0);
  4. }
  5. @Override
  6. public boolean onPoiClick(int arg0) {
  7. super.onPoiClick(arg0);
  8. PoiInfo poiInfo = getPoiResult().getAllPoi().get(arg0);
  9. // 检索poi详细信息
  10. poiSearch.searchPoiDetail(new PoiDetailSearchOption()
  11. .poiUid(poiInfo.uid));
  12. return true;
  13. }
  14. }

PoiOverlay从OverlayManager这个类中继承了:

1. addToMap() -- 将所有overlay添加到地图上

2. removeFromMap() -- 将所有overlay从地图上移除

3. zoomToSpan() -- 缩放地图,使所有overlay都在合适的视野内

这样可以在返回poi结果的时候,把poi标注在地图上了:

  1. if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回
  2. bdMap.clear();
  3. MyPoiOverlay poiOverlay = new MyPoiOverlay(bdMap);
  4. poiOverlay.setData(poiResult);// 设置POI数据
  5. bdMap.setOnMarkerClickListener(poiOverlay);
  6. poiOverlay.addToMap();// 将所有的overlay添加到地图上
  7. poiOverlay.zoomToSpan();
  8. //
  9. totalPage = poiResult.getTotalPageNum();// 获取总分页数
  10. Toast.makeText(
  11. PoiSearchActivity.this,
  12. "总共查到" + poiResult.getTotalPoiNum() + "个兴趣点, 分为"
  13. + totalPage + "页", Toast.LENGTH_SHORT).show();
  14. }

当我们点击一个覆盖物的时候,去查询详细信息:

  1. @Override
  2. public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
  3. if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) {
  4. Toast.makeText(PoiSearchActivity.this, "抱歉,未找到结果",
  5. Toast.LENGTH_SHORT).show();
  6. } else {// 正常返回结果的时候,此处可以获得很多相关信息
  7. Toast.makeText(
  8. PoiSearchActivity.this,
  9. poiDetailResult.getName() + ": "
  10. + poiDetailResult.getAddress(),
  11. Toast.LENGTH_LONG).show();
  12. }
  13. }

短串分享

短串分享时指:用户查询得到的地理位置对应到一个url链接地址,百度将这种地址做短了,就俗称短串。我们可以把这个短传通过短信、邮箱或者第三方分享给其他用户,当其他用户可以点击短串可以打开手机上的百度地图客户端或者手机浏览器进行查看。
    目前短串分享开放了【poi搜索结果分享】和【反向地理编码结果分享】。

打开com.baidu.mapapi.search.share这个包:


   
我们看到这个包结构与POI的包结构非常相似。按照之前的经验,可以猜想:ShareUrlSearch是用来发起短串检索请求的;2个
xxxOption()方法用来对不同的请求类型设置参数的;onGetShareUrlResultListener是用来监听返回结果
的;ShareUrlShare就是返回结果的包装类。

  1. // 实例化共享URL查询接口对象
  2. shareUrlSearch = ShareUrlSearch.newInstance();
  3. // 设置共享URL结果监听函数
  4. shareUrlSearch.setOnGetShareUrlResultListener(shareUrlResultListener);
  1. /**
  2. * 短串检索监听器
  3. */
  4. OnGetShareUrlResultListener shareUrlResultListener = new OnGetShareUrlResultListener() {
  5. @Override
  6. public void onGetPoiDetailShareUrlResult(ShareUrlResult shareUrlResult) {
  7. if (shareUrlResult.error != SearchResult.ERRORNO.NO_ERROR) {
  8. Toast.makeText(PoiSearchActivity.this, "抱歉,未搜索到短串",
  9. Toast.LENGTH_SHORT).show();
  10. } else {
  11. Toast.makeText(PoiSearchActivity.this, "poi详情分享url:" + shareUrlResult.getUrl(),
  12. Toast.LENGTH_LONG).show();
  13. }
  14. }
  15. @Override
  16. public void onGetLocationShareUrlResult(ShareUrlResult shareUrlResult) {
  17. if (shareUrlResult.error != SearchResult.ERRORNO.NO_ERROR) {
  18. Toast.makeText(PoiSearchActivity.this, "抱歉,未搜索到短串",
  19. Toast.LENGTH_SHORT).show();
  20. } else {
  21. Toast.makeText(PoiSearchActivity.this,  "请求位置信息分享url:" + shareUrlResult.getUrl(),
  22. Toast.LENGTH_LONG).show();
  23. }
  24. }
  25. };

发起请求:

  1. // 请求位置信息分享URL
  2. shareUrlSearch.requestLocationShareUrl(new LocationShareURLOption()
  3. .location(poiInfo.location).name("共享点名称").snippet("123"));
  4. // 共享点位置 --- 共享点名称 --- 通过短URL调起客户端时作为附加信息显示在名称下面
  5. //请求poi详情分享URL的时候参数xxxOption中只有一个uid
  6. shareUrlSearch
  7. .requestPoiDetailShareUrl(new PoiDetailShareURLOption()
  8. .poiUid(poiInfo.uid));

在线建议查询

指根据关键词查询在线建议词。


    实现方式与短串分享大同小异。代码就略了吧~~~

下载:

demo下载地址!

Android百度地图开发04之POI检索的更多相关文章

  1. Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

      标签: Android百度地图API Key  分类: Android 百度地图开发(2)    最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地 ...

  2. android 百度地图开发实例(转载)

    因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点androi ...

  3. [android] 百度地图开发 (两).所在地的城市定位和城市POI搜索

    一个. 百度地图城市位置和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定 ...

  4. [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题

        近期做android百度地图,可是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so显示百度地图时总是遇到问题--仅仅显示网格而没有显示地图,网 ...

  5. Android 百度地图开发之一(Hello BaiDu Map)

    之前也接触过百度地图的开发,但那是在网上找的案例或代码,而且是比较老的版本.打算重新学习一下百度地图的开发. 本次使用的百度地图的版本是 Android SDK v3.0.0 本篇文章主要讲述百度地图 ...

  6. 百度地图总结第二篇--POI检索功能

    简单介绍: 眼下百度地图SDK所集成的检索服务包含:POI检索.公交信息查询.线路规划.地理编码.行政区边界数据检索.在线建议查询.短串分享(包含POI搜索结果分享.驾车/公交/骑行/步行路线规划分享 ...

  7. android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索

    最近跟着百度地图API学地图开发,先是学了路径搜索,对于已知坐标的两点进行驾车.公交.步行三种路径的搜索(公交路径运行没效果,待学习中),后来又 学了定位功能,能够获取到自己所在位置的经纬度,但当将两 ...

  8. Android百度地图开发(一)之初体验

    转载请注明出处:http://blog.csdn.net/crazy1235/article/details/42614603 做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需 ...

  9. Android百度地图开发05之公交信息检索 + 路线规划

    在上一篇blog中介绍过POI检索的使用,本篇blog主要介绍公交信息检索和线路规划的内容. 公交信息检索 实际上,公交信息检索与POI检索.在线建议检索非常相似,也是把你需要检索的信息发送给百度地图 ...

随机推荐

  1. 搭建SpringMVC+MyBatis开发框架三

    新增spingmvc.xml配置 在WEB-INF下新增spingmvc.xml,主要是配置spring扫描的包:  <?xml version="1.0" encodin ...

  2. Careercup - Google面试题 - 5898529851572224

    2014-05-06 07:56 题目链接 原题: Flatten an iterator of iterators ,], [,[,]], ], it should ,,,,,]. Implemen ...

  3. Codeforces Round #254 (Div. 1) C. DZY Loves Colors 线段树

    题目链接: http://codeforces.com/problemset/problem/444/C J. DZY Loves Colors time limit per test:2 secon ...

  4. 小技巧---查doc文档的index.html怎么用的和chm一样

    看包里面是否有E:\Java\hibernate3.3.2\hibernate-annotations-3.4.0.GA\hibernate-annotations-3.4.0.GA\doc\refe ...

  5. hdu 3157 Crazy Circuits 网络流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3157 You’ve just built a circuit board for your new r ...

  6. 科学技术法转成BigDemcial

    目的:将类似“-412615050624334534247E-3”转成“-412615050624334534.247” 工具:用到BigDemcial Code: public static voi ...

  7. FbxDataType is ambiguous

    ??? 使用fbx自定义的类型的时候,比如 FbxIntDT 会有link error 根本原因是 FbxDataType is ambiguous solution: 把fbx的lib换成 libf ...

  8. extern关键字的使用

    A.置于变量或者函数前,以标示变量或者函数的定义在别处,提示编译器遇到此变量和函数时在其他地方寻找其定义. B.可用来进行链接指定. 1.使用extern声明外部变量 1.1在一个文件内声明外部变量 ...

  9. 7件你不知道但可以用CSS做的事

    不管你信不信,CSS和JavaScript开始重叠,就像CSS增加了更多功能一新.在我写“你可能不知道的CSS和JavaScript互相影响的5种方式”一文时,人们对于JavaScript和CSS是如 ...

  10. 从浏览器的console获取angularjs的scope

    http://ionicframework.com/blog/angularjs-console/ 1: Access Scopes We can access any scope (even iso ...