zoukankan      html  css  js  c++  java
  • iOS开发-苹果自带地图简单使用

    【实现功能】:

    1.展示简单地图

    2.显示用户当前位置

    3.控制视图大小

    4.大头针点击显示信息

    5.放置目的地大头针

    6.当前位置与目的地连线

    【实现步骤】

    1.导入两个需要的框架:CoreLocation.framework和MapKit.framework

    2.引入头文件:

    #import <MapKit/MapKit.h>
    #import <CoreLocation/CoreLocation.h>

    3.需要两个类的变量,这里定义为属性:

    @property (nonatomic, retain)MKMapView *mapView;
    @property (nonatomic, retain)CLLocationManager *locaManager;

    4.别忘了接受协议

    @interface ViewController ()<CLLocationManagerDelegate,MKMapViewDelegate>

    5.OK开始上代码

     1 - (void)viewDidLoad{
     2     [super viewDidLoad];
     3     
     4     //初始化位置管理
     5     self.locaManager = [[CLLocationManager alloc] init];
     6     //如果设备在iOS8及以上,得先弹框让用户授权,才能获得定位权限
     7     if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
     8         [self.locaManager requestWhenInUseAuthorization];
     9     }
    10     //设置代理
    11     self.locaManager.delegate = self;
    12     //开始定位
    13     [self.locaManager startUpdatingLocation];
    14     
    15     
    16     //初始化地图视图
    17     self.mapView = [[MKMapView alloc] initWithFrame:self.view.frame];
    18     //设置地图样式为基本样式(这里有三种样式)
    19     self.mapView.mapType = MKMapTypeStandard;
    20     //是否显示当前位置
    21     self.mapView.showsUserLocation = YES;
    22     //设置代理
    23     self.mapView.delegate = self;
    24     [self.view addSubview:self.mapView];
    25 }

    代理方法的实现

    #pragma mark -- mapViewDelegate
    
    - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView{
        NSLog(@"加载完毕");
    }
    - (void)mapViewWillStartLocatingUser:(MKMapView *)mapView{
        NSLog(@"将要获取用户位置");
    }
    
    - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
        //点击大头针,出现信息
        userLocation.title = @"丁健";
        userLocation.subtitle = @"dingjianjaja";
        //让地图视图转移到用户当前位置
        [mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
        //设置精度,以及显示用户所在地
        MKCoordinateSpan span = MKCoordinateSpanMake(1, 1);//比例尺为1:10^5,1厘米代表1公里
        MKCoordinateRegion region = MKCoordinateRegionMake(userLocation.location.coordinate, span);
        [mapView setRegion:region animated:YES];
    }

    6.运行

    发现不显示用户位置,原因是在iOS8以后程序使用定位有三种状态,即试用期间/始终/永不,所以我们需要在plist文件中配置:试用期间或者始终

    NSLocationWhenInUseUsageDescription


    简单的展示地图自己位置就完成了,下面会继续加入目的地大头针,以及连接当前位置与目的地,并计算直线距离的功能。

    1.要想在地图上连接2个点,首先需要将两个点加入到一个数组中

    起点:

    1 CLLocationCoordinate2D coord1;
    2     coord1.latitude = userLocation.location.coordinate.latitude;
    3     coord1.longitude = userLocation.location.coordinate.longitude;
    4 
    5     coords[0] = coord1;

    终点:

    1 coords[1] = coord;

    coords数组中有两个元素

    下面开始画线链接

    1 MKPolyline *line =  [MKPolyline polylineWithCoordinates:coords count:2];//执行画线方法;
    2     [self.mapView addOverlay: line];

    还没完,最后要实现代理方法确定画线的样式

     1 #pragma mark 地图两点画线代理方法
     2 - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
     3 {
     4     if ([overlay isKindOfClass:[MKPolyline class]])
     5     {
     6         MKPolylineView *lineview=[[MKPolylineView alloc] initWithOverlay:overlay];
     7         lineview.strokeColor=[[UIColor blueColor] colorWithAlphaComponent:0.5];
     8         lineview.lineWidth=2.0;
     9         
    10         return lineview;
    11     }else{
    12         return nil;
    13     }
    14 }

    OK完成效果如图:

    计算两点距离

    //计算距离
        CLLocationDistance meters=[self.currentLocation distanceFromLocation:loc];

    通过经纬度编码为地名

    1 [_geocoder reverseGeocodeLocation:loc completionHandler:^(NSArray *placemarks, NSError *error) {
    2         CLPlacemark *placemark=[placemarks firstObject];
    3         NSString *str = [placemark.addressDictionary valueForKey:@"Name"];
    4         _destinationLocalLabel.text = [NSString stringWithFormat:@"目的地:%@",str];
    5     }];

    完整代码:

      1 //
      2 //  ViewController.m
      3 //  MapDemo
      4 //
      5 //  Created by dingjianjaja on 15/12/11.
      6 //  Copyright © 2015年 dingjianjaja. All rights reserved.
      7 //
      8 
      9 #import "ViewController.h"
     10 #import <MapKit/MapKit.h>
     11 #import <CoreLocation/CoreLocation.h>
     12 @interface ViewController ()<CLLocationManagerDelegate,MKMapViewDelegate>
     13 {
     14     CLLocationCoordinate2D coords[2];
     15 }
     16 @property (nonatomic, retain)MKMapView *mapView;
     17 @property (nonatomic, retain)CLLocationManager *locaManager;
     18 
     19 @property (nonatomic, retain)CLLocation *currentLocation;
     20 /**
     21  *  放置大头针按钮
     22  */
     23 @property (nonatomic, retain)UIButton *setPosationBtn;
     24 /**
     25  *  经度输入框
     26  */
     27 @property (nonatomic, retain)UITextField *longitudeText;
     28 /**
     29  *  纬度输入框
     30  */
     31 @property (nonatomic, retain)UITextField *latitudeText;
     32 /**
     33  *  画线点的数组
     34  */
     35 @property (nonatomic, retain)NSMutableArray *pointArr;
     36 /**
     37  *  当前地点
     38  */
     39 @property (nonatomic, retain)UILabel *currentLocalLabel;
     40 /**
     41  *  目的地地点
     42  */
     43 @property (nonatomic, retain)UILabel *destinationLocalLabel;
     44 /**
     45  *  相距多远
     46  */
     47 @property (nonatomic, retain)UILabel *distenceLabel;
     48 
     49 @property (nonatomic, retain)CLGeocoder *geocoder;
     50 @end
     51 
     52 @implementation ViewController
     53 
     54 - (NSArray *)pointArr{
     55     if (!_pointArr) {
     56         _pointArr = [NSMutableArray array];
     57     }
     58     return _pointArr;
     59 }
     60 
     61 - (void)viewDidLoad{
     62     [super viewDidLoad];
     63     
     64     //初始化位置管理
     65     self.locaManager = [[CLLocationManager alloc] init];
     66     //如果设备在iOS8及以上,得先弹框让用户授权,才能获得定位权限
     67     if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
     68         [self.locaManager requestWhenInUseAuthorization];
     69     }
     70     //设置代理
     71     self.locaManager.delegate = self;
     72     //开始定位
     73     [self.locaManager startUpdatingLocation];
     74     
     75     
     76     //初始化地图视图
     77     self.mapView = [[MKMapView alloc] initWithFrame:self.view.frame];
     78     //设置地图样式为基本样式(这里有三种样式)
     79     self.mapView.mapType = MKMapTypeStandard;
     80     //是否显示当前位置
     81     self.mapView.showsUserLocation = YES;
     82     //设置代理
     83     self.mapView.delegate = self;
     84     [self.view addSubview:self.mapView];
     85     
     86     //放置大头针按钮
     87     _setPosationBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
     88     _setPosationBtn.frame = CGRectMake(10, 100, 100, 30);
     89     [_setPosationBtn setTitle:@"放置大头针" forState:UIControlStateNormal];
     90     _setPosationBtn.backgroundColor = [UIColor orangeColor];
     91     _setPosationBtn.alpha = 0.4;
     92     [_setPosationBtn addTarget:self action:@selector(setPositionBtnClick) forControlEvents:UIControlEventTouchUpInside];
     93     [self.view addSubview:_setPosationBtn];
     94     
     95     //经纬度文本框
     96     _longitudeText = [[UITextField alloc] initWithFrame:CGRectMake(10, 20, 100, 30)];
     97     _longitudeText.backgroundColor = [UIColor grayColor];
     98     _longitudeText.alpha = 0.5;
     99     [self.view addSubview:_longitudeText];
    100     
    101     _latitudeText = [[UITextField alloc] initWithFrame:CGRectMake(10, 60, 100, 30)];
    102     _latitudeText.backgroundColor = [UIColor grayColor];
    103     _latitudeText.alpha = 0.5;
    104     [self.view addSubview:_latitudeText];
    105     
    106     
    107     
    108     //当前地点
    109     _currentLocalLabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(_longitudeText.frame) + 10, 20, 247, 30)];
    110     _currentLocalLabel.backgroundColor = [UIColor grayColor];
    111     _currentLocalLabel.text = @"当前地点:";
    112     _currentLocalLabel.font = [UIFont systemFontOfSize:12];
    113     [self.view addSubview:_currentLocalLabel];
    114     
    115     //目标地点
    116     _destinationLocalLabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(_longitudeText.frame) + 10, 60, 247, 30)];
    117     _destinationLocalLabel.backgroundColor = [UIColor grayColor];
    118     _destinationLocalLabel.text = @"目标地点:";
    119     _destinationLocalLabel.font = [UIFont systemFontOfSize:12];
    120     [self.view addSubview:_destinationLocalLabel];
    121     
    122     //距离
    123     _distenceLabel = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(_setPosationBtn.frame) + 10, 100, 247, 30)];
    124     _distenceLabel.backgroundColor = [UIColor grayColor];
    125     _distenceLabel.text = @"相距距离:";
    126     _distenceLabel.font = [UIFont systemFontOfSize:12];
    127     [self.view addSubview:_distenceLabel];
    128     
    129     _geocoder=[[CLGeocoder alloc]init];
    130     
    131 }
    132 
    133 #pragma mark 根据坐标取得地名
    134 -(void)getAddressByLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude{
    135     //反地理编码
    136     CLLocation *location=[[CLLocation alloc]initWithLatitude:latitude longitude:longitude];
    137     [_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
    138         CLPlacemark *placemark=[placemarks firstObject];
    139         NSString *str = [placemark.addressDictionary valueForKey:@"Name"];
    140         NSLog(@"详细信息:%@",str);
    141     }];
    142 }
    143 
    144 
    145 
    146 - (void)setPositionBtnClick{
    147     NSLog(@"放置大头针");
    148     
    149     
    150     //创建CLLocation 设置经纬度
    151     CLLocation *loc = [[CLLocation alloc]initWithLatitude:[[self.latitudeText text] floatValue] longitude:[[self.longitudeText text] floatValue]];
    152     CLLocationCoordinate2D coord = [loc coordinate];
    153     //创建标题
    154     NSString *titile = [NSString stringWithFormat:@"%f,%f",coord.latitude,coord.longitude];
    155     MyPoint *myPoint = [[MyPoint alloc] initWithCoordinate:coord andTitle:titile];
    156     //添加标注
    157     [self.mapView addAnnotation:myPoint];
    158     
    159     //放大到标注的位置
    160     MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(coord, 80000, 80000);
    161     [self.mapView setRegion:region animated:YES];
    162     
    163     //声明一个数组  用来存放画线的点
    164     
    165     coords[1] = coord;
    166     MKPolyline *line =  [MKPolyline polylineWithCoordinates:coords count:2];//执行画线方法;
    167     [self.mapView addOverlay: line];
    168     
    169     
    170     //计算距离
    171     CLLocationDistance meters=[self.currentLocation distanceFromLocation:loc];
    172     _distenceLabel.text = [NSString stringWithFormat:@"相距距离:%.2f千米",meters/1000];
    173     
    174     [_geocoder reverseGeocodeLocation:loc completionHandler:^(NSArray *placemarks, NSError *error) {
    175         CLPlacemark *placemark=[placemarks firstObject];
    176         NSString *str = [placemark.addressDictionary valueForKey:@"Name"];
    177         _destinationLocalLabel.text = [NSString stringWithFormat:@"目的地:%@",str];
    178     }];
    179 
    180     
    181     
    182 }
    183 
    184 #pragma mark 地图两点画线代理方法
    185 - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
    186 {
    187     if ([overlay isKindOfClass:[MKPolyline class]])
    188     {
    189         MKPolylineView *lineview=[[MKPolylineView alloc] initWithOverlay:overlay];
    190         lineview.strokeColor=[[UIColor blueColor] colorWithAlphaComponent:0.5];
    191         lineview.lineWidth=2.0;
    192         
    193         return lineview;
    194     }else{
    195         return nil;
    196     }
    197 }
    198 
    199 
    200 
    201 #pragma mark -- mapViewDelegate
    202 
    203 - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView{
    204     NSLog(@"加载完毕");
    205 }
    206 - (void)mapViewWillStartLocatingUser:(MKMapView *)mapView{
    207     NSLog(@"将要获取用户位置");
    208 }
    209 
    210 - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
    211     //点击大头针,出现信息
    212     userLocation.title = @"丁健";
    213     
    214     self.currentLocation = [[CLLocation alloc] initWithLatitude:userLocation.location.coordinate.latitude longitude:userLocation.location.coordinate.longitude];
    215     NSLog(@"当前位置%@",self.currentLocation);
    216     
    217     
    218     //地理反编码
    219     [_geocoder reverseGeocodeLocation:self.currentLocation completionHandler:^(NSArray *placemarks, NSError *error) {
    220         CLPlacemark *placemark=[placemarks firstObject];
    221         NSString *str = [placemark.addressDictionary valueForKey:@"Name"];
    222         _currentLocalLabel.text = [NSString stringWithFormat:@"当前地点:%@",str];
    223     }];
    224     
    225     
    226     //让地图视图转移到用户当前位置
    227     [mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
    228     
    229     CLLocationCoordinate2D coord1;
    230     coord1.latitude = userLocation.location.coordinate.latitude;
    231     coord1.longitude = userLocation.location.coordinate.longitude;
    232 
    233     coords[0] = coord1;
    234     //设置精度,以及显示用户所在地
    235     MKCoordinateSpan span = MKCoordinateSpanMake(1, 1);//比例尺为1:10^5,1厘米代表1公里
    236     MKCoordinateRegion region = MKCoordinateRegionMake(userLocation.location.coordinate, span);
    237     [mapView setRegion:region animated:YES];
    238 }
    239 
    240 
    241 - (void)didReceiveMemoryWarning {
    242     [super didReceiveMemoryWarning];
    243     // Dispose of any resources that can be recreated.
    244 }
    245 
    246 @end
  • 相关阅读:
    C++高级程序员(廊坊+高薪)欢迎各种漂回家!(该职位已截止)
    utf8_unicode_ci和utf8_general_ci区别
    Percentencoding
    libiconv GNU Project Free Software Foundation (FSF)
    2013年1月6日北京交流会:当当网如何打造个性化推荐&精准营销生态系统
    COM Vs .NET (Qt ActiveQt)
    新一篇: Unicode字符编码规范 实例详细介绍各种字符集编码转换问题
    甩开外包,雄踞榜首:揭开“宫爆老奶奶”成功的秘密
    awk使用命令
    API SOCKET基础(三)网络字节序与主机字节序的转换
  • 原文地址:https://www.cnblogs.com/dingjianjaja/p/5040944.html
Copyright © 2011-2022 走看看