美文网首页iOS_不断学习iOS学习iOS 开发成长中心
关于系统自带定位跟百度地图定位差别,附赠百度代码

关于系统自带定位跟百度地图定位差别,附赠百度代码

作者: iOS_Gato_老猫 | 来源:发表于2016-12-23 14:14 被阅读192次

    系统自带定位 可以截取到 国 省 市 区 县 街道 经纬度

    
    #import <CoreLocation/CoreLocation.h>
    
    @interface HomeViewController ()<CLLocationManagerDelegate>
    {
        CLLocationManager * locationManager;
    }
    
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self locate];
    }
    
    
    - (void)locate{
        // 判断定位操作是否被允许
        if([CLLocationManager locationServicesEnabled]) {
            //定位初始化
            if (locationManager == nil) {
                locationManager = [[CLLocationManager alloc]init];
            }
            locationManager.delegate = self;
            [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
            if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 8.0) {
                [locationManager requestWhenInUseAuthorization];
            }
            [locationManager startUpdatingLocation];
        }else {
            //提示用户无法进行定位操作
            UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"提示" message:@"定位不成功 ,请确认开启定位" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
            [alertView show];
        }
        // 开始定位
        [locationManager startUpdatingLocation];
    }
    
    -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
        //此处locations存储了持续更新的位置坐标值,取最后一个值为最新位置,如果不想让其持续更新位置,则在此方法中获取到一个值之后让locationManager stopUpdatingLocation
        CLLocation *currentLocation = [locations lastObject];
        // 获取当前所在的城市名
        CLGeocoder *geocoder = [[CLGeocoder alloc] init];
        //根据经纬度反向地理编译出地址信息
        [geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *array, NSError *error)
         {
             if (array.count > 0)
             {
                 CLPlacemark *placemark = [array objectAtIndex:0];
                 //NSLog(@%@,placemark.name);//具体位置
                 //获取城市
                 NSString *city = placemark.locality;
                 NSString * neighborhood = placemark.subLocality;
                 if (!neighborhood) {
                     if (city) {
                         neighborhood = city;
                     }else{
                         neighborhood = placemark.administrativeArea;
                     }
                 }
                 if (!city) {
                     //四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)
                     city = placemark.administrativeArea;
                 }
                 self.cityName = city;
                 //             NSLog(@"定位完成:%@",self.cityName);
                 //系统会一直更新数据,直到选择停止更新,因为我们只需要获得一次经纬度即可,所以获取之后就停止更新
                 [manager stopUpdatingLocation];
    
                [self.leftButton setTitle:self.cityName forState:UIControlStateNormal];
                 
             }else if (error == nil && [array count] == 0)
             {
                 //             NSLog(@"No results were returned.");
             }else if (error != nil)
             {
                 //             NSLog(@"An error occurred = %@", error);
             }
         }];
    }
    

    百度地图 定位

    #import "MoreMapViewController.h"
    #import "GatoReturnButton.h"
    #import "GatoBaseHelp.h"
    #import "MoreMapTableViewCell.h"
    #import <BaiduMapAPI/BMKMapView.h>
    #import <BaiduMapAPI/BMKMapComponent.h>
    #import <BaiduMapAPI/BMKLocationService.h>
    #import <BaiduMapAPI/BMKGeocodeSearch.h>
    #import "UIView+Extension.h"
    #import <BaiduMapAPI/BMKPoiSearch.h>
    
    //引入周边雷达功能所有的头文件
    
    @interface MoreMapViewController ()<BMKMapViewDelegate,UIGestureRecognizerDelegate,BMKLocationServiceDelegate,BMKGeoCodeSearchDelegate,BMKGeoCodeSearchDelegate>
    {
        BOOL enableCustomMap;
        BMKPinAnnotationView *newAnnotation;
        BMKGeoCodeSearch *_geoCodeSearch;
        BMKReverseGeoCodeOption *_reverseGeoCodeOption;
        BMKMapView *_mapView;                //地图
        BMKGeoCodeSearch  *_geocodesearch;   //geo搜索服务
    }
    @property (nonatomic ,strong) BMKMapView* mapView;
    @property (nonatomic ,strong) BMKLocationService * locService;
    @property (nonatomic ,strong) UIButton * MyMapButton;
    @property (nonatomic ,strong) BMKUserLocation * userLocation;
    @property (nonatomic, strong) UISwipeGestureRecognizer *rightSwipeGestureRecognizer;
    @property (nonatomic, nonatomic) UIButton *mapPin;
    @property (nonatomic ,strong) NSMutableArray * dataArray;
    @property (nonatomic ,strong) UITextField * mapTextField;
    @end
    
    @implementation MoreMapViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.GatoTableview.frame = CGRectMake(0, 500 * Gato_Height_1334 , Gato_Width, Gato_Height - 500 * Gato_Height_1334);
        [self.view addSubview:self.GatoTableview];
        self.GatoTableview.backgroundColor = Gato_(240, 240, 240);
        GatoReturnButton *returnButton = [[GatoReturnButton alloc] initWithTarget:self IsAccoedingBar:YES];
        self.navigationItem.leftBarButtonItem = returnButton;
        [self addTheTextField];
        [self addBaiDuMap];
        [self rightGestuer];
        
        enableCustomMap = YES;
    }
    -(void)addBaiDuMap
    {
    
        //初始化BMKLocationService
        self.locService = [[BMKLocationService alloc]init];
        self.locService.delegate = self;
    
        //启动LocationService
        [self.locService startUserLocationService];
        
        BMKLocationViewDisplayParam* param = [[BMKLocationViewDisplayParam alloc] init];
        param.locationViewOffsetY = 0;//偏移量
        param.locationViewOffsetX = 0;
        param.isAccuracyCircleShow =YES;//设置是否显示定位的那个精度圈
        param.isRotateAngleValid = YES;
        [_mapView updateLocationViewWithParam:param];
        
        [self.view addSubview:self.mapView];
        
        [self.view addSubview:self.MyMapButton];
                               
    }
    -(void)rightGestuer
    {
        self.rightSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipes:)];
        
        
        self.rightSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
        
        
        [self.view addGestureRecognizer:self.rightSwipeGestureRecognizer];
    }
    - (void)handleSwipes:(UISwipeGestureRecognizer *)sender
    {
        if (sender.direction == UISwipeGestureRecognizerDirectionRight) {
            NSLog(@"我往右边滑动了一下屏幕");
        }
    }
    
    -(void)viewWillAppear:(BOOL)animated
    {
    //    [_mapView viewWillAppear];
        _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
    }
    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
        // 禁用 iOS7 返回手势
        if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
            self.navigationController.interactivePopGestureRecognizer.enabled = NO;
            self.navigationController.interactivePopGestureRecognizer.delegate = self;
        }
    }
    
    -(void)viewWillDisappear:(BOOL)animated
    {
        [super viewDidAppear:animated];
        [_mapView viewWillDisappear];
        _mapView.delegate = nil; // 不用时,置nil
        _geoCodeSearch.delegate = nil; // 不用时,置nil
    }
    -(void)viewDidDisappear:(BOOL)animated
    {
        self.navigationController.interactivePopGestureRecognizer.enabled = YES;
    }
    #pragma mark 地图定位
    //实现相关delegate 处理位置信息更新
    //处理方向变更信息
    - (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
    {
        //NSLog(@"heading is %@",userLocation.heading);
    }
    //处理位置坐标更新
    - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
    {
        self.userLocation = userLocation;
    
       
        if (self.userLocation.location.coordinate.latitude > 0) {
            if (enableCustomMap == YES) {
                [self MyMapButtonDidClicked:nil];
            }
        }
        
    }
    -(void)MyMapButtonDidClicked:(UIButton * )sender
    {
        [_mapView updateLocationData:self.userLocation];
        CLLocationCoordinate2D centerCoor = {self.userLocation.location.coordinate.latitude,self.userLocation.location.coordinate.longitude};
        //坐标更新
        _mapView.centerCoordinate = centerCoor;
        //当前坐标
        [_mapView updateLocationData:self.userLocation];
        _mapView.showsUserLocation = YES;
        
        //    _mapView.centerCoordinate = userLocation.location.coordinate;
        //    BMKCoordinateRegion region;
        //    region.center.latitude  = userLocation.location.coordinate.latitude;
        //    region.center.longitude = userLocation.location.coordinate.longitude;
        //    region.span.latitudeDelta  = 0.2;
        //    region.span.longitudeDelta = 0.2;
        if (_mapView)
        {
            //        _mapView.region = region;
            NSLog(@"当前的坐标是: %f,%f",self.userLocation.location.coordinate.latitude,self.userLocation.location.coordinate.longitude);
        }
        if (self.userLocation.location.coordinate.latitude > 0){
            enableCustomMap = NO;
            self.mapView.frame = CGRectMake(0, 64, Gato_Width, 500 * Gato_Height_1334);
        }
    }
    
    - (void)changeMapAction:(UISegmentedControl *)segment {
        /*
         *注:必须在BMKMapView对象初始化之前设置自定义地图样式,设置后会影响所有地图实例
         *设置方法:+ (void)customMapStyle:(NSString*) customMapStyleJsonFilePath;
         */
        enableCustomMap = segment.selectedSegmentIndex == 1;
    }
    
    - (void)mapViewDidFinishLoading:(BMKMapView *)mapView {
        //    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"BMKMapView控件初始化完成" delegate:nil cancelButtonTitle:@"知道了" otherButtonTitles: nil];
        //    [alert show];
        //    alert = nil;
    }
    
    
    - (void)mapView:(BMKMapView *)mapView onClickedMapBlank:(CLLocationCoordinate2D)coordinate {
        NSLog(@"map view: click blank");
    }
    
    - (void)mapview:(BMKMapView *)mapView onDoubleClick:(CLLocationCoordinate2D)coordinate {
        NSLog(@"map view: double click");
    }
    
    - (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
    {
        //屏幕坐标转地图经纬度
        CLLocationCoordinate2D MapCoordinate=[_mapView convertPoint:_mapPin.center toCoordinateFromView:_mapView];
        NSLog(@"latitude == %f longitude == %f",MapCoordinate.latitude,MapCoordinate.longitude);
        if (_geoCodeSearch==nil) {
            //初始化地理编码类
            _geoCodeSearch = [[BMKGeoCodeSearch alloc]init];
            _geoCodeSearch.delegate = self;
            
        }
        if (_reverseGeoCodeOption==nil) {
            
            //初始化反地理编码类
            _reverseGeoCodeOption= [[BMKReverseGeoCodeOption alloc] init];
        }
        
        //需要逆地理编码的坐标位置
        _reverseGeoCodeOption.reverseGeoPoint =MapCoordinate;
        [_geoCodeSearch reverseGeoCode:_reverseGeoCodeOption];
        
        //创建地理编码对象
        CLGeocoder *geocoder=[[CLGeocoder alloc]init];
        //创建位置
        CLLocation *location=[[CLLocation alloc]initWithLatitude:MapCoordinate.latitude longitude:MapCoordinate.longitude];
        
        //反地理编码
        [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
            //判断是否有错误或者placemarks是否为空
            if (error !=nil || placemarks.count==0) {
                NSLog(@"%@",error);
                return ;
            }
            for (CLPlacemark *placemark in placemarks) {
                //赋值详细地址
    //            NSLog(@"%@",placemark.name);
            }
        }];
    }
    //周边信息
    - (void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error{
        self.dataArray = [NSMutableArray array];
        for (BMKPoiInfo *poi in result.poiList) {
    //        NSLog(@"%@",poi.name);//周边建筑名
    //        NSLog(@"%d",poi.epoitype);
    //        NSLog(@"%@",poi.address);
            [self.dataArray addObject:poi];
        }
    
    //    NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
    //    [_mapView removeAnnotations:array];
    //    array = [NSArray arrayWithArray:_mapView.overlays];
    //    [_mapView removeOverlays:array];
    //    if (error == 0) {
    //        BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
    //        item.coordinate = result.location;
    //        item.title = result.address;
    //        [_mapView addAnnotation:item];
    //        _mapView.centerCoordinate = result.location;
    //        NSString* titleStr;
    //        NSString* showmeg;
    //        titleStr = @"反向地理编码";
    //        showmeg = [NSString stringWithFormat:@"%@",item.title];
    //        UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:titleStr message:showmeg delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定",nil];
    //        [myAlertView show];
    //    }
        [self.GatoTableview reloadData];
    }
    
    -(void)addTheTextField
    {
        self.navigationController.navigationBar.tintColor = [UIColor clearColor];
        self.navigationItem.hidesBackButton = YES;
        //self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:0.15 green:0.55 blue:0.91 alpha:1];
        
        UIView *naviView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 44)];
        naviView.backgroundColor = [UIColor clearColor];
    
        
        self.mapTextField = [[UITextField alloc] initWithFrame:CGRectMake(- 70 * Gato_Width_750, 25 * Gato_Height_1334, Gato_Width - 200* Gato_Width_750, 24)];
        self.mapTextField.returnKeyType = UIReturnKeyDone;
        self.mapTextField.borderStyle = UITextBorderStyleRoundedRect;
        self.mapTextField.placeholder = @"请输入您的收货地址";
        self.mapTextField.font = [UIFont systemFontOfSize:10.0];
        self.mapTextField.layer.masksToBounds = YES;
        self.mapTextField.layer.cornerRadius = 5;
        [self.mapTextField setValue:[UIColor colorWithRed:0.59 green:0.59 blue:0.59 alpha:1] forKeyPath:@"_placeholderLabel.textColor"];
        [naviView addSubview:self.mapTextField];
        
        UIButton *BtnRight = [UIButton buttonWithType:UIButtonTypeCustom];
        BtnRight.frame = CGRectMake(self.mapTextField.frame.size.width - 26, 4.5, 15, 15);
        //[BtnRight addTarget:self action:@selector(onSousuo) forControlEvents:UIControlEventTouchUpInside];
        [BtnRight setImage:[UIImage imageNamed:@"icon4"] forState:UIControlStateNormal];
        [self.mapTextField addSubview:BtnRight];
        
        UIButton *rightBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        rightBtn.frame = CGRectMake(230 * Gato_Width_750, 0, (Gato_Width/2+Gato_Width/5)+20, 44);
        rightBtn.backgroundColor = [UIColor clearColor];
        [rightBtn addTarget:self action:@selector(touchSearch:) forControlEvents:UIControlEventTouchUpInside];
        [naviView addSubview:rightBtn];
        self.navigationItem.titleView = naviView;
    }
    
    #pragma mark 根据 名字搜索
    
    -(void)touchSearch:(UIButton *)sender
    {
        _geocodesearch = [[BMKGeoCodeSearch alloc]init];
        _geocodesearch.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
        BMKGeoCodeSearchOption *geocodeSearchOption = [[BMKGeoCodeSearchOption alloc]init];
        geocodeSearchOption.city= GATO_CITY;
        geocodeSearchOption.address = self.mapTextField.text;
        BOOL flag = [_geocodesearch geoCode:geocodeSearchOption];
        if(flag)
        {
            NSLog(@"geo检索发送成功");
        }
        else
        {
            NSLog(@"geo检索发送失败");
        }
    
    }
    - (void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error {
        NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
        [_mapView removeAnnotations:array];
        array = [NSArray arrayWithArray:_mapView.overlays];
        [_mapView removeOverlays:array];
        if (error == 0) {
            BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
            item.coordinate = result.location;
            item.title = result.address;
            [_mapView addAnnotation:item];
            _mapView.centerCoordinate = result.location;
        }
    }
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return 1;
    }
    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return self.dataArray.count;
    }
    
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        
        MoreMapTableViewCell *cell = [MoreMapTableViewCell cellWithTableView:tableView];
        cell.backgroundColor = [UIColor whiteColor];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        if (indexPath.row == 0) {
            [cell FirstMapOrOther:YES];
        }else{
            [cell FirstMapOrOther:NO];
        }
        BMKPoiInfo *poi = self.dataArray[indexPath.row];
        [cell SetValueWithTheName:poi.name WithMap:[NSString stringWithFormat:@"%@ %@",poi.city,poi.address]];
        return cell;
    }
    
    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        return 120 * Gato_Height_1334;
    }
    
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
        BMKPoiInfo *poi = self.dataArray[indexPath.row];
        if (self.MapNameBlock) {
            self.MapNameBlock([NSString stringWithFormat:@"%@ %@ %@",poi.city,poi.address,poi.name]);
        }
        [self.navigationController popViewControllerAnimated:YES];
    }
    -(BMKMapView *)mapView
    {
        if (!_mapView) {
            _mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 0, 0)];
            [_mapView setZoomEnabled:YES];
            [_mapView setZoomLevel:16];//级别,3-19
            _mapView.showMapScaleBar = YES;//比例尺
            _mapView.mapScaleBarPosition = CGPointMake(10,_mapView.frame.size.height-45);//比例尺的位置
            _mapView.showsUserLocation=YES;//显示当前设备的位置
            _mapView.userTrackingMode = BMKUserTrackingModeFollow;//定位跟随模式
            [_mapView setMapType:BMKMapTypeStandard];//地图的样式(标准地图)
            
    //        self.mapPin = [UIButton buttonWithType:UIButtonTypeSystem];//大头针
    //        self.mapPin.width = 40;
    //        self.mapPin.height = 80;
    //        self.mapPin.center = self.mapView.center;
    //        [self.mapPin setBackgroundImage:[UIImage imageNamed:@"icon30"] forState:UIControlStateNormal];
    //        self.mapPin.backgroundColor = [UIColor greenColor];
    //        [self.mapView addSubview:self.mapPin];
            
            self.MyMapButton = [UIButton buttonWithType:UIButtonTypeCustom];
            self.MyMapButton.frame = CGRectMake(30 * Gato_Width_750, 30 * Gato_Height_1334, 33* Gato_Width_750, 33 * Gato_Height_1334);
            [self.MyMapButton setImage: [UIImage imageNamed:@"icon30"] forState:UIControlStateNormal];
            [self.MyMapButton addTarget:self action:@selector(MyMapButtonDidClicked:) forControlEvents:UIControlEventTouchUpInside];
            
        }
        return _mapView;
    }
    -(NSMutableArray * )dataArray
    {
        if (!_dataArray) {
            _dataArray = [NSMutableArray array];
        }
        return _dataArray;
    }
    

    百度地图效果图

    图片.png

    相关文章

      网友评论

      本文标题:关于系统自带定位跟百度地图定位差别,附赠百度代码

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