浏览器版本低!无法浏览完整内容,建议升级或更换浏览器。

iOS 地图SDK

百度地图SDK是一套应用程序接口, 通过调用地图SDK接口,开发者可以轻松访问百度地图的服务和数据,构建功能丰富、交互性强的地图类应用程序。

简介

百度地图SDK提供的检索服务包括以下功能模块:POI检索,公交方案检索,驾车路线检索,步行路线检索,行政区边界数据检索,地理编码,反地理编码,公交详情检索,在线建议查询,短串分享(包括POI搜索结果分享、驾车/公交/骑行/步行路线规划分享、反向地理编码结果分享)。

每个检索功能模块都包括一个主检索对象,一个用于构造检索参数的Option结构体,和一个用于接收检索结果回调的Delegate,所有检索服务都使用异步回调模式。使用检索服务时,需要先初始化主检索对象,然后通过主检索对象以包含检索参数的Option做为参数发起检索,最后实现相应的检索功能模块的Delegate处理返回结果 。

坐标说明

百度地图SDK接口和返回内容的坐标目前仅支持百度BD09坐标,如果您使用的是GPS WGS84坐标或国测局GCJ02坐标,需要将WGS84坐标或GCJ02坐标转换为BD09坐标。

相应的接口和转换方法请参考坐标转换请勿使用非官方的转换方法。

POI检索

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

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

-(void)viewDidLoad  
  {    
    //初始化检索对象  
    _searcher =[[BMKPoiSearch alloc]init];  
    _searcher.delegate = self;    
    //发起检索  
    BMKNearbySearchOption *option = [[BMKNearbySearchOption alloc]init];  
    option.pageIndex = curPage;  
    option.pageCapacity = 10;
    option.location = CLLocationCoordinate2D{39.915, 116.404};
    option.keyword = @"小吃";  
    BOOL flag = [_searcher poiSearchNearBy:option];  
    [option release];  
    if(flag)  
    {  
        NSLog(@"周边检索发送成功");  
    }  
    else  
    {  
        NSLog(@"周边检索发送失败");  
    }  
 
 }  
 //实现PoiSearchDeleage处理回调结果  
 - (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResultList errorCode:(BMKSearchErrorCode)error  
 {  
    if (error == BMK_SEARCH_NO_ERROR) {  
        //在此处理正常结果   
    }  
    else if (error == BMK_SEARCH_AMBIGUOUS_KEYWORD){  
         //当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表  
         // result.cityList;  
         NSLog(@"起始点有歧义");  
    } else {  
         NSLog(@"抱歉,未找到结果");  
    }  
}  
//不使用时将delegate设置为 nil    
-(void)viewWillDisappear:(BOOL)animated    
{    
     _searcher.delegate = nil;    
}

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

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

第一步,发起检索:

//初始化检索服务
_poisearch = [[BMKPoiSearch alloc] init];
_poisearch.delegate = self;
//POI详情检索
BMKPoiDetailSearchOption* option = [[BMKPoiDetailSearchOption alloc] init];
option.poiUid = @”此处为POI的uid”;//POI搜索结果中获取的uid
BOOL flag = [_poisearch poiDetailSearch:option];
[option release];
if(flag)
{
    //详情检索发起成功
}
else
{
    //详情检索发送失败
}

第二步,设置结果监听:

-(void)onGetPoiDetailResult:(BMKPoiSearch *)searcher result:(BMKPoiDetailResult *)poiDetailResult errorCode:(BMKSearchErrorCode)errorCode
{
if(errorCode == BMK_SEARCH_NO_ERROR){
//在此处理正常结果   
}
}

公交详情信息检索

上一节POI检索返回的POI结果中,epoitype字段表示POI类型,epoitype字段值为2标示公交路线,4表示地铁路线,把这两种类型的POI的uid传给公交信息检索接口,可以得到该POI所代表的路线的详细信息(如:该公交线有多少个站点,每个站点的名称,位置、参考票价和上下线行信息)。

公交详情信息检索接口使用示例如下:

- (void)viewDidLoad {     
    //初始化检索对象     
    _searcher =[[BMKBusLineSearch alloc]init]     
    _searcher.delegate = self;     
    //发起检索     
    BMKBusLineSearchOption *buslineSearchOption = [[BMKBusLineSearchOption alloc]init];      
    buslineSearchOption.city= @"北京";      
    buslineSearchOption.busLineUid= @"your bus line UID";  
    BOOL flag = [_searcher busLineSearch:buslineSearchOption];  
    [buslineSearchOption release];  
    if(flag)  
    {  
         NSLog(@"busline检索发送成功");  
    }  
    else  
    {  
        NSLog(@"busline检索");  
    }  
    //实现PoiSearchDeleage处理回调结果  
    - (void)onGetBusDetailResult:(BMKBusLineSearch*)searcher result:(BMKBusLineResult*)busLineResult errorCode:(BMKSearchErrorCode)error  
    {      
        if (error == BMK_SEARCH_NO_ERROR) {  
            //在此处理正常结果  
        }  
        else {  
            NSLog(@"抱歉,未找到结果");  
        }  
    }  
    //不使用时将delegate设置为 nil    
    -(void)viewWillDisappear:(BOOL)animated    
    {    
        _searcher.delegate = nil;    
    }

行政区边界数据检索

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

第一步,初始化并发起检索

    //初始化检索对象
    _districtSearch = [[BMKDistrictSearch alloc] init];
    //设置delegate,用于接收检索结果
    _districtSearch.delegate = self;
    //构造行政区域检索信息类
    BMKDistrictSearchOption *option = [[BMKDistrictSearchOption alloc] init];
    option.city = @"北京";
    option.district = @"海淀";
    //发起检索
    BOOL flag = [_districtSearch districtSearch:option];
    if (flag) {
        NSLog(@"district检索发送成功");
    } else {
        NSLog(@"district检索发送失败");
    }

第二步,实现delegate方法,获取结果

/**
 *返回行政区域搜索结果
 *@param searcher 搜索对象
 *@param result 搜索结BMKDistrictSearch果
 *@param error 错误号,@see BMKSearchErrorCode
 */
- (void)onGetDistrictResult:(BMKDistrictSearch *)searcher result:(BMKDistrictResult *)result errorCode:(BMKSearchErrorCode)error {
    NSLog(@"onGetDistrictResult error: %d", error);
if (error == BMK_SEARCH_NO_ERROR) {
//code
    }
}

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

路径规划

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

自v2.7.0版本起,我们针对驾车线路规划,增加了返回多条线路结果的能力,具体使用方法,可参考我们的官网Demo。

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

自v3.0起,驾车路线规划结果新增3个属性:打车费用信息、拥堵米数、红绿灯个数。

自v3.1.0起,新增跨城综合公交线路规划MassTransit,支持起点、终点坐标在不同城市的公交线路规划,可检索火车、飞机、公交、大巴等公共交通线路,同时可以根据不同的方案选择多种策略来完成跨城公共交通线路规划。此跨城公交线路规划包含旧公交线路规划transit(支持城市内公交规划)的全部功能,旧公交线路规划将废弃,建议使用新版跨城公交线路规划。

公交换乘的线路规划实现方式如下(详细代码可参照官方Demo:RouteSearchDemoViewController):

第一步,初始化并发起检索

    //初始化检索对象
    _routeSearch = [[BMKRouteSearch alloc] init];
    //设置delegate,用于接收检索结果
    _routeSearch.delegate = self;
    //构造公共交通路线规划检索信息类
    BMKPlanNode* start = [[BMKPlanNode alloc]init];
    start.name = @"北京";
    start.cityName = @"天安门";
    BMKPlanNode* end = [[BMKPlanNode alloc]init];
    end.name = @"天津";
    end.cityName = @"天津站";
    BMKMassTransitRoutePlanOption *option = [[BMKMassTransitRoutePlanOption alloc]init];
    option.from = start;
    option.to = end;
 
    //发起检索
    BOOL flag = [_routesearch massTransitSearch:option];
 
    if(flag) {
        NSLog(@"公交交通检索(支持垮城)发送成功");
    } else {
        NSLog(@"公交交通检索(支持垮城)发送失败");
    }

第二步,实现delegate方法,获取结果

/**
 *返回公共交通路线检索结果(new)
 *@param searcher 搜索对象
 *@param result 搜索结果,类型为BMKMassTransitRouteResult
 *@param error 错误号,@see BMKSearchErrorCode
 */
- (void)onGetMassTransitRouteResult:(BMKRouteSearch*)searcher result:(BMKMassTransitRouteResult*)result errorCode:(BMKSearchErrorCode)error
{
    NSLog(@"onGetMassTransitRouteResult error:%d", (int)error);
    if (errorCode == BMK_SEARCH_NO_ERROR) {
        //成功获取结果
    } else {
        //检索失败
    }
}

地理编码

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

正向地理编码指的是由地址信息转换为坐标点的过程。

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

正向地理编码和反向地理编码示例如下:

-(void)viewDidLoad    
{      
    //初始化检索对象    
    _searcher =[[BMKGeoCodeSearch alloc]init];    
    _searcher.delegate = self;      
    BMKGeoCodeSearchOption *geoCodeSearchOption = [[BMKGeoCodeSearchOption alloc]init];    
    geoCodeSearchOption.city= @"北京市";    
    geocodeSearchOption.address = @"海淀区上地10街10号";    
    BOOL flag = [_searcher geoCode:geoCodeSearchOption];    
    [geoCodeSearchOption release];    
    if(flag)    
    {    
        NSLog(@"geo检索发送成功");    
    }    
    else    
    {    
        NSLog(@"geo检索发送失败");    
    }    
 
    //发起反向地理编码检索    
    //CLLocationCoordinate2D pt = (CLLocationCoordinate2D){39.915, 116.404};    
    //BMKReverseGeoCodeOption *reverseGeoCodeSearchOption = [[  
    //BMKReverseGeoCodeOption alloc]init];  
    //reverseGeoCodeSearchOption.reverseGeoPoint = pt;    
    //BOOL flag = [_searcher reverseGeoCode:reverseGeoCodeSearchOption];    
    //[reverseGeoCodeSearchOption release];    
    //if(flag)    
    //{    
    //  NSLog(@"反geo检索发送成功");    
    //}    
    //else    
    //{    
    //  NSLog(@"反geo检索发送失败");    
    //}    
 }    
 
//实现Deleage处理回调结果    
//接收正向编码结果   
 
- (void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error{    
    if (error == BMK_SEARCH_NO_ERROR) {    
         //在此处理正常结果    
    }    
    else {    
        NSLog(@"抱歉,未找到结果");    
    }    
}    
 
//接收反向地理编码结果    
//-(void) onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:  
//(BMKReverseGeoCodeResult *)result   
//errorCode:(BMKSearchErrorCode)error{    
//  if (error == BMK_SEARCH_NO_ERROR) {    
//      在此处理正常结果    
//  }    
//  else {    
//      NSLog(@"抱歉,未找到结果");    
//  }    
//}    
 
//不使用时将delegate设置为 nil      
-(void)viewWillDisappear:(BOOL)animated      
{      
    _searcher.delegate = nil;      
}

在线建议查询

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

注意:

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

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

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

-(void)viewDidLoad  
{    
    //初始化检索对象  
    _searcher =[[BMKSuggestionSearch alloc]init];  
    _searcher.delegate = self;    
    BMKSuggestionSearchOption* option = [[BMKSuggestionSearchOption alloc] init];  
    option.cityname = @"北京";  
    option.keyword  = @"中关村";  
    BOOL flag = [_searchersuggestionSearch:option];  
        [option release];  
        if(flag)  
        {  
            NSLog(@"建议检索发送成功");  
        }  
        else  
        {  
            NSLog(@"建议检索发送失败");  
        }  
    }  
    //实现Delegate处理回调结果  
    - (void)onGetSuggestionResult:(BMKSuggestionSearch*)searcher result:(BMKSuggestionResult*)result errorCode:(BMKSearchErrorCode)error{  
        if (error == BMK_SEARCH_NO_ERROR) {  
                //在此处理正常结果  
        }  
        else {  
                NSLog(@"抱歉,未找到结果");  
        }  
    }  
 
    //不使用时将delegate设置为 nil    
    -(void)viewWillDisappear:(BOOL)animated    
    {    
        _searcher.delegate = nil;    
    }

短串分享

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

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

目前短串分享功能暂时开放了“POI详情分享”、“驾车/公交/骑行/步行路线规划分享”和“位置信息分享”,日后会开放更多的功能,欢迎广大开发者使用短串分享功能。

“POI详情分享“的短串分享

示例如下:

-(void)viewDidLoad  
{    
    //初始化检索对象  
    _searcher =[[BMKShareURLSearch alloc]init];  
    _searcher.delegate = self;    
    //发起短串搜索获取poi分享url  
    BMKPoiDetailShareURLOption *detailShareUrlSearchOption = [[BMKPoiDetailShareURLOption alloc]init];  
    //从poi检索得到的poi的uid  
    detailShareUrlSearchOption.uid==@"your poi uid";  
    BOOL flag = [_searcher requestPoiDetailShareURL:detailShareUrlSearchOption];  
    [detailShareUrlSearchOption release];  
    if(flag)  
    {  
        NSLog(@"详情url检索发送成功");  
    }  
    else  
    {  
        NSLog(@"详情url检索发送失败");  
    }  
    //发起位置信息分享URL检索  
    //   BMKLocationShareURLOption *option = [[BMKLocationShareURLOption alloc]init];  
    //   option.snippet = @"上地10街10号";  
    //   option.name = @"百度大厦";  
    //   option.location = CLLocationCoordinate2D{40.055,116.037};  
    //   BOOL flag = [_searcher requestLocationShareURL:option];  
    //   [option release];  
    //   if(flag)  
    //   {  
    //        NSLog(@"位置信息分享URL检索发送成功");  
    //   }  
    //   else  
    //   {  
    //       NSLog(@"位置信息分享URL发送失败");  
    //    }  
 
    }  
 
    //实现Delegate处理回调结果  
    //处理Poi详情分享URL结果  
    - (void)onGetPoiDetailShareUrlResult:(BMKShareUrlSearch *)searcher result:(BMKShareURLResult *)result errorCode:(BMKSearchErrorCode)error{  
        if (error == BMK_SEARCH_NO_ERROR) {  
            //在此处理正常结果  
        }  
       else {  
            NSLog(@"抱歉,未找到结果");  
        }  
    }  
 
    //处理位置信息你分享了URL结果  
    //- (void)onGetLocationShareUrlResult:(BMKShareUrlSearch *)searcher result:(BMKShareURLResult *)result errorCode:(BMKSearchErrorCode)error{  
    //    if (error == BMK_SEARCH_NO_ERROR) {  
    //        在此处理正常结果  
    //    }  
    //    else {  
    //        NSLog(@"抱歉,未找到结果");  
    //    }  
    //}  
 
 
    //不使用时将delegate设置为 nil    
    -(void)viewWillDisappear:(BOOL)animated    
    {    
        _searcher.delegate = nil;    
    }

“公交/驾车/骑行/步行路线规“的划短串分享

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

//利用公交/驾车/骑行/步行路线规划检索,获取待分享的公交/驾车规划(具体方法请参考检索规划的介绍);

第一步,初始化并发起检索

    //初始化检索服务
    _shareurlsearch = [[BMKShareURLSearch alloc]init];
    //设置delegate
    _shareurlsearch.delegate = self;
 
    //构建路线规划短串分享检索信息类
    BMKRoutePlanShareURLOption *option = [[BMKRoutePlanShareURLOption alloc] init];
 
    //起点
    BMKPlanNode *fromNode = [[BMKPlanNode alloc] init];
    fromNode.name = @"百度大厦";
    fromNode.cityID = 131;
    option.from = fromNode;
 
    //终点
    BMKPlanNode *toNode = [[BMKPlanNode alloc] init];
    toNode.name = @"天安门";
    toNode.cityID = 131;
    option.to = toNode;
 
//    option.routePlanType = BMK_ROUTE_PLAN_SHARE_URL_TYPE_DRIVE;//驾车
//    option.routePlanType = BMK_ROUTE_PLAN_SHARE_URL_TYPE_WALK;//步行
//    option.routePlanType = BMK_ROUTE_PLAN_SHARE_URL_TYPE_RIDE;//骑行
    option.routePlanType = BMK_ROUTE_PLAN_SHARE_URL_TYPE_TRANSIT;//公交
    option.cityID = 131;//当进行公交路线规划短串分享且起终点通过关键字指定时,必须指定
    option.routeIndex = 0;//公交路线规划短串分享时使用,分享的是第几条线路
 
    //发起检索
    BOOL flag = [_shareurlsearch requestRoutePlanShareURL:option];
    if (flag) {
        NSLog(@"routePlanShortUrlShare检索发送成功");
    } else {
        NSLog(@"routePlanShortUrlShare检索发送失败");
    }

第二步,实现delegate方法,获取结果

/**
 *返回路线规划分享url
 *@param searcher 搜索对象
 *@param result 返回结果
 *@param error 错误号,@see BMKSearchErrorCode
 */
- (void)onGetRoutePlanShareURLResult:(BMKShareURLSearch *)searcher result:(BMKShareURLResult *)result errorCode:(BMKSearchErrorCode)error {
    NSLog(@"onGetRoutePlanShareURLResult error:%d", (int)error);
    if (error == BMK_SEARCH_NO_ERROR) {
        //share shore url is result.url
        //share code
    }
}