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