MapKit – 地図の表示と現在位置の取得と現在位置にピン立て

MKMapViewをIBでViewに追加とか、初歩的な部分は割愛。

前提作業
・アプリに『MapKit.framework』と『CoreLocation.framework』を追加して、import

ViewController.h

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

//MapViewのインスタンス作ったりとか
@interface ViewController : UIViewController <CLLocationManagerDelegate>{
    CLLocationManager *locationManager;
}
@property (nonatomic, retain) CLLocationManager *locationManager;    
@property (strong, nonatomic) IBOutlet MKMapView *mapView;

ViewController.m

- (void)viewDidLoad
{
    locationManager = [[CLLocationManager alloc] init];
    
    // 位置情報サービスが利用できるかどうかをチェック
    if ([CLLocationManager locationServicesEnabled]) {
        locationManager.delegate = self;
        // 測位開始
        [locationManager startUpdatingLocation];
    } else {
        NSLog(@"Location services not available.");
    }

    [super viewDidLoad];
}

// 位置情報更新時
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
	CLLocationCoordinate2D coordinate = newLocation.coordinate;
    
	[mapView setCenterCoordinate:coordinate animated:NO];
    
	// 縮尺を設定
	MKCoordinateRegion zoom = mapView.region;
	zoom.span.latitudeDelta = 0.005;
	zoom.span.longitudeDelta = 0.005;
	[mapView setRegion:zoom animated:YES];
    mapView.showsUserLocation=TRUE;

    //測位停止
    [locationManager stopUpdatingLocation];
}

// 測位失敗時や、位置情報の利用をユーザーが許可しなかった場合などに呼ばれる
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"位置情報利用不可" message:@"位置情報の取得に失敗しました。" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
    
    [alert show];
}

Mapアプリはいろいろ便利なのができそうで、わくわくします。
 
 
2012/8/1追記:
GPSの取得の後に何か処理をする場合、一旦処理を止めてあげないと、GPSの取得に処理の実行速度が勝っちゃって(?)、GPSの取得が中途半端になる模様。

解決策としては、『stopUpdatingLocation』は別メソッドに隔離して、遅延実行してやると良いみたいだ。

        // 測位開始
        [locationManager startUpdatingLocation];
        // 『追加』一秒後に測位停止
        [self performSelector:@selector(stopUpdatingLocation:)
                   withObject:nil
                   afterDelay:1.0];

- (void)stopUpdatingLocation:(NSObject *)args{
    [locationManager stopUpdatingLocation]; //測位停止
}

コメントを残す

メールアドレスが公開されることはありません。