zoukankan      html  css  js  c++  java
  • iOS:地图:MapKit和CoreLocation

    地图:MapKit和CoreLocation


    简介:
    现在很多的社交软件都引入了地图和定位功能,要想实现这2大功能,那就不得不学习其中的2个框架:MaKit和CoreLocation
    CoreLocation框架可以使用硬件设备来进行定位服务
    MapKit框架能够使应用程序做一些地图展示与交互的相关功能
    几乎所有的iOS设备都支持位置服务,不过在使用位置服务之前,最好检查一下可用性
    手机定位的三种方式:手机基站、WIFI、GPS
     
    添加框架:

    #import <MapKit/MapKit.h>

    #import <CoreLocation/CoreLocation.h>

    添加显示地图的MKMapView控件 :

    地图的类型 :

    可以通过设置MKMapView的mapViewType设置地图类型
    MKMapTypeStandard 普通地图(左图)
    MKMapTypeSatellite 卫星云图 (中图)
    MKMapTypeHybrid 普通地图覆盖于卫星云图之上(右图) 
     
       
    MapView的代理:
    MapView会将一些事件传递给它的代理(遵守MKMapViewDelegate协议),代理方法如下:
    mapViewWillStartLoadingMap: 当地图界面将要加载时调用
    mapView:viewForAnnotation: 当地图上有一些动画效果展示加载时调用
    mapViewWillStartLocatingUser:当准备进行一个位置定位时调用
    mapView:regionDidChangeAnimated: 当显示的区域发生变化时调用
    mapView:didUpdateUserLocation:当用户位置发生变化时调用
     

    如何添加大头针(地标):

    通过MapView的addAnnotation方法可以添加一个大头针到地图上
    通过MapView的addAnnotations方法可以添加多个大头针到地图上
    –(void)addAnnotation:(id <MKAnnotation>)annotation;
    说明:需要传入一个遵守了MKAnnotation协议的对象
     
    基本步骤为:
    <1>新建一个遵守MKAnnotation协议的类:

    @interface MyAnnotation : NSObject <MKAnnotation>

    @property (nonatomic, assign) CLLocationCoordinate2D coordinate;

    @property (nonatomic, copy) NSString *title;

    @property (nonatomic, copy) NSString *subtitle;

    @end

    <2>添加Annotation:

    MyAnnotation *anno = [[MyAnnotation alloc] init];

    anno.title = @“中国";

    anno.subtitle = @“北京;

    //经度和纬度

    anno.coordinate = CLLocationCoordinate2DMake(40, 110);

    //添加大头针到地图中

    [_mapView addAnnotation:anno];

    // 让地图挪动到对应的位置(经纬度交叉处)

    [_mapView setCenterCoordinate:anno.coordinate animated:YES];

     

    自定义大头针:

    实现MapView的代理方法

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation

    {

        static NSString *ID = @"anno";

        MKPinAnnotationView *annoView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];

        if (annoView == nil) {

            annoView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ID];

            // 显示气泡

            annoView.canShowCallout = YES;

            // 设置绿色

            annoView.pinColor = MKPinAnnotationColorGreen;

        }

        return annoView;

    }

    注意:可以通过设置MapAnnotationView的image属性来自定义大头针显示的图片
     
     
    请求用户批准定位:
    在iOS8,要想获得用户的位置,必须经过用户批准授权
    开发者可以在Info.plist中添加两个配置项
    –NSLocationAlwaysUsageDescription
    –NSLocationWhenInUseUsageDescription
     
    通过两个实例方法获取授权
    –requestWhenInUseAuthorization
    –requestAlwaysAuthorization
     
     
    获得用户的位置:

    // 定位管理器

    _mgr = [[CLLocationManager alloc] init];

    // 获取授权

    [_mgr requestAlwaysAuthorization];

    // 设置代理

    _mgr.delegate = self;

    // 设置精度

    _mgr.desiredAccuracy = kCLLocationAccuracyBest;

    // 开始获取用户的位置

    [_mgr startUpdatingLocation];

    定位管理器的代理方法:

    当用户的位置发生改变时,就会不断调用代理方法,比如

    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

    当定位失败时,会调用

    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

     

    通过地址获得经纬度 :

    CLGeocoder:地理信息编解码

    地址 -> 经纬度 -> 大头针显示

    _geocoder = [[CLGeocoder alloc] init];

    [_geocoder geocodeAddressString:@“东三旗" completionHandler:^(NSArray *placemarks, NSError *error) {

         //没有找到符合要求的地址

        if (placemarks.count == 0) return;

        // 取出位置

        CLPlacemark *firstPlacemark = placemarks[0];  

        // 添加大头针

        MyAnnotation *anno = [[MyAnnotation alloc] init];

        anno.title = firstPlacemark.name; // 名称

        anno.subtitle = firstPlacemark.country; // 国家

        anno.coordinate = firstPlacemark.location.coordinate; // 坐标

        [_mapView addAnnotation:anno];

     }];

       

     
     

       

       

     
     
     
  • 相关阅读:
    查看mysql日志
    Redis配置和常用命令
    任务
    如何让maven 将工程依赖的jar 复制到WEB-INF/lib 目录下
    Tomcat8安装, 安全配置与性能优化(转)
    Web.xml详解(转)
    php精度比较函数bccomp
    php找到字符数组里最左匹配长度的字符(最长公共前缀匹配算法)
    PHP实现curl post和get
    Jquery 跨Dom窗口操作
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4893027.html
Copyright © 2011-2022 走看看