iOS开发中通过定位获取用户所在省、市、区、街道、地址、具体位置
2019-03-06 本文已影响117人
梁森的简书
这里以百度地图代码为例来进行说明
首先是进行定位,代码:
[self.locService startUserLocationService];
self.locService是BMKLocationService类对象,调用该对象的startUserLocationService方法即可进行定位。
注意:无网络情况下是无法实现定位的。
定位成功之后会有一个回调的代理方法:
#pragma mark - BMKLocationServiceDelegate
//处理位置坐标更新
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{
}
在定位成功的回调方法里我们使用CLGeocoder实例对象去获取用户定位信息,代码:
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation: userLocation.location completionHandler:^(NSArray *array, NSError *error) {
if (array.count > 0) {
CLPlacemark *placemark = [array objectAtIndex:0];
if (placemark != nil) {
NSDictionary *addressDictionary = placemark.addressDictionary;
NSString *state=[addressDictionary objectForKey:@"State"]; //省。直辖市 江西省
NSString *city=[addressDictionary objectForKey:@"City"]; //市 丰城市
NSString *subLocality=[addressDictionary objectForKey:@"SubLocality"]; //区
NSString *street=[addressDictionary objectForKey:@"Street"];//街道
NSLog(@"省:%@---市:%@---区:%@---街道:%@",state, city, subLocality, street);
//发起反向地理编码检索
BMKReverseGeoCodeSearchOption *reverseGeoCodeSearchOption = [[BMKReverseGeoCodeSearchOption alloc]init];
reverseGeoCodeSearchOption.location = userLocation.location.coordinate; // 用户的具体位置
if (self.completedBlock) {
if (state == nil || state.length == 0) {
self.completedBlock(city);
}else{
self.completedBlock(state);
}
}
BOOL flag = [self.searcher reverseGeoCode:reverseGeoCodeSearchOption];
if(flag){
LGJLog(@"反geo检索发送成功");
}else{
LGJLog(@"反geo检索发送失败");
}
}else{
if (self.faildBlock) {
self.faildBlock(error);
}
}
}
//找到了当前位置城市后就关闭服务
[self.locService stopUserLocationService];
}];
我们从placemark的addressDictionary属性里可以获取用户所在的省、市、区以及街道。
注意:如果我们获取的省为空,那么这个城市极有可能就是直辖市,这是我们使用字典中的@"City"所对应的市就可以了。
我们如果想获取用户的具体地址就需要我们进行反地理编码了,我们需要使用BMKGeoCodeSearch类对象调用reverseGeoCode方法进行反geo检索。反检索成功会回调一个代理方法:
#pragma mark - BMKGeoCodeSearchDelegate
//接收反向地理编码结果
-(void) onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeSearchResult *)result errorCode:(BMKSearchErrorCode)error{
if (error == BMK_SEARCH_NO_ERROR) {
//在此处理正常结果
NSArray * dataList = result.poiList;
self.selectInfo = dataList[0];
NSLog(@"POI名称:%@", self.selectInfo.name);
NSLog(@"POI地址:%@---省:%@---城市:%@---行政区域:%@", self.selectInfo.address, self.selectInfo.province, self.selectInfo.city,self.selectInfo.area);
}
else {
LGJLog(@"抱歉,未找到结果");
}
}
从selectInfo(BMKPoiInfo对象)中我们通过name能获取到用户所在具体位置能精确到用户所有的几号楼几座,通过address我们能获取用户所在的位置能精确到哪个院。
打印地址:
0.省市县.png
0.juti.png
之前遇到过一种情况,在自测的时候是没问题的,可发给测试人员去测的时候却发现无法进行反地理编码。这是因为自测和发包给测试人员测试的时候bundleid不一样,而百度地图Key使用的是同一个Key,从而导致无法进行反地理编码。最后对bundleid进行了一个判断,对使用的百度地图key进行了一个区分。
本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊