Android学习笔记之使用百度地图实现Poi搜索

PS:装个系统装了一天.心力憔悴.感受不会再爱了.git

 

学习内容:api

1.使用百度Map实现Poi搜索.ide

2.短串分享函数

3.在线建议查询学习

 

  百度地图的研究也算是过半了.可以实现定位,实现相关信息的搜索,实现地图控制这也就算是掌握了一大部分了.此次主要是说说如何去实现poi搜索.那么什么是Poi.优化

  Poi:poi中文翻译为兴趣点.捞干的说其实就是周边的一些ktv,酒店,餐馆,理发店等等都是一个poi.在实现了基础定位的前提后,去搜索附近的poi.这样就能够完成一些其余事情.好比说订一份外卖,预约一个房间等等.这些都是基于poi搜索才可以实现的.ui

  百度SDK提供了三种Poi搜索:周边搜索,区域搜索,城市内搜索(com.baidu.mapapi.search.poi).
this

  搜索是基于上面的api,实现Poi搜索仍是须要分几个过程的.首先是须要实例化对象PoiSearch.url

private PoiSearch poiSearch= PoiSearch.newInstance();

   而后须要为PoiSearch设置上搜索的方式.方式就是上面所说的三种.三种搜索方式都在下面进行了列举,咱们能够看到百度地图对检索的结果进行了分页处理,所以在显示的时候咱们须要制定分页的页数以及每页的数量.spa

   /**
     * 城市内搜索,直接根据输入框的内容去实现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

相关文章
相关标签/搜索