iOS开发系列--地图与定位源代码详解

2020-01-18 17:38:32王振洲

 

单个位置的标注

下面的代码演示了如何在苹果自带地图应用上标记一个位置,首先根据反地理编码获得一个CLPlacemark位置对象,然后将其转换为MKPlacemark对象用于MKMapItem初始化,最后调用其openInMapsWithLaunchOptions:打开地图应用并标记:


//
// KCMainViewController.m
// AppleMap
//
// Created by Kenshin Cui on 14/3/27.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

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

@interface KCMainViewController ()
@property (nonatomic,strong) CLGeocoder *geocoder;
@end

@implementation KCMainViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  
  _geocoder=[[CLGeocoder alloc]init];
  
  [self location];
}

#pragma mark 在地图上定位
-(void)location{
  //根据“北京市”进行地理编码
  [_geocoder geocodeAddressString:@"北京市" completionHandler:^(NSArray *placemarks, NSError *error) {
    CLPlacemark *clPlacemark=[placemarks firstObject];//获取第一个地标
    MKPlacemark *mkplacemark=[[MKPlacemark alloc]initWithPlacemark:clPlacemark];//定位地标转化为地图的地标
    NSDictionary *options=@{MKLaunchOptionsMapTypeKey:@(MKMapTypeStandard)};
    MKMapItem *mapItem=[[MKMapItem alloc]initWithPlacemark:mkplacemark];
    [mapItem openInMapsWithLaunchOptions:options];
  }];
}
@end

运行效果:
ios开发地图定位,ios自带地图定位开发,ios开发百度地图定位

标记多个位置

如果要标记多个位置需要调用MKMapItem的静态方法,下面的代码演示中需要注意,使用CLGeocoder进行定位时一次只能定位到一个位置,所以第二个位置定位放到了第一个位置获取成功之后。


//
// KCMainViewController.m
// AppleMap
//
// Created by Kenshin Cui on 14/3/27.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

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

@interface KCMainViewController ()
@property (nonatomic,strong) CLGeocoder *geocoder;
@end

@implementation KCMainViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  
  _geocoder=[[CLGeocoder alloc]init];
  
  [self listPlacemark];
}

-(void)listPlacemark{
  //根据“北京市”进行地理编码
  [_geocoder geocodeAddressString:@"北京市" completionHandler:^(NSArray *placemarks, NSError *error) {
    CLPlacemark *clPlacemark1=[placemarks firstObject];//获取第一个地标
    MKPlacemark *mkPlacemark1=[[MKPlacemark alloc]initWithPlacemark:clPlacemark1];
    //注意地理编码一次只能定位到一个位置,不能同时定位,所在放到第一个位置定位完成回调函数中再次定位
    [_geocoder geocodeAddressString:@"郑州市" completionHandler:^(NSArray *placemarks, NSError *error) {
      CLPlacemark *clPlacemark2=[placemarks firstObject];//获取第一个地标
      MKPlacemark *mkPlacemark2=[[MKPlacemark alloc]initWithPlacemark:clPlacemark2];
      NSDictionary *options=@{MKLaunchOptionsMapTypeKey:@(MKMapTypeStandard)};
      //MKMapItem *mapItem1=[MKMapItem mapItemForCurrentLocation];//当前位置
      MKMapItem *mapItem1=[[MKMapItem alloc]initWithPlacemark:mkPlacemark1];
      MKMapItem *mapItem2=[[MKMapItem alloc]initWithPlacemark:mkPlacemark2];
      [MKMapItem openMapsWithItems:@[mapItem1,mapItem2] launchOptions:options];
      
    }];
    
  }];
}
@end