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

简介

目前百度地图SDK所集成的检索服务包括:POI检索、公交信息查询、线路规划、地理编码、行政区边界数据检索、在线建议查询、短串分享(包括POI搜索结果分享、驾车/公交/骑行/步行路线规划分享、反向地理编码结果分享)。

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();

自v3.6.1开始,城市poi检索返回结果,新增门址类列表数据:

PoiSearch类的searchInCity(PoiCitySearchOption) 发起检索时返回的结果,增加门址类数据:PoiResult中新增getAllAddr()获取门址类列表,当isHasAddrInfo() 返回true时,除了原poi列表外,还包含门址结果。

例如:在“北京”搜索“上地十街1号”,除返回包含“上地十街1号”的poi列表以外,还包括地址为“上地十街1号”的明确门址。

POI详情信息的检索

以上向大家介绍了POI检索功能的使用方法,百度地图SDK 还向广大开发者开放了 POI详情信息的检索 ,为开发者提供更多的LBS数据支持。

POI详情检索的实现方式如下:

第一步,发起检索:

//uid是POI检索中获取的POI ID信息
mPoiSearch.searchPoiDetail((new PoiDetailSearchOption()).poiUid(uid));

第二步,设置结果监听:

public void onGetPoiDetailResult(PoiDetailResult result) {
    if (result.error != SearchResult.ERRORNO.NO_ERROR) {
        //详情检索失败
        // result.error请参考SearchResult.ERRORNO 
    } 
    else {
        //检索成功
    }
}

公交信息检索

利用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)));

行政区边界数据检索

自v3.7.0起,支持行政区边界数据检索。根据省、市、县(区)级行政区划名称,查询行政区划的详细边界信息。 下面以查询“北京市海淀区”的边界为例,介绍如何进行查询,实现方法如下:

mDistrictSearch = DistrictSearch.newInstance();
mDistrictSearch.searchDistrict(new DistrictSearchOption().cityName(city).districtName(district));
//其中city表示城市名称,必填;district表示区名称,可选。

对于绘制行政区域多边形的代码,已在demo中开源展示。

线路规划

百度地图iOS SDK为开发者提供了公交换乘、驾车、骑行和步行四种类型的线路规划方案,同时公交和驾车线路规划根据不同的方案还可以选择“时间最短”、“距离最短”等策略来完成最终的线路规划。开发者可根据自己实际的业务需求来自由使用。

自3.7.0起,新增骑行线路规划功能,具体使用方法请参看demo。

跨城综合公共交通线路规划(简称跨城公交线路规划)

自4.1起,新增跨城综合公交线路规划MassTransit,支持起点、终点坐标在不同城市的公交线路规划,可检索火车、飞机、公交、大巴等公共交通线路,同时可以根据不同的方案选择多种策略来完成跨城公共交通线路规划。

此跨城公交线路规划包含旧公交线路规划transit(支持城市内公交规划)的全部功能,旧公交线路规划将废弃,建议使用新版跨城公交线路规划。

跨城公交线路规划,以检索“北京天安门”到“上海东方明珠”为例,Route Demo中有详细代码.

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

mSearch = RoutePlanSearch.newInstance();

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

OnGetRoutePlanResultListener routeListener = new OnGetRoutePlanResultListener(){
   @Override
   public void onGetMassTransitRouteResult(MassTransitRouteResult result) {
    //获取跨城综合公共交通线路规划结果
   }
}

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

mSearch.setOnGetRoutePlanResultListener( routeListener );

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

PlanNode stMassNode = PlanNode.withCityNameAndPlaceName("北京", "天安门");
PlanNode enMassNode = PlanNode.withCityNameAndPlaceName("上海", "东方明珠");

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

mSearch.masstransitSearch(new MassTransitRoutePlanOption().from(stMassNode).to(enMassNode));

第六步,释放检索实例;

mSearch.destroy();


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

 MassTransitRouteResult {
      TransitResultNode: {    //起点信息
             int cityId;      //城市编号
             String cityName; //城市名
             LatLng location;        //起点坐标 (当匹配有效路径时,该坐标有值;当起点模糊,出给建议列表时,该坐标为空)
             String searchWord;      //检索关键字 (当起点模糊,出给建议列表时,该关键字有值;当匹配有效路径时,该关键字为空)
      }origin;
      TransitResultNode destination;  //终点信息(结果及含义同上)
      TaxiInfo: {                //打车信息 (起终点为大陆地区同城时,有打车信息;其他情况无打车信息,该字段为空)
             float totalPrice;       //总价格
             String desc;            //打车描述信息
             int distance;           //距离    
             int duration;           //时间
             float perKMPrice;       //单价
             float startPrice;       //起步价
      }massTaxiInfo;
      int total;              //总路线数目
      List<MassTransitRouteLine>  : [  //换乘方案
             MassTransitRouteLine {
                    int distance;      //距离(单位:米)
                    int duration;      //耗时 (单位:秒)
                    String arriveTime; //本线路预计到达时间:格式举例:2016-09-29 13:48:00
                    double price;      //本线路价格(元)
                    List<PriceInfo> priceInfo;       //票价详情(起终点为大陆地区同城时,此字段有值;其他情况,此字段为空)
                    List<List<TransitStep>> newSteps; //一条线路中的步骤(step)
             }
             ...
      ]mRoutelines;
      SuggestAddrInfo :{                     //    建议起终点信息
             List<PoiInfo> suggestStartNode;  //建议起点
             List<PoiInfo> suggestEndNode;    //建议终点
      }suggestAddrInfo;
} 

路线步骤说明:

List<List<TransitStep>> :[    //一条线路中的步骤(step)
      [ //起终点为同城时,该list表示一个step中的多个方案scheme; 起终点为跨城时,该list表示一个step 中多个子步骤sub_step
             TransitStep:{
                    int distance;               //距离
                    int duration;               //耗时
                    List<TrafficCondition> trafficConditions;  //路况状态
                    LatLng startLocation;       //起点
                    LatLng endLocation;         //终点
                    String instructions;        //换乘说明
                    StepVehicleInfoType vehileType;  //交通工具类型(火车,飞机,大巴,公交,驾车,步行)
                    // 交通工具为驾车或步行时,无详情;为其他4种方式,则对应以下4种工具详情)
                    TrainInfo trainInfo;        //火车详情
                    PlaneInfo planeInfo;        //飞机详情
                    CoachInfo coachInfo;        //大巴详情
                    BusInfo busInfo;            //公交详情                  
             }
             ...
      ]
      …
]newSteps;

公交线路规划

此公交线路规划将废弃,建议使用新版跨城公交线路规划。

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

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

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;    //建议途经点城市  
    }  
}

驾车线路规划

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

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();

步行线路规划

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

地理编码

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

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

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

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)

在线建议查询

在线建议查询是指根据关键词查询在线建议词。为了帮助开发者实现检索出来的关键词快速定位到地图上,SDK自3.5.0版本起,开放了检索结果的经纬度信息及对应POI点的UID信息。

注意:

1. 在线建议检索的本质是根据部分关键是检索出来可能的完整关键词名称,如果需要这些关键词对应的POI的具体信息,请使用POI检索来完成;

2. 在线检索结果的第一条可能存在没有经纬度信息的情况,该条结果为文字联想出来的关键词结果,并不对应任何确切POI点。例如输入“肯”,第一条结果为“肯德基”,这条结果是一个泛指的名称,不会带有经纬度等信息。

在线建议检索实现方式如下:

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

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();

短串分享

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

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

目前短串分享功能暂时开放了“POI搜索结果分享”、“驾车/公交/骑行/步行路线规划分享”和“反向地理编码结果分享”,日后会开放更多的功能,欢迎广大开发者使用短串分享功能。

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();

反向地理编码结果分享

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

公交路线规划短串分享

利用此方法,开发者可将公交规划路线以短串的形式分享给其他用户,实现方法如下:

//利用公交路线规划检索,获取待分享的公交规划(具体方法请参考公交检索规划的介绍);
//创建分享检索实例;
private ShareUrlSearch mShareUrlSearch = null;
mShareUrlSearch = ShareUrlSearch.newInstance();
 
//创建、设置分享检索监听者;
mShareUrlSearch.setOnGetShareUrlResultListener(new OnGetShareUrlResultListener());
 
//发起分享检索;
private RouteShareMode mRouteShareMode;
mRouteShareMode = RouteShareMode.BUS_ROUTE_SHARE_MODE;
startNode  = PlanNode.withLocation(new LatLng(40.056885, 116.308142));
enPlanNode = PlanNode.withLocation(new LatLng(39.921933, 116.488962));
 
// 如起终点为地理坐标,则无需设置起终点城市cityCode。
// 如起终点为地址名称,则必须传入cityCode。比如new RouteShareURLOption.cityCode(131)
// pn表示要检索的公交路线结果的index
mShareUrlSearch.requestRouteShareUrl(new RouteShareURLOption()
.from(startNode).to(enPlanNode).routMode(mRouteShareMode).pn(1));
 
//销毁分享检索实例;
mShareUrlSearch.destroy();

驾车路线规划短串分享

以分享驾车路线规划短串为例,,实现方法如下。步行、骑行规划分享与此相似,但步行、骑行目前仅支持同城。

//利用驾车路线规划检索,获取待分享的驾车规划(具体方法请参考驾车检索规划的介绍);
//创建分享检索实例;
private ShareUrlSearch mShareUrlSearch = null;
mShareUrlSearch = ShareUrlSearch.newInstance();
 
//创建、设置分享检索监听者;
mShareUrlSearch.setOnGetShareUrlResultListener(new OnGetShareUrlResultListener());
 
//发起分享检索;
private RouteShareMode mRouteShareMode;
mRouteShareMode = RouteShareMode.CAR_ROUTE_SHARE_MODE;
startNode  = PlanNode.withCityCodeAndPlaceName(131, "西单");
enPlanNode = PlanNode.withCityCodeAndPlaceName(131, "百度大厦");
 
// 如起点为地理坐标,则无需设置起点城市cityCode。如果起点为名称,需传入cityCode
// 如终点为地理坐标,则无需设置终点城市cityCode。如果终点为名称,需传入cityCode
 
// pn表示要检索的公交路线结果的index
mShareUrlSearch.requestRouteShareUrl(new RouteShareURLOption()
.from(startNode).to(enPlanNode).routMode(mRouteShareMode));
 
//销毁分享检索实例;
mShareUrlSearch.destroy();