地理编码指的是将地址信息建立空间坐标关系的过程。又可分为正向地理编码和逆地理编码。
地址是按照行政区域层级关系标准化后的表示唯一位置的字符串,包含国家、市、区或县、乡或镇、村、街道、门牌号等信息。
正向地理编码指的是由地址信息转换为坐标点的过程。该功能适用于根据用户输入的地址确认用户具体位置的场景,常用于配送人员根据用户输入的具体地址找地点。
正地理编码检索功能使用的是地图SDK的检索功能,需要在工程中导入检索功能包BaiduMapAPI_Search.framework
#import <BaiduMapAPI_Base/BMKBaseComponent.h> #import <BaiduMapAPI_Search/BMKSearchComponent.h>
// 在桥接头文件BMKSwiftDemo-Bridging-Header中添加 #import <BaiduMapAPI_Base/BMKBaseComponent.h> #import <BaiduMapAPI_Search/BMKSearchComponent.h>
BMKGeoCodeSearch *search = [[BMKGeoCodeSearch alloc] init];
let geoCodeSearch = BMKGeoCodeSearch()
search.delegate = self;
geoCodeSearch.delegate = self
BMKGeoCodeSearchOption *geoCodeSearchOption = [[BMKGeoCodeSearchOption alloc]init]; geoCodeSearchOption.address = @"海淀区上地十街十号"; geoCodeSearchOption.city = @"北京";
//初始化请求参数类BMKBMKGeoCodeSearchOption的实例 let geoCodeOption = BMKGeoCodeSearchOption() /** 待解析的地址。必选。 可以输入2种样式的值,分别是: 1、标准的结构化地址信息,如北京市海淀区上地十街十号 【推荐,地址结构越完整,解析精度越高】 2、支持“*路与*路交叉口”描述方式,如北一环路和阜阳路的交叉路口 注意:第二种方式并不总是有返回结果,只有当地址库中存在该地址描述时才有返回。 */ geoCodeOption.address = "海淀区上地十街十号" /** 地址所在的城市名。可选。 用于指定上述地址所在的城市,当多个城市都有上述地址时,该参数起到过滤作用。 注意:指定该字段,不会限制坐标召回城市。 */ geoCodeOption.city = "北京"
BOOL flag = [search geoCode: geoCodeSearchOption]; if (flag) { NSLog(@"geo检索发送成功"); } else { NSLog(@"geo检索发送失败"); }
/** 根据地址名称获取地理信息:异步方法,返回结果在BMKGeoCodeSearchDelegate的 onGetAddrResult里 geoCodeOption geo检索信息类 成功返回YES,否则返回NO */ let flag = geoCodeSearch.geoCode(geoCodeOption) if flag { print("地理编码检索成功") } else { print("地理检索失败") }
/** 正向地理编码检索结果回调 @param searcher 检索对象 @param result 正向地理编码检索结果 @param error 错误码,@see BMKCloudErrorCode */ - (void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeSearchResult *)result errorCode:(BMKSearchErrorCode)error { if (error == BMK_SEARCH_NO_ERROR) { //在此处理正常结果 } else { NSLog(@"检索失败"); } }
/** 正向地理编码检索结果回调 @param searcher 检索对象 @param result 正向地理编码检索结果 @param error 错误码,@see BMKCloudErrorCode */ func onGetGeoCodeResult(_ searcher: BMKGeoCodeSearch!, result: BMKGeoCodeSearchResult!, errorCode error: BMKSearchErrorCode) { if (error == BMK_SEARCH_NO_ERROR) { //在此处理正常结果 } else { NSLog(@"检索失败"); } }
通过代理返回的error判断检索是否成功,如果检索成功,可通过解析result字段获取具体的结果。具体使用示例可参照官方demo中的BMKGeoCodeSearchPage。BMKGeoCodeSearchResult类结构如下图:
说明:
BMKGeoCodeSearchResult 正地址编码结果类
CLLocationCoordinate2D location 地址对应的经纬度坐标
逆地理编码服务实现了将地址坐标转换为标准地址的过程。逆地理编码提供了坐标定位引擎,帮助用户通过地面某个地物的坐标值来反向查询得到该地物所在的行政区划、所处街道,召回周边地标类POI服务,以及最匹配的标准地址信息。通过丰富的标准地址库中的数据,可帮助用户在进行移动端查询、商业分析、规划分析等领域创造无限价值。
常用于根据定位的坐标来获取该地点的位置详细信息,与定位功能是黄金搭档。
逆地理编码检索功能使用的是地图SDK的检索功能,需要在工程中导入检索功能包BaiduMapAPI_Search.framework
#import <BaiduMapAPI_Base/BMKBaseComponent.h> #import <BaiduMapAPI_Search/BMKSearchComponent.h>
// 在桥接头文件BMKSwiftDemo-Bridging-Header中添加 #import <BaiduMapAPI_Base/BMKBaseComponent.h> #import <BaiduMapAPI_Search/BMKSearchComponent.h>
BMKGeoCodeSearch *search = [[BMKGeoCodeSearch alloc] init];
let geoCodeSearch = BMKGeoCodeSearch()
search.delegate = self;
geoCodeSearch.delegate = self
BMKReverseGeoCodeSearchOption *reverseGeoCodeOption = [[BMKReverseGeoCodeSearchOption alloc]init]; reverseGeoCodeOption.location = CLLocationCoordinate2DMake(39.915, 116.404); // 是否访问最新版行政区划数据(仅对中国数据生效) reverseGeoCodeOption.isLatestAdmin = YES;
//初始化请求参数类BMKReverseGeoCodeOption的实例 let reverseGeoCodeOption = BMKReverseGeoCodeSearchOption() //待解析的经纬度坐标(必选) reverseGeoCodeOption.location = CLLocationCoordinate2DMake(39.915, 116.404) //是否访问最新版行政区划数据(仅对中国数据生效) reverseGeoCodeOption.isLatestAdmin = true
BOOL flag = [search reverseGeoCode: reverseGeoCodeOption]; if (flag) { NSLog(@"逆geo检索发送成功"); } else { NSLog(@"逆geo检索发送失败"); }
/** 根据地理坐标获取地址信息:异步方法,返回结果在BMKGeoCodeSearchDelegate的 onGetAddrResult里 reverseGeoCodeOption 反geo检索信息类 成功返回YES,否则返回NO */ let flag = geoCodeSearch.reverseGeoCode(reverseGeoCodeOption) if flag { print("反地理编码检索成功") } else { print("反地理编码检索失败") }
/** 反向地理编码检索结果回调 @param searcher 检索对象 @param result 反向地理编码检索结果 @param error 错误码,@see BMKCloudErrorCode */ - (void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeSearchResult *)result errorCode:(BMKSearchErrorCode)error { if (error == BMK_SEARCH_NO_ERROR) { //在此处理正常结果 } else { NSLog(@"检索失败"); } }
/** 反向地理编码检索结果回调 @param searcher 检索对象 @param result 反向地理编码检索结果 @param error 错误码,@see BMKCloudErrorCode */ func onGetReverseGeoCodeResult(_ searcher: BMKGeoCodeSearch!, result: BMKReverseGeoCodeSearchResult!, errorCode error: BMKSearchErrorCode) { if (error == BMK_SEARCH_NO_ERROR) { //在此处理正常结果 } else { NSLog(@"检索失败"); } }
通过代理返回的error判断检索是否成功,如果检索成功,可通过解析result字段获取具体的结果。具体使用示例可参照官方demo中的BMKReverseGeoCodeSearchPage。BMKReverseGeoCodeSearchResult类结构如下图:
说明:
BMKReverseGeoCodeSearchResult 逆地理编码检索结果类
BMKAddressComponent 地址结果的层次化信息类
NSArray <BMKPoiInfo *> *poiList 地址周边POI信息,成员类型为BMKPoiInfo
NSArray <BMKSearchRGCRegionInfo *> *poiRegions 地址所属区域面信息