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

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

作者: 锦箫_1 | 来源:发表于2018-01-25 15:07 被阅读1848次

最近公司要求添加定位功能,我们的需求是在全球都可以定位,经过了解腾讯地图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:如有侵权,请联系删除,谢谢。

相关文章

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/gkdlaxtx.html