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

iOS 开发指南 第16章 定位服务与地图应用之使用苹果地图

时间:2015-09-21 11:51:46      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

1 显示地图

   MKMapView MKMapViewDelegate

   准备:加载MapKit.framework

设置地图样式 代理-实现代理方法

- (void)viewDidLoad {
    [super viewDidLoad];
    设置样式,枚举类型MKMapType
    self.mapView.mapType = MKMapTypeStandard;
    // self.mapView.mapType = MKMapTypeSatellite;
将当前视图控制器赋值给地图视图的delegate属性 self.mapView.delegate = self; }

- (void)mapViewDidFailLoadingMap:(MKMapView *)theMapView withError:(NSError *)error {


    NSLog(@"error : %@",[error description]);


}

2 添加标注

  创建地图标注点类:实现MKAnnotation协议

  触发添加动作:编码位置信息-移除地图标注点-调整地图位置和缩放比例 MKCoordinateRegion(CLLocationCoordinate2D center;MKCoordinateSpan span;) 并设置显示区域-设置标注点并放到地图上

  实现地图委托方法mapView:viewForAnnotation:在地图视图添加标注时回调

 

触发添加动作
- (IBAction)geocodeQuery:(id)sender { if (_txtQueryKey.text == nil || [_txtQueryKey.text length] == 0) { return; } CLGeocoder *geocoder = [[CLGeocoder alloc] init]; [geocoder geocodeAddressString:_txtQueryKey.text completionHandler:^(NSArray *placemarks, NSError *error) { NSLog(@"查询记录数:%lu",[placemarks count]); if ([placemarks count] > 0) {移除标注点 [self.mapView removeAnnotations:self.mapView.annotations]; } for (int i = 0; i < [placemarks count]; i++) { CLPlacemark* placemark = placemarks[i]; //调整地图位置和缩放比例 MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(placemark.location.coordinate, 10000, 10000); [self.mapView setRegion:viewRegion animated:YES];
自定义的实现了MKAnnotation协议的地图标注点类(气泡信息) MyAnnotation
*annotation = [[MyAnnotation alloc] init];
将编码好的位置信息放到地图标注点中 annotation.streetAddress
= placemark.thoroughfare; annotation.city = placemark.locality; annotation.state = placemark.administrativeArea; annotation.zip = placemark.postalCode; annotation.coordinate = placemark.location.coordinate; 将标注点添加到地图视图上 [self.mapView addAnnotation:annotation]; } //关闭键盘 [_txtQueryKey resignFirstResponder]; }]; }

#pragma mark Map View Delegate Methods 实现协议


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

    使用重用机制获取标注视图(annotation和annotationView的区别)

    MKPinAnnotationView *annotationView

    = (MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:@"PIN_ANNOTATION"];

    if(annotationView == nil) {

        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation

                                                         reuseIdentifier:@"PIN_ANNOTATION"];

    }设置大头针标注图颜色

    annotationView.pinColor = MKPinAnnotationColorPurple;

    设置标注视图是否以动画效果的形式显示在地图上

    annotationView.animatesDrop = YES;

    设置附加信息气泡,气泡文字封装在MYAnnotation类中    

    annotationView.canShowCallout = YES;

    return annotationView;


}

地图标注点类:

- (NSString *)title {协议方法就是设置title和subtitle
    return @"您的位置!";
}
- (NSString *)subtitle {拼接字符串
    
    NSMutableString *ret = [NSMutableString new];
    if (_state)
        [ret appendString:_state];
    if (_city)
        [ret appendString:_city];
    if (_city && _state)
        [ret appendString:@", "];
    if (_streetAddress && (_city || _state || _zip))
        [ret appendString:@""];
    if (_streetAddress)
        [ret appendString:_streetAddress];
    if (_zip)
        [ret appendFormat:@", %@", _zip];
    
    return ret;
}

3 跟踪用户位置变化

   MapKit提供了跟踪用户位置和方向变化的API:开启showUserLocation属性并设置方法setUserTrackingMode:就可以了   

- (void)viewDidLoad {
    [super viewDidLoad];
    
    if ([CLLocationManager locationServicesEnabled])判断能否开启定位服务
    {
        self.mapView.mapType = MKMapTypeStandard;
        self.mapView.delegate = self;
        //self.mapView.showsUserLocation = YES;允许跟踪用户信息
设置用户跟踪模式 枚举类型 [self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]; //授权 self.locationManager = [[CLLocationManager alloc] init]; [self.locationManager requestWhenInUseAuthorization]; [self.locationManager requestAlwaysAuthorization]; } }

4 使用程序外地图

   只是用地图的基本功能而不需要设计自己的地图界面。

   1)调用iOS苹果地图

        MKPlacemark:定位使用的地标类,CLPlacemark是地图上的地标类

        MKMapItem:封装了地图上一个点的信息类 ,我们将需要需要显示在地图上的点封装到这里,也用这个类调用苹果地图。

- (IBAction)geocodeQuery:(id)sender {
    
    if (self.txtQueryKey.text == nil || [self.txtQueryKey.text length] == 0) {
        return;
    }
    
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:self.txtQueryKey.text completionHandler:^(NSArray *placemarks, NSError *error) {
        NSLog(@"查询记录数:%lu",[placemarks count]);
        
        if ([placemarks count] > 0) {
            CLPlacemark* placemark = placemarks[0];
            获取地理坐标点
            CLLocationCoordinate2D coordinate = placemark.location.coordinate;
获取该地理坐标点的信息 NSDictionary
* address = placemark.addressDictionary;
定位地标点设置 MKPlacemark
*place = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:address]; 设置地图上点的信息 MKMapItem *mapItem = [[MKMapItem alloc]initWithPlacemark:place];
调用iOS自带的苹果地图应用 参数是字典类型可以控制显示地图的初始化信息 [mapItem openInMapsWithLaunchOptions:nil];
如果有多个点需要标注:先遍历再使用+(BOOL)openMapsWithItems:(NSArray *)mapItems launchOptions:(NSDictionary *)lunchOptions
// //地图上设置行车路线 默认起点是当前位置,终点是查询的地点 // NSDictionary* options =[[NSDictionary alloc]initWithObjectsAndKeys: // MKLaunchOptionsDirectionsModeDriving驾车路线,MKLaunchOptionsDirectionsModeKey设定路线模式, nil]; // // MKMapItem *mapItem = [[MKMapItem alloc]initWithPlacemark:place]; // [mapItem openInMapsWithLaunchOptions:options]; //关闭键盘 [_txtQueryKey resignFirstResponder]; } }]; }

 

        

iOS 开发指南 第16章 定位服务与地图应用之使用苹果地图

标签:

原文地址:http://www.cnblogs.com/haugezi/p/4825411.html

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