您当前的位置: iOS SDK > 开发指南 > LBS.云检索
LBS.云检索

简介

百度地图LBS云是百度地图针对LBS开发者全新推出的平台级服务,不仅适用PC应用开发,同时适用移动设备应用的开发。使用LBS云,可以实现移动开发者存储海量位置数据的服务器零成本及维护压力,且支持高效检索用户数据,且实现地图展现。 如何检索开发者自己的数据:

第一步,数据存储:首先开发者需要将待检索数据存入LBS云管理后台

第二步,检索:利用SDK为开发者提供的接口检索自己的数据;

第三步,展示:开发者可根据自己的实际需求以多种形式(如结果列表、地图模式等)展现自己的数据。

坐标说明

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

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

云检索

开发者在完成数据的LBS云端存储之后,便可调用SDK云检索服务,检索自己存储在云端的数据。具体方法如下:

百度地图API提供以下几类云检索类型:本地检索,周边检索,矩形检索,详情检索。 此处以本地检索和详情检索为例说明:

第一步,在ViewController.h中声明BMKCloudSearch对象,并将ViewController实现BMKCloudSearchDelegate协议,代码如下:

@interface CloudSearchDemoViewController : UIViewController<BMKMapViewDelegate, BMKCloudSearchDelegate>{  
    IBOutlet BMKMapView* _mapView;  
    BMKCloudSearch* _search;  
}

第二步,在ViewController.m的viewDidLoad中创建BMKCloudSearch对象,设置对应的delegate,代码如下:

- (void)viewDidLoad {  
    [super viewDidLoad];  
    //初始化云检索服务  
    _search = [[BMKCloudSearch alloc] init];  
    _search.delegate = self;  
}

第三步,发起本地云检索,并实现BMKCloudSearchDelegate协议中获取云检索结果的方法,代码如下:

//发起本地云检索  
-(IBAction)onClickLocalSearch{  
    BMKCloudLocalSearchInfo *cloudLocalSearch = [[BMKCloudLocalSearchInfo alloc] init];  
    /* 
    * 本示例代码使用了测试ak和测试数据,开发者在检索自己LBS数据之前,需替换 cloudLocalSearch.ak
    * 和cloudLocalSearch.geoTableId的值
    * 
    * 1、替换cloudLocalSearch.ak的值:
    * (1)请访问http://lbsyun.baidu.com/apiconsole/key申请一个“服务端”的ak,其他类型的ak无效;
    * (2)将申请的ak替换cloudLocalSearch.ak的值;
    *
    * 2、替换cloudLocalSearch.geoTableId值:
    * (1)申请完服务端ak后访问http://lbsyun.baidu.com/datamanager/datamanage创建一张表;
    * (2)在“表名称”处自由填写表的名称,如MyData,点击保存;
    * (3)“创建”按钮右方将会出现形如“MyData(34195)”字样,其中的“34195”即为geoTableId的值;
    * (4)添加或修改字段:点击“字段”标签修改和添加字段,然后保存;
    * (5)添加数据:
    *  a、标注模式:“数据” ->“标注模式”,输入要添加的地址然后“百度一下”,点击地图蓝色图标,再点击保存即可;
    *  b、批量模式: “数据” ->“批量模式”,可上传文件导入,具体文件格式要求请参见当页的“批量导入指南”;
    * (6)选择左边“设置”标签,“是否发布到检索”选择“是”,然后"保存";
    * (7)数据发布后,替换cloudLocalSearch.geoTableId的值即可;
 
    * 备注:每创建一张新表后需要选择发布到检索并保存,否则将会出现检索不到数据的情况 
    */  
    cloudLocalSearch.ak = @"B266f735e43ab207ec152deff44fec8b";
    cloudLocalSearch.geoTableId = 31869; 
    cloudLocalSearch.pageIndex = 0;
    cloudLocalSearch.pageSize = 10; 
 
    cloudLocalSearch.region = @"北京市";  
    cloudLocalSearch.keyword = @"天安门";  
    BOOL flag = [_search localSearchWithSearchInfo:cloudLocalSearch];  
    [cloudLocalSearch release];  
    if(flag){  
        NSLog(@"本地云检索发送成功");  
    }else{  
        NSLog(@"本地云检索发送失败");  
    }  
}  
//返回云检索结果回调  
- (void)onGetCloudPoiResult:(NSArray*)poiResultList searchType:(int)type errorCode:(int)error{  
    // 清楚屏幕中所有的annotation  
    NSArray* array = [NSArray arrayWithArray:_mapView.annotations];  
     [_mapView removeAnnotations:array];  
    if (error == BMKErrorOk) {  
        BMKCloudPOIList* result = [poiResultList objectAtIndex:0];  
        for (int i = 0; i < result.POIs.count; i++) {  
            BMKCloudPOIInfo* poi = [result.POIs objectAtIndex:i];  
            BMKPointAnnotation* item = [[BMKPointAnnotation alloc] init];  
            CLLocationCoordinate2D pt = (CLLocationCoordinate2D){ poi.longitude,poi.latitude};  
            item.coordinate = pt;  
            item.title = poi.title;  
            [_mapView addAnnotation:item];  
            [item release];  
        }  
    } else {  
        NSLog(@"error ==%d",error);  
    }  
}

第四步,发起详情云检索,并实现BMKCloudSearchDelegate协议中获取云检索详情结果的方法,代码如下:

//发起详情云检索  
-(IBAction)onClickDetailSearch{  
    BMKCloudDetailSearchInfo *cloudDetailSearch = [[BMKCloudDetailSearchInfo alloc] init];  
    cloudDetailSearch.ak = @"B266f735e43ab207ec152deff44fec8b"; 
    cloudDetailSearch.geoTableId = 31869;
    cloudDetailSearch.uid = @"19150264";
    BOOL flag = [_search detailSearchWithSearchInfo:cloudDetailSearch];  
    [cloudDetailSearch release];  
    if(flag){  
        NSLog(@"详情云检索发送成功");  
    }else{  
        NSLog(@"详情云检索发送失败");  
    }  
}  
- (void)onGetCloudPoiDetailResult:(BMKCloudPOIInfo*)poiDetailResult searchType:(int)type errorCode:(int)error{  
    // 清除屏幕中所有的annotation  
    NSArray* array = [NSArray arrayWithArray:_mapView.annotations];  
    [_mapView removeAnnotations:array];  
    if (error == BMKErrorOk) {  
        BMKCloudPOIInfo* poi = [poiDetailResult retain];  
        BMKPointAnnotation* item = [[BMKPointAnnotation alloc] init];  
        CLLocationCoordinate2D pt = (CLLocationCoordinate2D){ poi.longitude,poi.latitude};   
        item.coordinate = pt;  
        item.title = poi.title;  
        [_mapView addAnnotation:item];  
        [poi release];  
        [item release];  
    } else {  
        NSLog(@"error ==%d",error);  
    }  
}

通过以上几步操作,即可完成LBS云检索,运行结果如下图所示:

1.本地云检索

ioslbs1.png

2.详情云检索

ioslbs2.png

LBS云逆地理编码 (简称云RGC)

云逆地理编码(云RGC),是以逆地理编码服务为基础,开放的一套个性化位置描述服务。开发者可自定义用于进行逆地理编码计算的地理数据,以训练出最适用于真实业务场景的位置描述服务。如:坐标“40.055743,116.308243” 逆地理编码推荐结果为真实地物“百度大厦”,通过云逆地理编码服务,可将该坐标定义为“百度班车上车点”、“西二旗快递集中收发处”等更个性化的位置描述。

适用于如下业务场景:

1、自定义业务地点的位置描述。如,专车、拼车类开发者可定义常用上下车地点,从而根据用户当前位置进行最优推荐,提升服务效率和用户体验。

2、自定义业务片区的位置描述。如,同城配送开发者通过定义服务网点区域,可快速计算出用户订单坐标所在网点的位置描述,同时也可作为参考依据实现订单自动分拣。

3、补充重点业务地区所需且未在地图上体现的基础地物或行业专类位置描述。如,社区服务类开发者需要根据用户所在位置的场景来推送定制服务,可按需定义或丰富小区周边公共设施。

三个步骤开始使用云逆地理编码:

61e86572ea2319767344a03e27245306.png

LBS云RGC API对此功能的详细说明:

http://lbsyun.baidu.com/index.php?title=lbscloud/api/cloudrgc/about

地图SDK中开发时,需注意以下几点:

1、同一个开发者账户下的ak,可共用此账户下的“位置数据表”, 换句话说,其他开发者账户下的ak,无法使用其他账户下的“位置数据表”。

开发过程中,可使用自有的开发账户下ak和“位置数据表”调试;但上线前,必须需更改为官方账户下的ak,即可调用官方“位置数据表”。

2、开发者可通过云存储服务维护更新位置数据,实时地在云逆地理编码中体现。

3、如请求“位置数据表”提示“返回参数错误”,请检查tableid 和坐标格式是否正确。

云RGC调用方法,与云检索调用方式相同,方法如下

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

//初始化云检索服务
_search = [[BMKCloudSearch alloc]init];
_search.delegate = self;
//构造云RGC检索信息类
    BMKCloudReverseGeoCodeSearchInfo *search = [[BMKCloudReverseGeoCodeSearchInfo alloc]init];
    search.geoTableId = 148136;//请换用自己的geoTableId
    search.reverseGeoPoint = CLLocationCoordinate2DMake(39.915, 116.404);
    //发起云RGC检索
    BOOL flag = [_search cloudReverseGeoCodeSearch:search];
    if (flag) {
        NSLog(@"云rgc检索发送成功");
    } else {
        NSLog(@"云rgc检索发送失败");
    }

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

/**
 *返回云检索反geo检索结果
 *@param cloudRGCResult 搜索结果
 *@param type 返回结果类型: BMK_CLOUD_RGC_SEARCH
 *@param error 错误号,@see BMKCloudErrorCode
 */
- (void)onGetCloudReverseGeoCodeResult:(BMKCloudReverseGeoCodeResult *)cloudRGCResult searchType:(BMKCloudSearchType)type errorCode:(NSInteger)errorCode {
    NSLog(@"onGetCloudReverseGeoCodeResult:searchType==%d,error==%d", (int)type, (int)errorCode);
    if (errorCode == BMKErrorOk) {
        //成功获取结果
    } else {
        //检索失败
    }
}

注意事项

1.LBS.云检索服务允许用户检索自有数据,包括本地检索、周边检索、矩形检索、详情检索,该服务对开发者免费开放;

2. 官方iOS SDK的云检索示例代码中,使用了测试ak,从而可以检索相关测试数据,开发者在实际使用过程中需将测试ak更换为自己的ak(此ak必须为服务端ak),还需将测试的geoTableId更换为自己的geoTableId,具体位置请参考云检索示例代码“本地云检索”中的注释;

3. 欲详细了解LBS.云的使用方法,请访问LBS.云开发指南;存入待检索数据,请访问LBS.云管理后台

4. 开发过程中如有任何问题,也可以访问LBS开放平台论坛的“LBS.云”或“iOS开发”版块进行询问和反馈。

5. LBS云检索暂不支持多实例。