腾讯地图获取附近位置(逆向解析)+单次定位

最近公司要求添加定位功能,我们的需求是在全球都可以定位,经过了解腾讯地图API,发现定位不是太准,但是还是可以用到的。
下面跟大家分享一下腾讯地图单次定位:

集成腾讯地图SDK。在集成时需要注意:
76D5ABA1-D4A1-4DDD-AB91-52D1C29BE609.png

要用以上路径进行导入,我之前直接拖入的话会报错。但是只有我这样,我身边的狼友没有遇到。
集成报错的坑呢就遇到这一个。我在项目中主要用到的的逆向解析和单次定位。

单次定位代码:

/*****初始化*****/
- (void)configLocationManager
{
    self.locationManager = [[TencentLBSLocationManager alloc] init];
    
    [self.locationManager setDelegate:self];
    
    [self.locationManager setApiKey:@"自己申请的腾讯地图Key"];
    
    [self.locationManager setPausesLocationUpdatesAutomatically:NO];
    
    // 需要后台定位的话,可以设置此属性为YES。
    [self.locationManager setAllowsBackgroundLocationUpdates:NO];
    
    // 如果需要POI信息的话,根据所需要的级别来设定,定位结果将会根据设定的POI级别来返回,如:
    [self.locationManager setRequestLevel:TencentLBSRequestLevelName];
    
    // 申请的定位权限,得和在info.list申请的权限对应才有效
    CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
    if (authorizationStatus == kCLAuthorizationStatusNotDetermined) {
        [self.locationManager requestWhenInUseAuthorization];
    }
}

// 单次定位
- (void)startSingleLocation {
    [self.locationManager requestLocationWithCompletionBlock:
     ^(TencentLBSLocation *location, NSError *error) {
//         _theNameLab.text = [NSString stringWithFormat:@"国家:%@,省份:%@,城市:%@,地点:%@,街道:%@,名称:%@,区县:%@",location.nation,location.province,location.city,location.address,location.street,location.name,location.district];
         
         _theAddressArr = [[NSArray alloc]init];
         _theAddressArr =location.poiList;
         _AddressStr =[NSString stringWithFormat:@"%@%@            ",location.city,location.name];
         if ([_AddressStr isEqualToString:@"<null>            "]||_AddressStr == nil||[_AddressStr isEqualToString:@"(null)            "]) {
             _AddressStr = @"";
             _DiZhiBut.hidden = YES;
             theStr = @"";
         }else{
             _DiZhiBut.hidden = NO;
             [_DiZhiBut setTitle:_AddressStr forState:UIControlStateNormal];
             theStr = [NSString stringWithFormat:@"%f,%f",location.poiList[0].latitude,location.poiList[0].longitude];

         }
         
        theNameArr = [[NSMutableArray alloc]init];
        theAddressArr = [[NSMutableArray alloc]init];
         for (int yu =0; yu < _theAddressArr.count; yu++) {
             NSString *theNameStr = [NSString stringWithFormat:@"%@            ",location.poiList[yu].name];
             if ([theNameStr isEqualToString:@"<null>            "]||theNameStr == nil||[theNameStr isEqualToString:@"(null)            "]) {
                theNameStr = @"";
             }
             [theNameArr addObject:theNameStr];
             NSString *theOneAddressStr =[NSString stringWithFormat:@"%@            ",location.poiList[yu].address];
             if ([theOneAddressStr isEqualToString:@"<null>            "]||theOneAddressStr == nil||[theOneAddressStr isEqualToString:@"(null)            "]) {
                 theOneAddressStr = @"";
             }
             [theAddressArr addObject:theOneAddressStr];
         }
     }];
}
里面的代码可以忽略,根据自己的需求写。

//定位代理方法——————判断是否开启定位。我们需要在plist文件中添加字段。
- (void)tencentLBSLocationManager:(TencentLBSLocationManager *)manager
                 didFailWithError:(NSError *)error {
    CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
    if (authorizationStatus == kCLAuthorizationStatusDenied ||
        authorizationStatus == kCLAuthorizationStatusRestricted) {
//        [self.theNameLab setText:@"定位权限没开启!"];
        self.themessSwitch.on = NO;

        UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示"
                                                                       message:@"定位权限未开启,是否开启?"
                                                                preferredStyle:UIAlertControllerStyleAlert];
        [alert addAction:[UIAlertAction actionWithTitle:@"是"
                                                  style:UIAlertActionStyleDefault
                                                handler:^(UIAlertAction * _Nonnull action) {
                                                    if( [[UIApplication sharedApplication]canOpenURL:
                                                         [NSURL URLWithString:UIApplicationOpenSettingsURLString]] ) {
                                                        [[UIApplication sharedApplication] openURL:
                                                         [NSURL URLWithString:UIApplicationOpenSettingsURLString]];
                                                    }
                                                }]];
        
        [alert addAction:[UIAlertAction actionWithTitle:@"否"
                                                  style:UIAlertActionStyleDefault
                                                handler:^(UIAlertAction * _Nonnull action) {
                                                }]];
        
        [self presentViewController:alert animated:true completion:nil];
        
    } else {
        self.themessSwitch.on = YES;

//        [self.theNameLab setText:[NSString stringWithFormat:@"%@", error]];
    }
}

以上就是单次定位。

逆向解析:
逆向解析首先需要俩个值,1.经度2.纬度,通过这俩个值用get请求接口:
http://apis.map.qq.com/ws/geocoder/v1/?location=%@&get_poi=1&key=ke y&poi_options=address_format=short;radius=2000;page_size=20;page_index=1;policy=1
//里面的参数自己添加更改,根据腾讯地图文档。

1.通过值获取地址
 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
  
    NSString *theStrOne = [NSString stringWithFormat:@"http://apis.map.qq.com/ws/geocoder/v1/?location=%@&get_poi=1&key=key&poi_options=address_format=short;radius=2000;page_size=20;page_index=1;policy=1",_theStr];
    [manager GET:theStrOne parameters:nil progress:nil success:
     ^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
         _theAddressArr = [[NSArray alloc]init];
         NSString *theStr = [NSString stringWithFormat:@"%@",[responseObject objectForKey:@"message"]];
         if ([theStr isEqualToString:@"query ok"]) {
             _theAddressArr =[[responseObject objectForKey:@"result"]objectForKey:@"pois"];
             [_theAddressTable reloadData];
         }
     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
         
     }];
    
请求到的就是附近位置。

//PS:如有侵权,请联系删除,谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268