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搜索的更多相关文章

  1. Android学习笔记之使用百度地图实现路线规划+公交信息检索

    PS:装了个deepin,感觉真的很高大上. 学习内容: 1.公交信息检索 2.路线规划   关于百度地图的开发也就这么多了.重要的部分也就那么些.原本打算搞到poi搜索就算了,不过看到了这两个方面还 ...

  2. Android学习笔记之使用百度地图实现地图控制

    PS:吾之荣耀,离别已久. 学习内容: 1.实现地图控制. 2.百度地图开发的一些细节     1.实现地图控制:   这一篇主要写在百度地图上添加一些其他控制.上一篇书写了覆盖物的添加,地理编码和反 ...

  3. android菜鸟学习笔记30----Android使用百度地图API(一)准备工作及在应用中显示地图

    1.准备工作: 百度地图API是免费开放的,但是需要申请API Key: 1)先注册一个百度开发者帐号 2)进入百度开放服务平台http://developer.baidu.com/ 3)进入LBS云 ...

  4. android菜鸟学习笔记31----Android使用百度地图API(二)获取地理位置及地图控制器的简单使用

    1.获取当前地理位置: Android中提供了一个LocationManager的类,用于管理地理位置.不能通过构造函数获取该类的实例,而是通过Context的getSystemService(): ...

  5. 【转】Pro Android学习笔记(十四):用户界面和控制(2):Text类控制

    目录(?)[-] TextView 例子1在XML中设置autoLink属性 例子2在代码中设置autoLink属性 EditText AutoCompleteTextView MultiAutoCo ...

  6. udacity android 学习笔记: lesson 4 part a

    udacity android 学习笔记: lesson 4 part a 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...

  7. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  8. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  9. android学习笔记36——使用原始XML文件

    XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...

随机推荐

  1. ssh sftp scp命令

    scp local_file remote_username@remote_ip:remote_folder 或者 scp local_file remote_username@remote_ip:r ...

  2. 【转】Android布局优化之ViewStub

    ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的Vie ...

  3. Andriod Studio 开发环境安装和配置

    Android Studio安装配置详细步骤(图文):http://www.2cto.com/kf/201604/500642.html第一次使用Android Studio时你应该知道的一切配置 : ...

  4. TNSNAMES.ORA 配置

    上面的sqlnet.ora文件说明:SQLNET.AUTHENTICATION_SERVICES= (NTS)——这个表示采用os认证,在数据库服务器上,可以利用sqlplus “/ as sysdb ...

  5. android 中 ViewPager 的平常用法 ViewPager+ Views

    延续前面几个的经常用到的ViewPager, 直接加载各种不同的 View 工程目录: 代码: public class ViewActivity extends Activity { // 每个Vi ...

  6. Faster R-CNN CPU环境搭建

    操作系统: bigtop@bigtop-SdcOS-Hypervisor:~/py-faster-rcnn/tools$ cat /etc/issue Ubuntu LTS \n \l Python版 ...

  7. NVelocity-0.4.2.8580 的修改记录[发个vs2008能用的版本] -- "It appears that no class was specified as the ResourceManager..." bug 修正等

    因为另有开发记录工具最新没怎么在 cnblog 写开发备忘.不过我觉得这个是个比较严重的问题,觉得有必要让更多的人知道处理方法,所以在 cnblog 也放上一篇希望广为传播. 因为现在网络上vs200 ...

  8. swift 如何删除subviews

    scrollView.subviews.map { (var view) -> () in if (view is UIButton) { view.removeFromSuperview() ...

  9. nohup启动java命令导致dubbo无法注册

    没有任何异常,日志和正常注册日志一模一样,但服务就是没注册成功. 解决办法,screen代替nohup命令. screen screen -ls screen -r pid (ctrl + a)+d

  10. dell新服务器安装系统

    公司新采购的dell 630服务器,但是第一次安装操作系统的时候比较麻烦,每次都要重新琢磨下. 现在记录一下,以供下次参考 1.插入服务器自带光盘,设置CD启动,选择部署OS 2.配置raid,然后插 ...