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 ...
随机推荐
- LPC18xx LPC43xx LPC4370 Bootrom USB DFU FPB - Flash Patch and Breakpoint Unit
What is the difference between a Bootrom vs bootloader on ARM systems Bootrom Bootrom (or Boot ROM) ...
- Windows7给C盘扩容
// 在之前的系统中都是使用PartitionMagic来进行磁盘容量的分配,但PartitionMagic在Windows7中的兼容性不是好很好,导致不能使用.其实Windows7自带了磁盘管理工具 ...
- 漫谈Puppet4
激动人心的改进 速度,速度,还是速度 稳定性和鲁棒性的提升 全新的Parser “不变"的agent 不兼容的改动 包管理方式的变化 配置文件/目录的路径变化 其他路径变化 Director ...
- How to programmatically new a java class which implements sepecified interface in eclipse plugin development
http://w3facility.org/question/how-to-programmatically-new-a-java-class-which-implements-sepecified- ...
- solr python客户端 - solrpy
solrPy 基础使用: 1)与solr建立连接 import solr s = solr.Solr('http://host:ip/solr/collectionName') 2)查询 r = s. ...
- 声色贴生成图片总结 Imagick
2014-08-24 都是按以前的程序进行了,但去年8月都可以用Imagick正常生成CMYK的图片,但今天就是不行. 经过一切测试方法及思路,解决方法如下. 问题主要出现在: 生成的二维码是RGB格 ...
- Ext4,Ext3的特点和区别(转)
Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4. Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只 ...
- Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换
已经很久没更新Launcher系列文章,今天不分析源码,讲讲如何在Launcher里面添加桌面设置的功能.目前很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能.例如小米MIUI的La ...
- uestc_retarded 模板
虽然这个队,以后再也没有了,但是他的模板,是永垂不朽的![误 #include <ext/pb_ds/priority_queue.hpp> __gnu_pbds::priority_qu ...
- .net core 1.0 实现负载多服务器单点登录
前言 .net core 出来有一时间了,这段时间也一直在做技术准备,目前想做一个单点登录(SSO)系统,在这之前用.net时我用习惯了machineKey ,也顺手在.net core 中尝试了一上 ...