MapKit で現在地を表示する方法です。

MapKit フレームワークと CoreLocation フレームワークが必要になるので、追加しておきます。mapView.showsUserLocation を YES にすることにより、現在地の青い印を表示することができます。また、CLLocationManager を使用して GPS より現在地を取得して地図の中心にしています。

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

@interface MapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> {
	MKMapView* mapView;
	CLLocationManager* locmanager;
}

@end
- (void)viewDidLoad {
    [super viewDidLoad];

    mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
    mapView.showsUserLocation = YES;
    [self.view addSubview:mapView];

    locmanager = [[CLLocationManager alloc] init];
    [locmanager setDelegate:self];
    [locmanager setDesiredAccuracy:kCLLocationAccuracyBest];
    [locmanager setDistanceFilter:kCLDistanceFilterNone];
    [locmanager startUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
		   fromLocation:(CLLocation *)oldLocation {
    MKCoordinateSpan span = MKCoordinateSpanMake(0.005, 0.005);
    MKCoordinateRegion region = MKCoordinateRegionMake(newLocation.coordinate, span);
    [mapView setRegion:region animated:YES];
}

region を設定している部分は下記のようにも書けます。上記の方がすっきりしていますが、下記の方が何をしているか分かりやすいかもしれません。

MKCoordinateRegion region;
region.span.latitudeDelta = 0.005;
region.span.longitudeDelta = 0.005;
region.center.latitude = newLocation.coordinate.latitude;
region.center.longitude = newLocation.coordinate.longitude;

span で地図の表示範囲を指定します。1度 = 約111km です。また、上記の例では正方形のエリアになっていますが、MKMapView の実際の大きさに合わせて丁度いいように計算して表示してくれます。

2010.3.25 追記
現在地の表示ですが、GPS からの更新を受けて地図の中心を移動するのに上記の例では CLLocationManager を使用していますが、MKMapView の userLocation に addObserver して更新通知を受け取る方が簡単です。

- (void)viewDidLoad {
    [super viewDidLoad];
    mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
    mapView.showsUserLocation = YES;
    mapView.delegate = self;
    [self.view addSubview:mapView];
    [mapView.userLocation addObserver:self forKeyPath:@"location" options:0 context:NULL];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    mapView.centerCoordinate = mapView.userLocation.location.coordinate;
    // 一度しか現在地に移動しないなら removeObserver する
    [mapView.userLocation removeObserver:self forKeyPath:@"location"];
}

関連する投稿