zoukankan      html  css  js  c++  java
  • iOS地图(cord location & Map Kit)

    iOS的SDK中提供与地图有关的两大框架 Map Kit 和 core location;其中Map Kit 位于iPhone架构层的Cocoa Touch层, 主要提供了四个功能:显示地图,cllocation和地址之间的转换,支持在地图上做标记,把一个位置解析成地址。core location 位于架构层的core Services,提供获取当前位置的功能。本文通过一个小例子解析对地图有关知识的学习和理解。

    Map Kit:(主要负责地图的显示)

    首先,创建一个single View Application 工程,在工程中引入MapKit.framework和CoreLocation.framework并在viewController.h或者viewController.m文件里包含<MapKit/MapKit.h>、<CoreLocation/CoreLocation.h>头文件。
    (1)Map Kit 有关地图显示主要的类、数据结构及常用方法

    MKMapView:

    1. mapType:有 MKMapTypeStandard(标准) ,MKMapTypeSatellite(卫星),MKMapTypeHybrid(混合)

    2. zoomEnabled:是否允许缩放

    3. CLLocationCoordinate2D:

      经度 与纬度的合称组成一个坐标系统,又称为地理坐标系统(它是一种利用三度空间的球面来定义地球上的空间的球面坐标系 统,能够标示地球上的任何一个位置)北纬为正数,南纬为负数、东经正数,西经为负数。

    4. MKCoordinateRegion

       typedef struct { 
       
     CLLocationCoordinate2D center;   //位置的中心点坐标
       
     MKCoordinateSpan span; //水平和垂直显示地图的大小,也定义了地图的zoom级别 
       
     
} MKCoordinateRegion;
    5. 常用方法

       MKCoordinateRegion MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2D centerCoordinate,   latitudinalMeters,  CLLocationDistance longitudinalMeters);
      

    

     功能:根据指定的地理坐标和距离创建MKCoordinateRegion对象。参数1:新的坐标区域的中心点。参数2:纬度(从北向南      的距离、单位米)。参数3:经度(从东到西的距离,单位米)。

    显示某一坐标的地图程序如下:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
     self.mapView = [[MKMapView alloc]initWithFrame:self.view.bounds];
    
     //    设置地图的显示类型
     self.mapView.mapType = MKMapTypeHybrid;
    
     //    设置地图是否允许缩放
     self.mapView.zoomEnabled = YES;
    
     CLLocationCoordinate2D coordinate = {34.7568711,113.663221};
     MKCoordinateSpan span = {100,100};
    
     MKCoordinateRegion region = {coordinate,span};
     [self.mapView setRegion:region];
     [self.view addSubview:self.mapView];
    }

     (2)在Map上标记注解,具体做法步骤如下:

    创建注解类(需要声明实现MKAnnotation协议)

    实例化注解类对象

    将实列化的注解对象添加到MKMapView对象

    类似于UITableViewCell的方法创建MKAnnotationView对象,这个对象用于最终在地图上展示

    a)使用系统默认的annotation,代码如下:

    MKPointAnnotation *pinAnnotation = [[MKPointAnnotation alloc] init];
    pinAnnotation.coordinate = coordinate;
    pinAnnotation.title = @"郑州";
    pinAnnotation.subtitle = @"河南青云信息技术";
    self.mapView addAnnotation:pinAnnotation;

     这样就会出现一个红色的大头针形状的annotation ;

    要改变大头针形的annotation的属性就要调用方法

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

    一下代码是改变大头针形状的annotation的一些属性:(大头针的颜色变为紫色,)

    - (MKAnnotationView*)mapView:(MKMapView *)mapView 
                viewForAnnotation:(id<MKAnnotation>)annotation
    {
       if ([annotation isKindOfClass:[MKUserLocation class]])
      {
        return nil;
      }
    
      static NSString *indentifier = @"pinView";
    
     MKPinAnnotationView *pinView = (MKPinAnnotationView*)[mapView   dequeueReusableAnnotationViewWithIdentifier:indentifier];
    
      if (nil == pinView)
     {
       pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation 
                                                reuseIdentifier:indentifier];
     }
     pinView.pinColor = MKPinAnnotationColorPurple;
     pinView.animatesDrop = YES;
     pinView.canShowCallout = YES;
     return pinView;
    }
    b)在系统提供的callout基础上自定义自己的图片的annotation

    首先,先创建一个继承自MKAnnotationView的类,然后根据自己的素材设置属性;示例代码如下:

    - (MKAnnotationView*)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
    {
      if ([annotation isKindOfClass:[MKUserLocation class]]) 
     {
        return nil;
     }
      QYAnnotationView *pinView =(QYAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:ind                                                 entifier];
      if (nil == pinView)
     {
        pinView = [[QYAnnotationView alloc] initWithAnnotation:annotation
                                               reuseIdentifier:indentifier];
     }
        pinView.image = [UIImage imageNamed:@"icon_nav_start"];
    
      UIImageView *leftImageView = [[UIImageView alloc]
                                  initWithFrame:CGRectMake(0, 0, 40, 40)];
    
     leftImageView.image = [UIImage imageNamed:@"icon"];
     pinView.leftCalloutAccessoryView = leftImageView;
    
     UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
     [button addTarget:self  action:@selector(onButton:)forControlEvents:UIControlEventTouchUpInside];
     pinView.rightCalloutAccessoryView = button;
     return pinView;
    }

     (3)位置反编码:

    位置反编码就是给一个CLLocationCoordinate2D结构的数据coordinator,调用方法得到地址的详细信息的方法(iOS5.0之后用CLGeocoder)

    - (void)reverseGeocodeLocation:(CLLocation *)location 
                 completionHandler:(CLGeocodeCompletionHandler)completionHandler;
    

    Core Location(主要用于获取当前位置)

    IOS SDK提供的Core Location能比较好的提供获取位置信息的功能,获取位置信息涉及如下几个类,CLLocationManager(位置管理器), CLLocation, CLLocationManagerdelegate(协议、提供委托方法),CLLocationCoodinate2D(存储坐标位置)另外CLLocationManager还有几个属性;desiredAccuracy:位置的精度属性

    取值有如下几种:

    kCLLocationAccuracyBest 精确度最佳
    
    kCLLocationAccuracynearestTenMeters 精确度10m以内
    
    kCLLocationAccuracyHundredMeters 精确度100m以内
    
    kCLLocationAccuracyKilometer 精确度1000m以内
    
    kCLLocationAccuracyThreeKilometers 精确度3000m以内
    

    distanceFilter:横向移动多少距离后更新位置信息

    delegate:响应CLLocationManagerdelegate的对象

    以下是获取当前位置的一个示例:

    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.distanceFilter = 500;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    
    [self.locationManager startUpdatingLocation];
    首先遵守CLLocationManagerDelegate,然后@property一个locationManager属性;

    调用delegate 方法:

    • -(void)locationManager:(CLLocationManager )manager didUpdateToLocation:(CLLocation )newLocation fromLocation:(CLLocation *)oldLocation

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

    在第一个delegate方法里面进行所需的操作,第二个delegate方法

  • 相关阅读:
    hadoop架构
    hdfs存储模型
    C语言编译过程
    linux文件类型和权限
    推荐系统效果评估
    推荐系统冷启动
    Js计算-当月每周有多少天
    3D动画
    固定边栏——淘宝滚动效果
    jquery图片轮播-插件
  • 原文地址:https://www.cnblogs.com/zhaopengtao14/p/3728476.html
Copyright © 2011-2022 走看看