您当前的位置Android SDK>开发指南>检索功能

检索功能

1. 简介

目前百度地图SDK所集成的检索服务包括:POI检索、公交信息查询、线路规划、地理编码、在线建议查询、短串分享。

2. POI检索

POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。

百度地图SDK提供三种类型的POI检索:周边检索、区域检索和城市内检索。下面将以城市内检索为例,向大家介绍如何使用检索服务。

第一步,创建POI检索实例

mPoiSearch = PoiSearch.newInstance();

第二步,创建POI检索监听者;

                    OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener(){
                        public void onGetPoiResult(PoiResult result){
                        //获取POI检索结果
                        }
                        public void onGetPoiDetailResult(PoiDetailResult result){
                        //获取Place详情页检索结果
                        }
                    };
                

第三步,设置POI检索监听者;

mPoiSearch.setOnGetPoiSearchResultListener(poiListener);

第四步,发起检索请求;

                    mPoiSearch.searchInCity((new PoiCitySearchOption())
                        .city(“北京”)
                        .keyword(“美食”)
                        .pageNum(10));
                

第五步,释放POI检索实例;

mPoiSearch.destroy();

3. 公交信息检索

利用BusLineSearch方法,开发者可查询公交线路的详情信息,实现方式如下:

第一步,发起POI检索,获取相应线路的UID;

                    //以城市内检索为例,详细方法请参考POI检索部分的相关介绍
                    mSearch.searchInCity((new PoiCitySearchOption())
                        .city(“北京”)
                        .keyword(“717”);
                

第二步,在POI检索结果中判断该POI类型是否为公交信息;

                    public void onGetPoiResult(PoiResult result) {
                        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                            return;
                        }
                        //遍历所有POI,找到类型为公交线路的POI
                        for (PoiInfo poi : result.getAllPoi()) {
                            if (poi.type == PoiInfo.POITYPE.BUS_LINE ||poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
                                //说明该条POI为公交信息,获取该条POI的UID
                                busLineId = poi.uid;
                                break;
                            }
                        }
                    }
                

第三步,定义并设置公交信息结果监听者(与POI类似),并发起公交详情检索;

                    //如下代码为发起检索代码,定义监听者和设置监听器的方法与POI中的类似
                    mBusLineSearch.searchBusLine((new BusLineSearchOption()
                        .city(“北京”)
                        .uid(busLineId)));
                

4. 线路规划

使用地图SDK,开发者还可以实现公交、驾车和步行三种方式的线路规划。

4.1 公交线路规划

实现公交线路规划的方式如下:

第一步,创建公交线路规划检索实例;

mSearch = RoutePlanSearch.newInstance();

第二步,创建公交线路规划检索监听者;

                    OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener() {
                        public void onGetWalkingRouteResult(WalkingRouteResult result) {
                            //  
                        }
                        public void onGetTransitRouteResult(TransitRouteResult result) {
                            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                                Toast.makeText(RoutePlanDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
                            }
                            if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
                                //起终点或途经点地址有岐义,通过以下接口获取建议查询信息
                                //result.getSuggestAddrInfo()
                                return;
                            }
                            if (result.error == SearchResult.ERRORNO.NO_ERROR) {
                                TransitRouteOverlay overlay = new MyTransitRouteOverlay(mBaidumap);
                                mBaidumap.setOnMarkerClickListener(overlay);
                                overlay.setData(result.getRouteLines().get(0));
                                overlay.addToMap();
                                overlay.zoomToSpan();
                            }
                        }
                        public void onGetDrivingRouteResult(DrivingRouteResult result) {
                            // 
                        }
                    };
                

第三步,设置公交线路规划检索监听者;

mSearch.setOnGetRoutePlanResultListener(listener);

第四步,准备检索起、终点信息;

                    PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", "龙泽");
                    PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "西单");
                

第五步,发起公交线路规划检索;

                    mSearch.transitSearch((new TransitRoutePlanOption())
                        .from(stNode)
                        .city("北京")
                        .to(enNode));
                

第六步,释放检索实例;

mSearch.destory();

公交线路规划结果的JSON结构图如下:

                    TransitRouteResult {  //换乘路线结果
                        TaxiInfo: {  //打车信息
                            int totalPrice ;  //总价格
                            String desc;  //打车描述信息
                            int distance;  //距离
                            int duration;  //时间
                            int perKMPrice;  //单价
                            int startPrice;  //起步价
                        }
                        List<TransitRouteLine> : [   //换乘方案
                            {
                            TaxiInfo taxitInfo,   //打车信息
                            VehicleInfo vehicleInfo,   //交通工具信息
                            RouteNode entrance,  //路段入口
                            RouteNode exit,  //路段出口
                            TransitRouteStepType,   //路段类型
                            String instructions,   //路段说明
                            int distance,  //距离
                            int duration  //时间
                            },
                            ……
                        ]
                        SuggestAddrInfo: {   //建议起终点信息
                            List<PoiInfo> suggestStartNode;    //建议起点
                            List<PoiInfo> suggestEndNode;  //建议终点
                            List<List<PoiInfo>> suggestWpNode;   //建议途经点
                            List<CityInfo> suggestStartCity;   //建议起点城市
                            List<CityInfo> suggestEndCity;   //建议终点城市
                            List<List<CityInfo>> suggestWpCity;    //建议途经点城市
                        }
                    }
                

4.2 驾车线路规划

第一步,创建驾车线路规划检索实例;

mSearch = RoutePlanSearch.newInstance();

第二步,创建驾车线路规划检索监听者;

                    OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener() {
                        public void onGetWalkingRouteResult(WalkingRouteResult result) {
                            //获取步行线路规划结果
                        }
                        public void onGetTransitRouteResult(TransitRouteResult result) {
                            //获取公交换乘路径规划结果
                        }
                        public void onGetDrivingRouteResult(DrivingRouteResult result) {
                            //获取驾车线路规划结果
                        }
                    };
                

第三步,设置驾车线路规划检索监听者;

mSearch.setOnGetRoutePlanResultListener(listener);

第四步,准备检索起、终点信息;

                    PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", "龙泽");
                    PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "西单");
                

第五步,发起驾车线路规划检索;

                    mSearch.drivingSearch((new DrivingRoutePlanOption())
                        .from(stNode)
                        .to(enNode));
                

第六步,释放检索实例;

mSearch.destory();

4.3 步行线路规划

步行线路规划的方式与驾车线路规划方式类似,在此不再赘述。

5.地理编码

地理编码指的是将地址信息建立空间坐标关系的过程。有可分为正向地图编码和反向地图编码。

正向地理编码指的是由地址信息转换为坐标点的过程,核心代码如下:

第一步,创建地理编码检索实例;

mSearch = GeoCoder.newInstance();

第二步,创建地理编码检索监听者;

                    OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
                        public void onGetGeoCodeResult(GeoCodeResult result) {
                            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                                //没有检索到结果
                            }
                            //获取地理编码结果
                        }

                        @Override
                        public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
                            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                                //没有找到检索结果
                            }
                            //获取反向地理编码结果
                        }
                    };
                

第三步,设置地理编码检索监听者;

mSearch.setOnGetGeoCodeResultListener(listener);

第四步,发起地理编码检索;

                    mSearch.geocode(new GeoCodeOption()
                        .city(“北京”)
                        .address(“海淀区上地十街10号”);
                

第五步,释放地理编码检索实例;

mSearch.destroy();

反向地理编码服务实现了将地球表面的地址坐标转换为标准地址的过程。反向地理编码提供了坐标定位引擎,帮助用户通过地面某个地物的坐标值来反向查询得到该地物所在的行政区划、所处街道、以及最匹配的标准地址信息。通过丰富的标准地址库中的数据,可帮助用户在进行移动端查询、商业分析、规划分析等领域创造无限价值

反向地理编码的实现形式与正向地理编码的方式相同,此处不再赘述。(更多详细信息请参考相应Demo)

6. 在线建议查询

在线建议查询是指根据关键词查询在线建议词,实现方式如下:

第一步,创建在线建议查询实例;

mSuggestionSearch = SuggestionSearch.newInstance();

第二步,创建在线建议查询监听者

                    OnGetSuggestionResultListener listener = new OnGetSuggestionResultListener() {
                        public void onGetSuggestionResult(SuggestionResult res) {
                            if (res == null || res.getAllSuggestions() == null) {
                                return;
                                //未找到相关结果
                            }
                        //获取在线建议检索结果
                        }
                    };
                

第三步,设置在线建议查询监听者;

mSuggestionSearch.setOnGetSuggestionResultListener(listener);

第四步,发起在线建议查询;

                    // 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新
                    mSuggestionSearch.requestSuggestion((new SuggestionSearchOption())
                        .keyword(“百度”)
                        .city(“北京”));
                

第五步,释放在线建议查询实例;

mSuggestionSearch.destroy();

7.短串分享

短串分享是指,用户搜索查询后得到的每一个地理位置结果将会对应一条短串(短链接),用户可以通过短信、邮件或第三方分享组件(如微博、微信等)把短串分享给其他用户从而实现地理位置信息的分享。当其他用户收到分享的短串后,点击短串即可打开手机上的百度地图客户端或者手机浏览器进行查看。

例如,用户搜索“百度大厦”后通过短信使用短串分享功能把该地点分享给好友,好友点击短信中的短串“http://j.map.baidu.com/BkmBk”后可以调起百度地图客户端或者手机浏览器查看“百度大厦”的地理位置信息。

目前短串分享功能暂时开放了“POI搜索结果分享”和“反向地理编码结果分享”,日后会开放更多的功能,欢迎广大开发者使用短串分享功能。

7.1 POI搜索结果分享

第一步,利用POI检索,获取待分享的POI UID信息(具体方法请参考POI检索部分的介绍);

第二步,创建分享检索实例;

mShareUrlSearch = ShareUrlSearch.newInstance();

第三步,创建分享检索监听者;

                    OnGetShareUrlResultListener listener = new OnGetShareUrlResultListener() {
                        public void onGetPoiDetailShareUrlResult(ShareUrlResult result) {
                            //分享POI详情
                        }
                        public void onGetLocationShareUrlResult(ShareUrlResult result) {
                            //分享位置信息
                        }
                    };
                

第四步,设置分享检索监听者;

mShareUrlSearch.setOnGetShareUrlResultListener(listener);

第五步,发起分享检索;

                    mShareUrlSearch.requestPoiDetailShareUrl(new PoiDetailShareURLOption()
                        //UID:为POI的UID信息,可用POI检索获取
                        .poiUid(UID));
                

第六步,销毁分享检索实例;

mShareUrlSearch.destroy();

7.2 反向地理编码结果分享

实现形式与POI搜索结果分享类似,此处不再赘述。