zoukankan      html  css  js  c++  java
  • 使用MapKit框架(持续更新)

    使用MapKit框架

    地图显示

    最简单显示地图的代码:

    //
    //  RootViewController.m
    //  CoreLocation
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "RootViewController.h"
    #import <MapKit/MapKit.h>
    
    @interface RootViewController ()
    
    @end
    
    @implementation RootViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 初始化地图控件
        MKMapView *mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
        
        // 地图的类型
        mapView.mapType = MKMapTypeStandard;
        
        // 视图的宽度和高度将和父视图的宽度一起成比例变化
        mapView.autoresizingMask = 
            UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        
        // 显示地图
        [self.view addSubview:mapView];
    }
    
    @end
    RootViewController

    注意:使用地图之前是需要引入MapKit框架的哦.

    autoresizingMask是干什么用的呢(实际上,我看过后还是不懂)?

    UIViewAutoresizingNone

    这个常量如果被设置,视图将不进行自动尺寸调整。

    UIViewAutoresizingFlexibleHeight

    这个常量如果被设置,视图的高度将和父视图的高度一起成比例变化。否则,视图的高度将保持不变。

    UIViewAutoresizingFlexibleWidth

    这个常量如果被设置,视图的宽度将和父视图的宽度一起成比例变化。否则,视图的宽度将保持不变。

    UIViewAutoresizingFlexibleLeftMargin

    这个常量如果被设置,视图的左边界将随着父视图宽度的变化而按比例进行调整。否则,视图和其父视图的左边界的相对位置将保持不变。

    UIViewAutoresizingFlexibleRightMargin

    这个常量如果被设置,视图的右边界将随着父视图宽度的变化而按比例进行调整。否则,视图和其父视图的右边界的相对位置将保持不变。

    UIViewAutoresizingFlexibleBottomMargin

    这个常量如果被设置,视图的底边界将随着父视图高度的变化而按比例进行调整。否则,视图和其父视图的底边界的相对位置将保持不变。

    UIViewAutoresizingFlexibleTopMargin

    这个常量如果被设置,视图的上边界将随着父视图高度的变化而按比例进行调整。否则,视图和其父视图的上边界的相对位置将保持不变。

    //
    //  RootViewController.m
    //  CoreLocation
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "RootViewController.h"
    #import <MapKit/MapKit.h>
    
    @interface RootViewController ()
    
    @end
    
    @implementation RootViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 初始化地图控件
        MKMapView *mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
        
        // 地图的类型
        mapView.mapType = MKMapTypeStandard;
        
        // 视图的宽度和高度将和父视图的宽度一起成比例变化
        mapView.autoresizingMask = 
            UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    
        // 显示用户所在位置(此处系统会询问你是否使用当前位置)
        mapView.showsUserLocation = YES;
        
        // 经纬度坐标(河南南阳)
        CLLocationCoordinate2D coor2d = {33.00, 112.52};
        
        // 地图缩放级别
        MKCoordinateSpan span = {5, 5};
        
        // 被显示的区域
        MKCoordinateRegion region = {coor2d, span};
        
        // 设置显示的区域
        [mapView setRegion:region];
        
        // 显示地图
        [self.view addSubview:mapView];
        
    
    }
    
    @end
    RootViewController.m

    位置定位

    //
    //  RootViewController.m
    //  CoreLocation
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "RootViewController.h"
    #import <MapKit/MapKit.h>
    
    @interface RootViewController ()<CLLocationManagerDelegate>
    
    @property (nonatomic, strong) CLLocationManager *locationManager;
    
    @end
    
    @implementation RootViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 判断定位功能是否可以使用
        if([CLLocationManager locationServicesEnabled])
        {
            // 初始化定位管理器
            _locationManager = [[CLLocationManager alloc] init];
            _locationManager.delegate = self;
            
            // 开始定位
            [_locationManager startUpdatingLocation];
        }
        else
        {
            NSLog(@"定位功能不可用");
        }
    }
    
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
        CLLocation *newLocation = [locations lastObject];
        NSLog(@"%@", newLocation);
        
        // 定位结束
        [manager stopUpdatingLocation];
    }
    
    - (void)locationManager:(CLLocationManager *)manager
           didFailWithError:(NSError *)error
    {
        NSLog(@"%@", error);
        
        // 定位结束
        [manager stopUpdatingLocation];
    }
    
    @end
    RootViewController.m

    为什么需要判断定位功能可不可用呢?下图可以看出为什么了.

    打印信息:

    2014-05-15 09:25:11.883 CoreLocation[17610:60b] <+37.78583400,-122.40641700> +/- 5.00m (speed -1.00 mps / course -1.00) @ 5/15/14, 9:25:11 AM China Standard Time

    本人将这个代理定位的方式改写成了可以使用block的方式:

    YXLocation.h

    //
    //  YXLocation.h
    //  CoreLocation
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import <MapKit/MapKit.h>
    
    @protocol YXLocationProtocol <NSObject>
    
    @optional
    - (void)currentLocation:(CLLocation *)location sucess:(BOOL)sucess;
    
    @end
    
    typedef void (^locationBlock_t)(CLLocation *currentLocation, BOOL sucess);
    
    @interface YXLocation : NSObject
    
    @property (nonatomic, copy,  readwrite)  locationBlock_t         locationBlock;
    @property (nonatomic, assign, readwrite) id<YXLocationProtocol>  protocol;
    
    @property (nonatomic, strong, readonly)  CLLocation             *location;
    
    - (void)start;
    
    @end
    Code

    YXLocation.m

    //
    //  YXLocation.m
    //  CoreLocation
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "YXLocation.h"
    
    @interface YXLocation ()<CLLocationManagerDelegate>
    
    @property (nonatomic, strong) CLLocationManager *locationManager;
    
    @end
    
    @implementation YXLocation
    
    - (instancetype)init
    {
        self = [super init];
        if (self)
        {
            _locationManager = [[CLLocationManager alloc] init];
            _locationManager.delegate = self;
        }
        return self;
    }
    
    - (void)start
    {
        if([CLLocationManager locationServicesEnabled])
        {
            [_locationManager startUpdatingLocation];
        }
        else
        {
            NSLog(@"定位功能没有开启");
            
            if (_locationBlock)
            {
                _locationBlock(nil, NO);
            }
            
            if (_protocol)
            {
                [_protocol currentLocation:nil sucess:NO];
            }
        }
    }
    
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
        CLLocation *newLocation = [locations lastObject];
        
        _location = newLocation;
        
        if (_locationBlock)
        {
            _locationBlock(newLocation, YES);
        }
        
        if (_protocol)
        {
            [_protocol currentLocation:newLocation sucess:YES];
        }
        
        [_locationManager stopUpdatingLocation];
    }
    
    - (void)locationManager:(CLLocationManager *)manager
           didFailWithError:(NSError *)error
    {
        NSLog(@"定位功能出错");
        
        if (_locationBlock)
        {
            _locationBlock(nil, NO);
        }
        
        if (_protocol)
        {
            [_protocol currentLocation:nil sucess:NO];
        }
    }
    
    @end
    Code

    将经纬度转换为有意义的地址

    //
    //  RootViewController.m
    //  CoreLocation
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "RootViewController.h"
    #import <MapKit/MapKit.h>
    
    @interface RootViewController ()<CLLocationManagerDelegate>
    
    @property (nonatomic, strong) CLLocationManager *locationManager;
    @property (nonatomic, strong) CLGeocoder        *geocoder;
    
    @end
    
    @implementation RootViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 判断定位功能是否可以使用
        if([CLLocationManager locationServicesEnabled])
        {
            // 初始化定位管理器
            _locationManager = [[CLLocationManager alloc] init];
            _locationManager.delegate = self;
            
            // 开始定位
            [_locationManager startUpdatingLocation];
        }
        else
        {
            NSLog(@"定位功能不可用");
        }
    }
    
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
        CLLocation *newLocation = [locations lastObject];
    
        // 初始化经纬度解析器
        _geocoder = [[CLGeocoder alloc] init];
        
        // 解析经纬度值
        [_geocoder reverseGeocodeLocation:newLocation
                        completionHandler:^(NSArray *placemarks, NSError *error) {
                            CLPlacemark *placemark = [placemarks objectAtIndex:0];
                            
                            // 将字典信息拼接起来
                            NSString *locatedAt = 
                                [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
                            
                            // 打印信息
                            NSLog(@"我在 %@",locatedAt);
                            
                            NSLog(@"国家代码 %@",placemark.ISOcountryCode);
                            NSLog(@"国家    %@",placemark.country);
                            NSLog(@"邮政编码 %@",placemark.postalCode);
                            NSLog(@"administrativeArea %@",placemark.administrativeArea);
                            NSLog(@"locality %@",placemark.locality);
                            NSLog(@"subLocality %@",placemark.subLocality);
                            NSLog(@"subThoroughfare %@",placemark.subThoroughfare);
                        }];
        
        // 定位结束
        [manager stopUpdatingLocation];
    }
    
    - (void)locationManager:(CLLocationManager *)manager
           didFailWithError:(NSError *)error
    {
        NSLog(@"%@", error);
        
        // 定位结束
        [manager stopUpdatingLocation];
    }
    
    @end
    RootViewController.m

    打印信息如下:

    2014-05-15 09:40:13.982 CoreLocation[2482:60b] 我在 中国北京市东城区东四街道东四朝阳门北小街2-1号
    2014-05-15 09:40:13.986 CoreLocation[2482:60b] 国家代码 CN
    2014-05-15 09:40:13.987 CoreLocation[2482:60b] 国家    中国
    2014-05-15 09:40:13.988 CoreLocation[2482:60b] 邮政编码 (null)
    2014-05-15 09:40:13.989 CoreLocation[2482:60b] administrativeArea 北京市
    2014-05-15 09:40:13.991 CoreLocation[2482:60b] locality (null)
    2014-05-15 09:40:13.992 CoreLocation[2482:60b] subLocality 东城区
    2014-05-15 09:40:13.993 CoreLocation[2482:60b] subThoroughfare 2-1号

    将有意义的地址转换为经纬度

    //
    //  RootViewController.m
    //  CoreLocation
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "RootViewController.h"
    #import <MapKit/MapKit.h>
    
    @interface RootViewController ()<CLLocationManagerDelegate>
    
    @property (nonatomic, strong) CLGeocoder *geocoder;
    
    @end
    
    @implementation RootViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        _geocoder = [[CLGeocoder alloc] init];
        
        [_geocoder geocodeAddressString:@"中国北京市东城区东四街道东四朝阳门北小街2-1号"
                      completionHandler:^(NSArray *placemarks, NSError *error)
         {
             
             if([placemarks count] > 0 && error == nil)
             {
                 
                 NSLog(@"发现了 %lu placemark(s).",(unsigned long)[placemarks count]);
                 
                 CLPlacemark *firstPlacemark = [placemarks objectAtIndex:0];
                 
                 NSLog(@"经度 = %f",firstPlacemark.location.coordinate.longitude);
                 NSLog(@"纬度 = %f",firstPlacemark.location.coordinate.latitude);
                 
             }
             else if ([placemarks count] == 0 && error == nil)
             {
                 NSLog(@"没有找到 placemarks.");
                 
             }
             else if (error != nil)
             {
                 NSLog(@"错误 = %@",error);
             }
         }];
    }
    
    @end
    RootViewController.m

    打印信息:

    2014-05-15 09:51:15.270 CoreLocation[2525:60b] 发现了 2 placemark(s).
    2014-05-15 09:51:15.274 CoreLocation[2525:60b] 经度 = 116.425960
    2014-05-15 09:51:15.275 CoreLocation[2525:60b] 纬度 = 39.931609

    直接显示用户当前位置

    //
    //  RootViewController.m
    //  CoreLocation
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "RootViewController.h"
    #import <MapKit/MapKit.h>
    
    @interface RootViewController ()<CLLocationManagerDelegate>
    
    @property (nonatomic, strong) CLLocationManager *locationManager;
    
    @end
    
    @implementation RootViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        
        // 判断定位功能是否可以使用
        if([CLLocationManager locationServicesEnabled])
        {
            // 初始化定位管理器
            _locationManager = [[CLLocationManager alloc] init];
            _locationManager.delegate = self;
            
            // 开始定位
            [_locationManager startUpdatingLocation];
        }
        else
        {
            NSLog(@"定位功能不可用");
        }
    }
    
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
        // 获取坐标信息
        CLLocation *newLocation = [locations lastObject];
        
        // 定位结束
        [manager stopUpdatingLocation];
        
        // 初始化地图控件
        MKMapView *mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
        
        // 地图的类型
        mapView.mapType = MKMapTypeStandard;
        
        // 视图的宽度和高度将和父视图的宽度一起成比例变化
        mapView.autoresizingMask = 
        UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        
        // 显示用户所在位置(此处系统会询问你是否使用当前位置)
        mapView.showsUserLocation = YES;
        
        // 地图缩放级别
        MKCoordinateSpan span = {0.02, 0.02};
        
        // 被显示的区域
        MKCoordinateRegion region = {newLocation.coordinate, span};
        
        // 设置显示的区域
        [mapView setRegion:region];
        
        // 显示地图
        [self.view addSubview:mapView];
    }
    
    - (void)locationManager:(CLLocationManager *)manager
           didFailWithError:(NSError *)error
    {
        NSLog(@"%@", error);
        
        // 定位结束
        [manager stopUpdatingLocation];
    }
    
    @end
    RootViewController.m

  • 相关阅读:
    hdu 1325 判断有向图是否为树
    poj 1182
    Ubuntu 系统 文件操作命令
    vim 快捷键大全
    Git 上传本地命令
    git错误:fatal: Not a git repository (or any of the parent directories): .git
    Git 如何回到过去,然后 再 回到将来
    Git 提供篇
    Linux 的cp命令
    Linux :: vi E212: Can't open file for writing
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3728443.html
Copyright © 2011-2022 走看看