美文网首页
IOS学习笔记之MKMapView的简单使用

IOS学习笔记之MKMapView的简单使用

作者: 蜜糖阿橙哥c | 来源:发表于2017-06-29 12:08 被阅读0次
    #import <MapKit/MapKit.h>
    #import "ViewController.h"

    @interface ViewController ()<MKMapViewDelegate>//导入代理
    {
    CLLocationManager* _locationManager;
    }
    @property (strong, nonatomic) IBOutlet UITextField *latitudeTF;
    @property (strong, nonatomic) IBOutlet UITextField *longitudeTF;
    @property (strong, nonatomic) IBOutlet MKMapView *mapV;
    @property (strong, nonatomic) CLGeocoder *geocoder;

    @end

    @implementation ViewController

    -(void)viewDidLoad {
        [super viewDidLoad];
        _locationManager = [[CLLocationManager alloc] init];
         // 需要在Info.plist文件  添加权限  Privacy - Location When In Use Usage Description 和 Privacy - Location Always Usage Description
        // 请求获取定位授权 
        [_locationManager requestAlwaysAuthorization];
    //    初始化地理编码
        _geocoder = [[CLGeocoder alloc]init];
    //    设置地图标准类型
        _mapV.mapType = MKMapTypeStandard;
    //    缩放
        _mapV.zoomEnabled = YES;
    //    旋转
        _mapV.rotateEnabled = YES;
    //    滚动
        _mapV.scrollEnabled = YES;
    //    交通流量
        _mapV.showsTraffic = YES;
    //    指南针
        _mapV.showsCompass = YES;
        // 为MKMapView设置delegate
        _mapV.delegate = self;
        // 调用自己实现的方法设置地图的显示位置和显示区域
        [self locateToLatitude:23.126272 longitude:113.395568];
    //    / 创建一个手势处理器,用于检测、处理长按手势
        UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)];
    //    手势添加到视图
        [self.view addGestureRecognizer:gesture];
        
    }
    
    //查询按钮实现方法
    -(IBAction)getBtn:(UIButton *)sender {
        // 关闭两个文本框的虚拟键盘
        [_latitudeTF resignFirstResponder];
        [_longitudeTF resignFirstResponder];
        NSString* latitudeStr = _latitudeTF.text;
        NSString* longtitudeStr =_longitudeTF.text;
        // 如果用户输入的经度、纬度不为空
        if (latitudeStr != nil && latitudeStr.length > 0
            && longtitudeStr != nil && longtitudeStr.length > 0){
            // 调用自己实现的方法设置地图的显示位置和显示区域
            [self locateToLatitude:latitudeStr.floatValue
                         longitude:longtitudeStr.floatValue];
        }
    
    }
    
    //手势实现方法
    -(void)longPress:(UILongPressGestureRecognizer *)gesture{
        // 获取长按点的坐标
        CGPoint pos = [gesture locationInView:_mapV];
        // 将长按点的坐标转换为经度值、纬度值
        CLLocationCoordinate2D coord = [_mapV convertPoint:pos toCoordinateFromView:_mapV];
    
      //锚点和覆盖层
    
       #if 1//锚点
        // 将经度值、纬度值包装为CLLocation对象
        CLLocation *location = [[CLLocation alloc]initWithLatitude:coord.latitude longitude:coord.longitude];
        // 根据经度、纬度反向解析地址
        [_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
           
            if (placemarks != nil && placemarks.count >0 && error==nil) {
                 // 获取解析得到的第一个地址信息
                CLPlacemark *placemark = placemarks[0];
                // 获取地址信息中的FormattedAddressLines对应的详细地址
                NSArray* addrArray = placemark
                .addressDictionary[@"FormattedAddressLines"];
                // 将详细地址拼接成一个字符串
                NSMutableString* address = [[NSMutableString alloc] init];
                for(int i = 0; i < addrArray.count; i ++){
                    [address appendString:addrArray[i]];
                }
                // 创建MKPointAnnotation对象——代表一个锚点
                MKPointAnnotation *annotation = [[MKPointAnnotation alloc]init];
                annotation.title = placemark.name;
                annotation.subtitle = address;
                annotation.coordinate = coord;
                //添加到地图
                [_mapV addAnnotation:annotation];
                
            }
            
        }];
    #elif 0 //覆盖层
        // 创建MKCircle对象,该对象代表覆盖层
        MKCircle* circle = [MKCircle circleWithCenterCoordinate:coord radius:50];
        // 添加MKOverlay 
        [_mapV addOverlay:circle level:MKOverlayLevelAboveLabels];
        
    #endif
        
    }
    
    
    //自己定义定位方法
    -(void)locateToLatitude:(CGFloat)latitude longitude:(CGFloat)longitude{
        // 设置地图中心的经度、纬度
        CLLocationCoordinate2D center = {latitude,longitude};
        // 设置地图显示的范围,地图显示范围越小,细节越清楚
        MKCoordinateSpan span = MKCoordinateSpanMake(0.005,0.005);
        // 创建MKCoordinateRegion对象,该对象代表地图的显示中心和显示范围
        MKCoordinateRegion region =MKCoordinateRegionMake(center, span);
        // 设置当前地图的显示中心和显示范围
        [_mapV setRegion:region animated:YES];
        // 创建MKPointAnnotation对象——代表一个锚点
        MKPointAnnotation* annotation = [[MKPointAnnotation alloc] init];
        annotation.title = @"主标题";
        annotation.subtitle = @"详细地址";
        CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(
                                                                       latitude , longitude);
        annotation.coordinate = coordinate;
        // 添加锚点
        [_mapV addAnnotation:annotation];
    }
    
    //渲染覆盖层代理方法
    -(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay{
        MKCircle * circle = (MKCircle*)overlay;
        // 创建一个MKCircleRenderer对象
        MKCircleRenderer* render = [[MKCircleRenderer alloc] initWithCircle:circle];
        // 设置MKCircleRenderer的透明度
        render.alpha = 0.3;
        // 设置MKCircleRenderer的填充颜色和边框颜色
        render.fillColor = [UIColor blueColor];
        render.strokeColor = [UIColor redColor];
        return render;
    }
    
    //正向解析
        NSString *addr = self.addrTF.text;
        if (addr != nil && addr.length > 0) {
            [geocoder geocodeAddressString:addr completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
                // 如果解析结果的集合元素的个数大于1,则表明解析得到了经度、纬度信息
                if (placemarks.count > 0) {
                    CLPlacemark *placemark = placemarks[0];
                    CLLocation *location = placemark.location;
                    self.resultTF.text = [NSString stringWithFormat:@"%@的经度为:%g 纬度为:%g",addr,location.coordinate.longitude,location.coordinate.latitude];
                }
                else
                {
                    NSLog(@"地址无法解析");
                }
                
            }];
        }
    
    //反向解析
      NSString *longitudeStr = _longitudeTF.text;;
        NSString *latitudeStr = _latitudeTF.text;
    //    判断不为空
        if (latitudeStr != nil && latitudeStr.length > 0 && longitudeStr !=nil && longitudeStr.length >0) {
            // 将用户输入的经度、纬度封装成CLLocation对象
            CLLocation *location = [[CLLocation alloc]initWithLatitude:latitudeStr.floatValue longitude:longitudeStr.floatValue];
            [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
                // 如果解析结果的集合元素的个数大于1,则表明解析得到了经度、纬度信息
                if (placemarks.count > 0) {
                    // 只处理第一个解析结果,实际项目可使用列表让用户选择
                    CLPlacemark *placemark = placemarks[0];
                    // 获取详细地址信息
                    NSArray *addrArray = placemark.addressDictionary[@"FormattedAddressLines"];
                    // 将详细地址拼接成一个字符串
                    NSMutableString *addr = [[NSMutableString alloc]init];
                    
                    for (int i = 0; i < addrArray.count; i++) {
                        [addr appendString:addrArray[i]];
                    }
                    _resultTF.text = [NSString stringWithFormat:@"经度为:%g,纬度为:%g的地址为%@",location.coordinate.longitude,location.coordinate.latitude,addr];
                }
                else
                {
                    NSLog(@"您输入的纬度无法解析");
                }
                
            }];
            
            
        }
        
    

    相关文章

      网友评论

          本文标题:IOS学习笔记之MKMapView的简单使用

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