2010年

[iPhone] MapKit で現在地を表示する このエントリーを含むはてなブックマーク

iPhone/iPod touch Add comments

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"];
}

関連する投稿

4 Responses to “[iPhone] MapKit で現在地を表示する”

  1. iPhone開発で位置情報取得するときに役立ったリンク集とTIPS « ssdkfk Says:

    [...] ・MapKitで現在地を表示する http://blog.syuhari.jp/archives/2035? [...]

  2. HI Says:

    記事の追記に「MKMapView の userLocation に addObserver して更新通知を受け取る方が簡単です」とあります。
    確かに表示され、確かに簡単手軽でした。

    にも関わらず多くの記事ではCLLocationManagerを利用した例ばかりが紹介されていますが、これら二つの方法には違いはあるのでしょうか?
    たとえばuserLocationを使うのは手軽だけれど、CLLocationManagerでならなにか細かい設定ができたり動作負荷が低かったり、現在地の精度が高い、対象OSバージョンが広い、などメリットがあるのでしょうか?

  3. matsuura Says:

    簡単に現在地を表示するだけなら userLocation でもいいと思います。CLLocationManager を使えば GPS の精度なども指定できるのでより細かい制御ができると思います。また地図を表示しないで位置情報を一定間隔で取得できたりと CLLocationManager の方が応用はきくと思います。

  4. HI Says:

    どちらが絶対的に良いというのではなく、要件による、ということですね。
    いまつくってみたいものでいえばuserLocationで良さそうです。
    CLLocationManagerのほうは、いろいろ出来るかわりにトレードオフもありそうに想像しました。動作を充分把握してハンドリングしていないと予期しないバッテリ消費に繋がるなど。

    まだiPhoneアプリ開発を始めて間もないので、前提的なこともわかっていないのですが、フレームワークをひとつ追加することでそのぶん重くなる(動作、配布容量)のかなども理解できるように、細かい実験を繰り返しながら進めていこうと思います。

    この地図の記事に限らず、大変有用なブログを公開してくださっていてありがとうございます。

Leave a Reply

Additional comments powered by BackType

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン