码迷,mamicode.com
首页 > 移动开发 > 详细

iOS地图

时间:2016-06-01 21:16:00      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

地图

1.主要用到了地图展示和定位功能

CoreLocation框架的使用:

导入头文件
        #import <CoreLocation/CoreLocation.h>
CoreLocation框架使用须知
        CoreLocation框架中所有数据类型的前缀都是CL
        CoreLocation中使用CLLocationManager对象来做用户定位

1.引入头文件

#import <CoreLocation/CoreLocation.h>

 

 2.声明属性

//CLLocationManager用于管理  定位管理器
@interface ViewController ()<CLLocationManagerDelegate>
//定位管理器
@property(nonatomic,strong)CLLocationManager *Manager;

//编码与反编码的类
@property (nonatomic, strong) CLGeocoder *geocoder;
@end

3.隐私设置  定位管理器设置

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //定位的步骤
    //第一步:初始化定位管理器
    self.Manager = [CLLocationManager new];
    
    //第二步:进行隐私的判断并授权

    //进行隐私的判断
    if (![CLLocationManager locationServicesEnabled]) {//可用的
        NSLog(@"是否前往隐私进行设置允许定位");
    }
    //根据状态进行授权
//    if ([[[UIDevice currentDevice]systemVersion]integerValue] >= 8.0) {//进行版本的判断
        if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorizedWhenInUse) {
            //定位服务授权状态,返回枚举类型:
//            kCLAuthorizationStatusNotDetermined: 用户尚未做出决定是否启用定位服务
//            kCLAuthorizationStatusRestricted: 没有获得用户授权使用定位服务,可能用户没有自己禁止访问授权
//            kCLAuthorizationStatusDenied :用户已经明确禁止应用使用定位服务或者当前系统定位服务处于关闭状态
//            kCLAuthorizationStatusAuthorizedAlways: 应用获得授权可以一直使用定位服务,即使应用不在使用状态
//            kCLAuthorizationStatusAuthorizedWhenInUse: 使用此应用过程中允许访问定位服务
            //在授权请求之前需要在inforPlist中设置允许定位的内容:NSLocationWhenInUseUsageDescription
//            NSLocationAlwaysUsageDescription
            //请求授权
            [self.Manager requestWhenInUseAuthorization];
        }    
//    }
    //第三步:设置管理器的代理和相关属性
    self.Manager.delegate = self;
    
    //设置精确度
    self.Manager.desiredAccuracy = 100;
    //设置最小更新距离(走多少米一更新)
    self.Manager.distanceFilter = 100;
    //第四步:开启定位
    [self.Manager startUpdatingLocation];

/************************编码与反编码*************************/
//初始化对象
    self.geocoder = [[CLGeocoder alloc]init];
    
    //根据地名获取经纬度
    [self getCoordinateByAdress:@"北京"];
    
    //根据经纬度反编码取出地名
//    [self getAdressByLongitude:118.28397600 latitude:40.10186000];
    
    //计算两点之间的距离
    [self distance];

}

注意:从iOS 7之后,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权:
①要想获得用户的位置和访问用户的通讯录、日历、相机、相册等等都需要用户来手动授权。
②当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权

开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy - Location Usage Description)
一旦用户选择了“Don’t Allow”,意味着你的应用以后就无法使用定位功能
为了严谨起见,最好在使用定位功能之前判断当前应用的定位功能是否可用
CLLocationManager有个类方法可以判断当前应用的定位功能是否可用
+ (BOOL)locationServicesEnabled;

技术分享

技术分享

 

这个设置就相当于用网络的时候的那个允许网络连接!!

#pragma mark - 计算两点之间的距离

#pragma mark - 计算两点之间的距离
-(void)distance{
    
    //位置1
    CLLocation *locationBeijing= [[CLLocation alloc]initWithLatitude:40 longitude:116];
    //位置2
    CLLocation *locationDalian = [[CLLocation alloc]initWithLatitude:39 longitude:121];
    CLLocationDistance distance = [locationBeijing distanceFromLocation:locationDalian];
    
    NSLog(@"北京到大连的距离:%f",distance);
    
}

#pragma mark - 根据经纬度获取地址  编码

-(void)getAdressByLongitude:(CLLocationDegrees)longitude latitude:(CLLocationDegrees)latitude{
    
    
    //反编码
    //创建CLLocation
    CLLocation *location = [[CLLocation alloc]initWithLatitude:latitude longitude:longitude];
    [_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        NSDictionary *dic = placemarks.firstObject.addressDictionary;

        NSLog(@"反编码地理位置信息:%@",dic);
        
        
    }];
    
    
    
}

#pragma mark - 根据地名获取相关的信息  反编码

-(void)getCoordinateByAdress:(NSString *)address{
    
    //编码方法
    
    [_geocoder geocodeAddressString:address completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        //根据返回的地表,取出第一个位置(地标的位置横多)
        CLPlacemark *mark = placemarks.firstObject;
        //根据地标得到location
        CLLocation *location = mark.location;
        
        //根据location获取区域
        CLRegion *region = mark.region;
        
        //获取字典信息
        NSDictionary *adressDic = mark.addressDictionary;
        //        NSString *name=placemark.name;//地名
        //        NSString *thoroughfare=placemark.thoroughfare;//街道
        //        NSString *subThoroughfare=placemark.subThoroughfare; //街道相关信息,例如门牌等
        //        NSString *locality=placemark.locality; // 城市
        //        NSString *subLocality=placemark.subLocality; // 城市相关信息,例如标志性建筑
        //        NSString *administrativeArea=placemark.administrativeArea; ////        NSString *subAdministrativeArea=placemark.subAdministrativeArea; //其他行政区域信息
        //        NSString *postalCode=placemark.postalCode; //邮编
        //        NSString *ISOcountryCode=placemark.ISOcountryCode; //国家编码
        //        NSString *country=placemark.country; //国家
        //        NSString *inlandWater=placemark.inlandWater; //水源、湖泊
        //        NSString *ocean=placemark.ocean; // 海洋
        //        NSArray *areasOfInterest=placemark.areasOfInterest; //关联的或利益相关的地标
        
        NSLog(@"地标位置:%@,区域%@,地理位置信息:%@",location,region,adressDic);
        
    }];
    
    
    
}

#pragma mark - CLLocationManagerDelegate 代理方法
//这个代理方法是定位成功之后开始更新位置信息,只要移动设置的最小距离之后也开始走这个方法

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    
    //获取最后一次的位置
    CLLocation *location = locations.lastObject;
    //获取坐标位置
    CLLocationCoordinate2D coordinate =location.coordinate;
    
    //打印经纬度  longitude经度   latitude纬度
    NSLog(@"纬度:%f,经度:%f,海拔:%f,航海方向:%f,速度:%f",coordinate.latitude,coordinate.longitude,location.altitude,location.course,location.speed);
    
    //为了节省电源,如果不适用定位,需要把定位关掉
    [self.Manager stopUpdatingLocation];
    
}

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    
    NSLog(@"定位失败");
}

 

2.地图的显示 大头针的定义

/*大头针:
 在iOS开发中经常会标记某个位置,需要使用地图标注,也就是大家俗称的“大头针”。只要一个NSObject类实现MKAnnotation协议就可以作为一个大头针,通常会重写协议中coordinate(标记位置)、title(标题)、subtitle(子标题)三个属性,然后在程序中创建大头针对象并调用addAnnotation:方法添加大头针即可(之所以iOS没有定义一个基类实现这个协议供开发者使用,多数原因应该是MKAnnotation是一个模型对象,对于多数应用模型会稍有不同,例如后面的内容中会给大头针模型对象添加其他属性)。
 */

 

技术分享

1.设置属性 

地图显示视图 mapKit

#import "ViewController.h"
#import "MyAnnotation.h"
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>//地图位置框架

//地图是用的框架是MapKit
@interface ViewController ()<MKMapViewDelegate>
//定位管理器
@property (nonatomic, strong) CLLocationManager *locationManager;

//显示地图的视图
@property (nonatomic, strong) MKMapView *mapView;

@end

2.实现的具体代码

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self createMapView];
    
    
}

#pragma mark - 创建地图视图
-(void)createMapView{
    
    //创建地图并添加到当前视图上
    self.mapView = [[MKMapView alloc]initWithFrame:[UIScreen mainScreen].bounds];
    
    [self.view addSubview:self.mapView];
    
    //设置代理
    _mapView.delegate = self;
    
    //定位
    self.locationManager = [[CLLocationManager alloc]init];
    
    if (![CLLocationManager locationServicesEnabled]) {
        NSLog(@"当前设备不可用");
    }
    //authorizationStatus授权状态
    if ([CLLocationManager authorizationStatus] !=kCLAuthorizationStatusAuthorizedWhenInUse ) {
        //kCLAuthorizationStatusAuthorizedWhenInUse: 使用此应用过程中允许访问定位服务
        [self.locationManager requestAlwaysAuthorization];//总是授权
    }
    //设置地图的定位追踪
    _mapView.userTrackingMode = MKUserTrackingModeFollow;
    
    //设置地图的类型
    _mapView.mapType =  MKMapTypeSatellite;
    
    //添加大头针
    [self addAnnotation];
    
}

#pragma mark - 添加大头针
-(void)addAnnotation{
    //设置位置
    CLLocationCoordinate2D location1 = CLLocationCoordinate2DMake(40.12, 118.301);
    //第一个
    MyAnnotation *annotation = [[MyAnnotation alloc]init];
    annotation.coordinate = location1;
    annotation.title = @"定位";
    annotation.subtitle = @"哈哈";
#warning 添加代码
    annotation.image = [UIImage imageNamed:@"23"];//图片修改了但是还的实现代理方法修改view
    
    [self.mapView addAnnotation:annotation];
    
    
    //第二个
    CLLocationCoordinate2D location2 = CLLocationCoordinate2DMake(40, 116);
     MyAnnotation *annotation2 = [[MyAnnotation alloc]init];
    annotation2.coordinate = location2;
    annotation2.title = @"定位2";
    annotation2.subtitle = @"不知道是哪里2";
    [self.mapView addAnnotation:annotation2];
    //第三个
    CLLocationCoordinate2D location3 = CLLocationCoordinate2DMake(33, 111);
     MyAnnotation *annotation3 = [[MyAnnotation alloc]init];
    annotation3.coordinate = location3;
    annotation3.title = @"定位3";
    annotation3.subtitle = @"不知道是哪里3";
    [self.mapView addAnnotation:annotation3];
    //第四个
    CLLocationCoordinate2D location4 = CLLocationCoordinate2DMake(16 , 110);
    MyAnnotation *annotation4 = [[MyAnnotation alloc]init];
    annotation4.coordinate = location4;
    annotation4.title = @"定位4";
    annotation4.subtitle = @"不知道是哪里4";
    [self.mapView addAnnotation:annotation4];
}

#pragma mark - 实现自定义大头针的代理方法
//显示大头针才会调用的代理方法
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
    //判断是否是当前已定义的大头针类
    if ([annotation isKindOfClass:[MyAnnotation class]]) {
        //先定义一个重用标识
        static NSString *identifir = @"AnnotationOne";
        
        MKAnnotationView *annotationView = [_mapView dequeueReusableAnnotationViewWithIdentifier:identifir];
    
    
        if (!annotationView) {
            annotationView = [[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:identifir];
            
//            //允许用户交互
//            annotationView.canShowCallout = YES;
//            //设置偏移量
//            annotationView.calloutOffset = CGPointMake(0, 1);
//            
            //设置详情的左视图
//            annotationView.leftCalloutAccessoryView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"23"]];
        }
        //修改大头针视图
        annotationView.annotation = annotation;
        annotationView.image = ((MyAnnotation *)annotation).image;
        return annotationView;

        
        
    }else{
        
        return nil;
    
    }
    
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

总结:

CLLocationManager 定位的基础信息
CLLocation  位置的地理信息
CLLocationCoordinate2D  存放经纬度的结构体
CLGeocoder地理位置编码与反编码的类
CLPlacemark 地标.
MKMapView 基础地图
MKUserLocation  大头针模型
MKCoordinateRegion  显示区域的结构体
MKAnnotationView 自定义大头针控件

 

iOS地图

标签:

原文地址:http://www.cnblogs.com/manmq/p/5550838.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!