poi(point of interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个poi可以是一栋房子、一个商铺、一个邮筒、一个公交站等。 百度地图sdk提供五种类型的poi检索:poi城市检索、poi周边检索、poi矩形区域检索、poi室内检索以及poi详情检索。
城市检索是根据关键字检索适用于在「某个行政区划,如北京市、四川省等」搜索某个名称相关的poi,例如:查找北京市的“小吃”。
poi城市检索功能使用的是地图sdk的检索功能,需要在工程中导入检索功能包baidumapapi_search.framework
#import#import
// 在桥接头文件bmkswiftdemo-bridging-header中添加 #import#import
bmkpoisearch *poisearch = [[bmkpoisearch alloc] init];
let poisearch = bmkpoisearch()
//此处需要先遵循协议poisearch.delegate = self;
//此处需要先遵循协议poisearch.delegate = self
bmkpoicitysearchoption 中tags字段可参考文档百度地图poi行业分类
//初始化请求参数类bmkcitysearchoption的实例 bmkpoicitysearchoption *cityoption = [[bmkpoicitysearchoption alloc] init]; //检索关键字,必选。举例:小吃 cityoption.keyword = @"小吃"; //区域名称(市或区的名字,如北京市,海淀区),最长不超过25个字符,必选 cityoption.city = @"北京市"; //检索分类,可选,与keyword字段组合进行检索,多个分类以","分隔。举例:美食,烧烤,酒店 cityoption.tags = @[@"美食",@"烧烤"]; //区域数据返回限制,可选,为yes时,仅返回city对应区域内数据 cityoption.iscitylimit = yes; //poi检索结果详细程度 //cityoption.scope = bmk_poi_scope_basic_information; //检索过滤条件,scope字段为bmk_poi_scope_detail_information时,filter字段才有效 //cityoption.filter = filter; //分页页码,默认为0,0代表第一页,1代表第二页,以此类推 cityoption.pageindex = 0; //单次召回poi数量,默认为10条记录,最大返回20条 cityoption.pagesize = 10;
//初始化请求参数类bmkcitysearchoption的实例 let cityoption = bmkpoicitysearchoption() //检索关键字,必选。举例:小吃 cityoption.keyword = "小吃" //区域名称(市或区的名字,如北京市,海淀区),最长不超过25个字符,必选 cityoption.city = "北京市" //检索分类,与keyword字段组合进行检索,多个分类以","分隔。举例:美食,酒店 cityoption.tags = ["美食","烧烤"] //区域数据返回限制,可选,为true时,仅返回city对应区域内数据 cityoption.iscitylimit = true /** poi检索结果详细程度 bmk_poi_scope_basic_information: 基本信息 bmk_poi_scope_detail_information: 详细信息 */ //cityoption.scope = bmkpoisearchscopetype.bmk_poi_scope_detail_information //检索过滤条件,scope字段为bmk_poi_scope_detail_information时,filter字段才有效 //cityoption.filter = option.filter //分页页码,默认为0,0代表第一页,1代表第二页,以此类推 cityoption.pageindex = 0 //单次召回poi数量,默认为10条记录,最大返回20条 cityoption.pagesize = 10
注意:scope字段默认为基本信息bmk_poi_scope_basic_information,如果要使用检索过滤条件filter字段,需要将scope字段设置为详细信息bmk_poi_scope_detail_information。
bool flag = [poisearch poisearchincity:cityoption]; if(flag) { nslog(@"poi城市内检索成功"); } else { nslog(@"poi城市内检索失败"); }
let flag = poisearch.poisearch(incity: cityoption) if flag { nslog("poi城市内检索成功") } else { nslog("poi城市内检索失败") }
#pragma mark - bmkpoisearchdelegate /** *返回poi搜索结果 *@param searcher 搜索对象 *@param poiresult 搜索结果列表 *@param errorcode 错误码,@see bmksearcherrorcode */ - (void)ongetpoiresult:(bmkpoisearch*)searcher result:(bmkpoisearchresult*)poiresult errorcode:(bmksearcherrorcode)errorcode { //bmksearcherrorcode错误码,bmk_search_no_error:检索结果正常返回 if (errorcode == bmk_search_no_error) { //在此处理正常结果 nslog(@"检索结果返回成功:%@",poiresult.poiinfolist); } else if (errorcode == bmk_search_ambiguous_keyword) { nslog(@"检索词有歧义"); } else { nslog(@"其他检索结果错误码相关处理"); } }
/** poi检索返回结果回调 @param searcher 检索对象 @param poiresult poi检索结果列表 @param error 错误码 */ func ongetpoiresult(_ searcher: bmkpoisearch, result poiresult: bmkpoisearchresult, errorcode: bmksearcherrorcode) { if errorcode == bmk_search_no_error { //在此处理正常结果 print("检索结果返回成功") } else if (errorcode == bmk_search_ambiguous_keyword) { print("检索词有歧义") } else { print("其他检索结果错误码相关处理") } }
通过代理返回的error判断检索是否成功,如果检索成功,可通过解析result字段获取具体的结果。具体使用示例可参照官方demo中的bmkpoicitysearchpage。 bmkpoisearchresult类结构如下图:
说明:
bmkpoisearchresult poi检索结果类
bmkpoiinfo poi信息类
bmkpoidetailinfo poi详情信息类
nsarray
周边检索是一个圆形范围,适用于以某个位置为中心点,自定义检索半径值,搜索某个位置附近的poi。例如:查找当前位置(40.051231, 116.282051)附近1000米范围内的“小吃”。
poi周边检索功能使用的是地图sdk的检索功能,需要在工程中导入检索功能包baidumapapi_search.framework
#import#import
// 在桥接头文件bmkswiftdemo-bridging-header中添加 #import#import
bmkpoisearch *poisearch = [[bmkpoisearch alloc] init];
let poisearch = bmkpoisearch()
//此处需要先遵循协议poisearch.delegate = self;
//此处需要先遵循协议poisearch.delegate = self
bmkpoinearbysearchoption 中tags字段可参考文档百度地图poi行业分类
//初始化请求参数类bmknearbysearchoption的实例 bmkpoinearbysearchoption *nearbyoption = [[bmkpoinearbysearchoption alloc] init]; //检索关键字,必选 nearbyoption.keywords = @[@"小吃"]; //检索中心点的经纬度,必选 nearbyoption.location = cllocationcoordinate2dmake(40.051231, 116.282051); //检索半径,单位是米。 nearbyoption.radius = 1000; //检索分类,可选。 nearbyoption.tags = @[@"美食"]; //是否严格限定召回结果在设置检索半径范围内。默认值为false。 nearbyoption.isradiuslimit = no; //poi检索结果详细程度 //nearbyoption.scope = bmk_poi_scope_basic_information; //检索过滤条件,scope字段为bmk_poi_scope_detail_information时,filter字段才有效 //nearbyoption.filter = filter; //分页页码,默认为0,0代表第一页,1代表第二页,以此类推 nearbyoption.pageindex = 0; //单次召回poi数量,默认为10条记录,最大返回20条。 nearbyoption.pagesize = 10;
//初始化请求参数类bmknearbysearchoption的实例 let nearbyoption = bmkpoinearbysearchoption() /** 检索关键字,必选。 在周边检索中关键字为数组类型,可以支持多个关键字并集检索,如银行和酒店。每个关键字对应数组一个元素。 最多支持10个关键字。 */ nearbyoption.keywords = ["小吃"] //检索中心点的经纬度,必选 nearbyoption.location = cllocationcoordinate2dmake(40.051231, 116.282051) /** 检索半径,单位是米。 当半径过大,超过中心点所在城市边界时,会变为城市范围检索,检索范围为中心点所在城市 */ nearbyoption.radius = 1000 /** 检索分类,可选。 该字段与keywords字段组合进行检索。 支持多个分类,如美食和酒店。每个分类对应数组中一个元素 */ nearbyoption.tags = ["美食"] /** 是否严格限定召回结果在设置检索半径范围内。默认值为false。 值为true代表检索结果严格限定在半径范围内;值为false时不严格限定。 注意:值为true时会影响返回结果中total准确性及每页召回poi数量,我们会逐步解决此类问题。 */ nearbyoption.isradiuslimit = false /** poi检索结果详细程度 bmk_poi_scope_basic_information: 基本信息 bmk_poi_scope_detail_information: 详细信息 */ //nearbyoption.scope = bmkpoisearchscopetype.bmk_poi_scope_detail_information //检索过滤条件,scope字段为bmk_poi_scope_detail_information时,filter字段才有效 //nearbyoption.filter = option.filter //分页页码,默认为0,0代表第一页,1代表第二页,以此类推 nearbyoption.pageindex = 0 //单次召回poi数量,默认为10条记录,最大返回20条。 nearbyoption.pagesize = 10
注意:scope字段默认为基本信息bmk_poi_scope_basic_information,如果要使用检索过滤条件filter字段,需要将scope字段设置为详细信息bmk_poi_scope_detail_information。
bool flag = [poisearch poisearchnearby:nearbyoption]; if (flag) { nslog(@"poi周边检索成功"); } else { nslog(@"poi周边检索失败"); }
/** 根据中心点、半径和检索词发起周边检索:异步方法,返回结果在bmkpoisearchdelegate 的ongetpoiresult里 nearbyoption 周边搜索的搜索参数类 成功返回yes,否则返回no */ let flag = poisearch.poisearchnear(by: nearbyoption) if flag { print("poi周边检索成功") } else { print("poi周边检索失败") }
#pragma mark - bmkpoisearchdelegate /** *返回poi搜索结果 *@param searcher 搜索对象 *@param poiresult 搜索结果列表 *@param errorcode 错误码,@see bmksearcherrorcode */ - (void)ongetpoiresult:(bmkpoisearch*)searcher result:(bmkpoisearchresult*)poiresult errorcode:(bmksearcherrorcode)errorcode { //bmksearcherrorcode错误码,bmk_search_no_error:检索结果正常返回 if (errorcode == bmk_search_no_error) { //在此处理正常结果 nslog(@"检索结果返回成功:%@",poiresult.poiinfolist); } else if (errorcode == bmk_search_ambiguous_keyword) { nslog(@"检索词有歧义"); } else { nslog(@"其他检索结果错误码相关处理"); } }
/** poi检索返回结果回调 @param searcher 检索对象 @param poiresult poi检索结果列表 @param error 错误码 */ func ongetpoiresult(_ searcher: bmkpoisearch, result poiresult: bmkpoisearchresult, errorcode: bmksearcherrorcode) { if errorcode == bmk_search_no_error { //在此处理正常结果 print("检索结果返回成功") } else if (errorcode == bmk_search_ambiguous_keyword) { print("检索词有歧义") } else { print("其他检索结果错误码相关处理") } }
通过代理返回的error判断检索是否成功,如果检索成功,可通过解析result字段获取具体的结果。具体使用示例可参照官方demo中的bmkpoinearbysearchpage,bmkpoisearchresult类结构如下图:
说明:
bmkpoisearchresult poi检索结果类
bmkpoiinfo poi信息类
bmkpoidetailinfo poi详情信息类
nsarray
poi矩形区域检索是在指定的绘制的矩形范围内(依据左下角坐标和右上角坐标绘制的矩形范围)检索poi。
poi矩形区域检索功能使用的是地图sdk的检索功能,需要在工程中导入检索功能包baidumapapi_search.framework
#import#import
// 在桥接头文件bmkswiftdemo-bridging-header中添加 #import#import
bmkpoisearch *poisearch = [[bmkpoisearch alloc] init];
let poisearch = bmkpoisearch()
//此处需要先遵循协议poisearch.delegate = self;
//此处需要先遵循协议poisearch.delegate = self
bmkpoiboundsearchoption中tags字段可参考文档百度地图poi行业分类
//初始化请求参数类bmkboundsearchoption的实例 bmkpoiboundsearchoption *boundoption = [[bmkpoiboundsearchoption alloc] init]; //检索关键字,必选。 boundoption.keywords = @[@"小吃"]; //矩形检索区域的左下角经纬度坐标,必选 boundoption.leftbottom = cllocationcoordinate2dmake(40.049557, 116.279295); //矩形检索区域的右上角经纬度坐标,必选 boundoption.righttop = cllocationcoordinate2dmake(40.056057, 116.308102); //检索分类 boundoption.tags = @[@"美食"]; //poi检索结果详细程度 //boundoption.scope = bmk_poi_scope_basic_information; //检索过滤条件,scope字段为bmk_poi_scope_detail_information时,filter字段才有效 //boundoption.filter = filter; //分页页码,默认为0,0代表第一页,1代表第二页,以此类推 boundoption.pageindex = 0; //单次召回poi数量,默认为10条记录,最大返回20条。 boundoption.pagesize = 10;
//初始化请求参数类bmkboundsearchoption的实例 let boundoption = bmkpoiboundsearchoption() /** 检索关键字,必选。 在矩形检索中关键字为数组类型,可以支持多个关键字并集检索,如银行和酒店。每个关键字对应数组一个元素。 最多支持10个关键字。 */ boundoption.keywords = ["小吃"] //矩形检索区域的左下角经纬度坐标,必选 boundoption.leftbottom = cllocationcoordinate2dmake(40.049557, 116.279295) //矩形检索区域的右上角经纬度坐标,必选 boundoption.righttop = cllocationcoordinate2dmake(40.056057, 116.308102) /** 检索分类 该字段与keywords字段组合进行检索。 支持多个分类,如美食和酒店。每个分类对应数组中一个元素 */ boundoption.tags = ["美食"] /** poi检索结果详细程度 bmk_poi_scope_basic_information: 基本信息 bmk_poi_scope_detail_information: 详细信息 */ //boundoption.scope = bmkpoisearchscopetype.bmk_poi_scope_detail_information //检索过滤条件,scope字段为bmk_poi_scope_detail_information时,filter字段才有效 //boundoption.filter = option.filter //分页页码,默认为0,0代表第一页,1代表第二页,以此类推 boundoption.pageindex = 0 //单次召回poi数量,默认为10条记录,最大返回20条 boundoption.pagesize = 10
注意:scope字段默认为基本信息bmk_poi_scope_basic_information,如果要使用检索过滤条件filter字段,需要将scope字段设置为详细信息bmk_poi_scope_detail_information。
bool flag = [poisearch poisearchinbounds:boundoption]; if(flag) { nslog(@"poi矩形区域内检索成功"); } else { nslog(@"poi矩形区域内检索失败"); }
/** 根据范围和检索词发起范围检索:异步方法,返回结果在bmkpoisearchdelegate 的ongetpoiresult里 boundoption 范围搜索的搜索参数类 成功返回yes,否则返回no */ let flag = poisearch.poisearchinbounds(boundoption) if flag { print("poi区域内检索成功") } else { print("poi区域内检索失败") }
#pragma mark - bmkpoisearchdelegate /** *返回poi搜索结果 *@param searcher 搜索对象 *@param poiresult 搜索结果列表 *@param errorcode 错误码,@see bmksearcherrorcode */ - (void)ongetpoiresult:(bmkpoisearch*)searcher result:(bmkpoisearchresult*)poiresult errorcode:(bmksearcherrorcode)errorcode { //bmksearcherrorcode错误码,bmk_search_no_error:检索结果正常返回 if (errorcode == bmk_search_no_error) { //在此处理正常结果 nslog(@"检索结果返回成功:%@",poiresult.poiinfolist); } else if (errorcode == bmk_search_ambiguous_keyword) { nslog(@"检索词有歧义"); } else { nslog(@"其他检索结果错误码相关处理"); } }
/** poi检索返回结果回调 @param searcher 检索对象 @param poiresult poi检索结果列表 @param error 错误码 */ func ongetpoiresult(_ searcher: bmkpoisearch, result poiresult: bmkpoisearchresult, errorcode: bmksearcherrorcode) { if errorcode == bmk_search_no_error { //在此处理正常结果 print("检索结果返回成功") } else if (errorcode == bmk_search_ambiguous_keyword) { print("检索词有歧义") } else { print("其他检索结果错误码相关处理") } }
通过代理返回的error判断检索是否成功,如果检索成功,可通过解析result字段获取具体的结果。具体使用示例可参照官方demo中的bmkpoiboundssearchpage。bmkpoisearchresult类结构如下图
说明:
bmkpoisearchresult poi检索结果类
bmkpoiinfo poi信息类
bmkpoidetailinfo poi详情信息类
nsarray
poi室内检索是指检索室内地图上的poi,输入室内id和关键字后,返回室内地图内的poi的点。
poi室内检索功能使用的是地图sdk的检索功能,需要在工程中导入检索功能包baidumapapi_search.framework
#import#import
// 在桥接头文件bmkswiftdemo-bridging-header中添加 #import#import
bmkpoisearch *poisearch = [[bmkpoisearch alloc] init];
let poisearch = bmkpoisearch()
//此处需要先遵循协议poisearch.delegate = self;
//此处需要先遵循协议poisearch.delegate = self
bmkpoiboundsearchoption中tags字段可参考文档百度地图poi行业分类
//初始化请求参数类bmkpoiindoorsearchoption的实例 bmkpoiindoorsearchoption *indooroption = [[bmkpoiindoorsearchoption alloc] init]; /** *室内检索唯一标识符,必选 *开启室内地图,在代理方法 *-(void)mapview:(bmkmapview *)mapview baseindoormapwithin:(bool)flag baseindoormapinfo:(bmkbaseindoormapinfo *)info *中可获取室内地图indoorid等相关信息 */ indooroption.indoorid = @"1261284358413615103"; //室内检索关键字,必选 indooroption.keyword = @"小吃"; //楼层(可选),设置后,会优先获取该楼层的室内poi,然后是其它楼层的。如“f3”,"b3"等。 indooroption.floor = @"f4"; //分页页码,默认为0,0代表第一页,1代表第二页,以此类推 indooroption.pageindex = 0; //单次召回poi数量,默认为10条记录,最大返回20条。 indooroption.pagesize = 10;
//初始化请求参数类bmkpoiindoorsearchoption的实例 let indooroption = bmkpoiindoorsearchoption() /** *室内检索唯一标识符,必选 *开启室内地图,在代理方法 *-(void)mapview:(bmkmapview *)mapview baseindoormapwithin:(bool)flag baseindoormapinfo:(bmkbaseindoormapinfo *)info *中可获取室内地图indoorid等相关信息 */ indooroption.indoorid = "1261284358413615103" //室内检索关键字,必选 indooroption.keyword = "小吃" //楼层(可选),设置后,会优先获取该楼层的室内poi,然后是其它楼层的。如“f3”,"b3"等。 indooroption.floor = "f4" //分页页码,默认为0,0代表第一页,1代表第二页,以此类推 indooroption.pageindex = 0 //单次召回poi数量,默认为10条记录,最大返回20条。 indooroption.pagesize = 10
bool flag = [poisearch poiindoorsearch:indooroption]; if(flag) { nslog(@"poi室内检索成功"); } else { nslog(@"poi室内检索失败"); }
let flag = poisearch.poiindoorsearch(indooroption) if flag { nslog("poi室内检索成功") } else { nslog("poi室内检索失败") }
#pragma mark - bmkpoisearchdelegate /** *返回poi室内搜索结果 *@param searcher 搜索对象 *@param poiindoorresult 搜索结果列表 *@param errorcode 错误码,@see bmksearcherrorcode */ - (void)ongetpoiindoorresult:(bmkpoisearch*)searcher result:(bmkpoiindoorsearchresult*)poiindoorresult errorcode:(bmksearcherrorcode)errorcode { //bmksearcherrorcode错误码,bmk_search_no_error:检索结果正常返回 if (errorcode == bmk_search_no_error) { //在此处理正常结果 nslog(@"检索结果返回成功:%@",poiindoorresult.poiindoorinfolist); } else if (errorcode == bmk_search_ambiguous_keyword) { nslog(@"检索词有歧义"); } else { nslog(@"其他检索结果错误码"); } }
/** poi室内检索结果回调 @param searcher 检索对象 @param poiindoorresult poi室内检索结果 @param errorcode 错误码,@see bmkclouderrorcode */ func ongetpoiindoorresult(_ searcher: bmkpoisearch!, result poiindoorresult: bmkpoiindoorsearchresult!, errorcode: bmksearcherrorcode) { if errorcode == bmk_search_no_error { //在此处理正常结果 print("检索结果返回成功") } else if (errorcode == bmk_search_ambiguous_keyword) { print("检索词有歧义") } else { print("其他检索结果错误码相关处理") } }
通过代理返回的error判断检索是否成功,如果检索成功,可通过解析result字段获取具体的结果。具体使用示例可参照官方demo中的bmkpoiindoorsearchpage。bmkpoiindoorsearchresult类结构如下图:
说明:
bmkpoisearchresult poi室内检索结果类
bmkpoiindoorinfo poi信息类
bmkpoidetailinfo 室内poi信息类
注意: 1.室内地图默认是关闭的,检索室内poi需要打开室内地图功能。 2.室内地图需要显示在屏幕范围内,才支持检索当前室内地图的室内poi。
poi详情检索提供查询单个poi的详情信息,比如好评、门店营业时间等。
poi详情检索功能使用的是地图sdk的检索功能,需要在工程中导入检索功能包baidumapapi_search.framework
#import#import
// 在桥接头文件bmkswiftdemo-bridging-header中添加 #import#import
bmkpoisearch *poisearch = [[bmkpoisearch alloc] init];
let poisearch = bmkpoisearch()
//此处需要先遵循协议poisearch.delegate = self;
//此处需要先遵循协议poisearch.delegate = self
//初始化请求参数类bmkpoidetailsearchoption的实例 bmkpoidetailsearchoption *detailoption = [[bmkpoidetailsearchoption alloc] init]; //poi的唯一标识符集合,必选 detailoption.poiuids = @[@"ba97895c02a6ddc7f60e775f"]; //poi检索结果详细程度 //detailoption.scope = bmk_poi_scope_basic_information;
//初始化请求参数类bmkpoidetailsearchoption的实例 let detailoption = bmkpoidetailsearchoption() //poi的唯一标识符集合,必选 detailoption.poiuids = ["ba97895c02a6ddc7f60e775f"] /** poi检索结果详细程度 bmk_poi_scope_basic_information: 基本信息 bmk_poi_scope_detail_information: 详细信息 */ //detailoption.scope = bmkpoisearchscopetype.bmk_poi_scope_detail_information
bool flag = [poisearch poidetailsearch:detailoption]; if(flag) { nslog(@"poi详情检索成功"); } else { nslog(@"poi详情检索失败"); }
/** 根据poi uid 发起poi详情检索:异步方法,返回结果在bmkpoisearchdelegate 的ongetpoidetailresult里 detailoption poi详情检索参数类 成功返回yes,否则返回no */ let flag = poisearch.poidetailsearch(detailoption) if flag { print("poi详情检索成功") } else { print("poi详情检索失败") }
#pragma mark - bmkpoisearchdelegate /** *返回poi详情搜索结果 *@param searcher 搜索对象 *@param poidetailresult 详情搜索结果 *@param errorcode 错误码,@see bmksearcherrorcode */ - (void)ongetpoidetailresult:(bmkpoisearch*)searcher result:(bmkpoidetailsearchresult*)poidetailresult errorcode:(bmksearcherrorcode)errorcode { //bmksearcherrorcode错误码,bmk_search_no_error:检索结果正常返回 if(errorcode == bmk_search_no_error){ //在此处理正常结果 nslog(@"检索结果正常返回:%@",poidetailresult.poiinfolist); }else{ nslog(@"其他检索结果错误码"); } }
/** poi详情检索结果回调 @param searcher 检索对象 @param poidetailresult poi详情检索结果 @param errorcode 错误码,@see bmkclouderrorcode */ func ongetpoidetailresult(_ searcher: bmkpoisearch!, result poidetailresult: bmkpoidetailsearchresult!, errorcode: bmksearcherrorcode) { if errorcode == bmk_search_no_error { //在此处理正常结果 print("检索结果返回成功") } else if (errorcode == bmk_search_ambiguous_keyword) { print("检索词有歧义") } else { print("其他检索结果错误码相关处理") } }
通过代理返回的error判断检索是否成功,如果检索成功,可通过解析result字段获取具体的结果。具体使用示例可参照官方demo中的bmkpoidetailsearchpage。bmkpoidetailsearchresult类结构如下图:
说明:
bmkpoidetailsearchresult poi详情检索结果类
bmkpoiinfo poi信息类
bmkpoidetailinfo poi详情信息类
nsarray