MKMapView はそのまま表示すると大西洋を中心とした世界地図が初期表示される。
今回はこの初期表示を現在地に変える。
MKCoordinateRegion
MKMapView で任意の場所を表示する場合、MKCoordinateRegionを使う。この MKCoordinateRegionはCの構造体で中心位置を表す CLLocationCoordinate2Dの値と、表示領域を示す MKCoordinateSpanの値を持つ。
typedef struct { CLLocationCoordinate2D center; MKCoordinateSpan span; } MKCoordinateRegion;中心位置は MKMapView を表示した時に中心にくる緯度経度を表す。MKCoordinateSpan は表示領域を表すために緯度経度方向の幅を表す値を持っている。
typedef struct { CLLocationDegrees latitudeDelta; CLLocationDegrees longitudeDelta; } MKCoordinateSpan;イメージはこんな感じ。
それぞれの構造体向けに生成用の関数が用意されているので利用時にはこれらを使う。
MKCoordinateSpan MKCoordinateSpanMake( CLLocationDegrees latitudeDelta, CLLocationDegrees longitudeDelta) MKCoordinateRegion MKCoordinateRegionMake( CLLocationCoordinate2D centerCoordinate, MKCoordinateSpan span)MKCoordinateRegion を用意できれば後は -[MKMapView setRegion:animated:] に渡して MKMapViewの表示を変えることができる。
それではサンプルで確認してみよう。
実装
指定した位置を中心に表示し、ピンを立てるメソッドを追加した。
- (void)setPinToCoordinate:(CLLocation*)location { SimpleAnnotation* annotation = [[[SimpleAnnotation alloc] init] autorelease]; annotation.location = self.locationManager.location; [self.mapView addAnnotation:annotation]; MKCoordinateSpan span = MKCoordinateSpanMake(0.5, 0.5); CLLocationCoordinate2D centerCoordinate = location.coordinate; MKCoordinateRegion coordinateRegion = MKCoordinateRegionMake(centerCoordinate, span); [self.mapView setRegion:coordinateRegion animated:YES]; }これを起動直後と reloadボタンを押した時に呼び出す。
サンプル
実行してみよう。
一瞬大西洋が表示されるが、そこからアニメーションが始まり現在位置まで移動&ズームインする。
ソースコード
GitHubからどうぞ。
xcatsan's iOS-Sample-Code at 2010-10-13 - GitHub
参考情報
MKMapView Zoom and Reigon
MKCoordinateSpanの説明がわかりやすい。
Bugle Diary: [Objective-C][iPhone sdk][google maps]特定の住所を地図上に表示する
わかりやすくて参考になった。
その他
StackOverflow の記事で MKMapView の初期表示指定で GooglMapの Zoomlevelのような設定ができるブログを知った。
Set the Zoom Level of an MKMapView
GoogleMapだとこんな感じで書ける。
map.setCenter(new google.maps.LatLng(37.4419, -122.1419), 13);最後の 13 が zoomlevel
この記事で紹介されている MKMapViewのカテゴリメソッドを使うと同等のことを行うのにこう書ける。
CLLocationCoordinate2D centerCoord = { 37.4419, -122.1419 }; [mapView setCenterCoordinate:centerCoord zoomLevel:13 animated:NO]; }
zoomlevelも GoogleMapのそれと同じ縮尺になるよう調整してあるなどの凝りよう。ブログにはこのカテゴリを使って表示した地図とGoogleMapを同じ ZoomLevelを指定して比較したスクリーンショットまである。
これはなかなかいい。使えそう。
Responses
Leave a Response