CS193p - Lecture 11

iTunes U スタンフォード大学のiOSアプリ開発講義のLecure 11(Core Location/Map Kit)の講義メモです。

Core Location

ユーザインタフェイスがないフレームワーク。

■座標系

@property (readonly) CLLocationCoordinate2D coordinate;
typedef {
    CLLocationDegrees latitude; //緯度(double)
    CLLocationDegreeslongitude; //経度(double)
} CLLocationCoordinate2D;


@property (readonly) CLLocationDistance altitude; //高度(メートル)

 

■精度

@property (readonly) CLLocationAccuracy horizontalAccuracy; 

@property (readonly) CLLocationAccuracy verticalAccuracy; 

 

・精度設定時に使用するパラメータ

kCLLocationAccuracyBestForNavigation;

kCLLocationAccuracyBest;

kCLLocationAccuracyNearestTenMeters;

kCLLocationAccuracyHundredMeters;

kCLLocationAccuracyKilometer;

kCLLocationAccuracyThreeKilometers;

 

精度を求める程、位置情報の更新頻度が高くなるため、多くの電力を必要とする

  • GPS : 最も正確
  • WiFiノードデータベース探索:2番目に正確
  • 携帯電波塔に基づく三角測量:最も精度が低い

■CLLocationオブジェクトのプロパティ

・速度

@property (readonly) CLLocationSpeed speed; //メートル/秒

※CLLocationの座標点を使って算出されるので、正確なものではない。

・進行方向 

@property (readonly) CLLocationDirection course; //度、北が0で時計回り

この情報を取れないデバイスもある。
マイナスの値は不正を意味する。

・タイムスタンプ

@property (readonly) NSDate *timestamp;

 

・CLLocation間の距離(メートル)

- (CLLocationDistance)distanceFromLocation:(CLLocation *)otherLocation;

 

■位置情報(CLLocation)の取得方法

CLLocationManagerのdelegateとして取得する。

※iOS 5では、XcodeでCLLocationManagerのシミュレーションが出来る。

■CLLocationManagerの使い方

1. デバイスの状態を確認

2. CLLocationManagerのインスタンスを作ってdelegateをセット
3. 必要な位置情報を提供するようにマネージャーを設定
4. マネージャーのモニタリングを開始

■位置情報のモニターの種類

  • 精度ベースの継続的な更新(低レベルの正確さなら更新は頻繁にしない)
  • 大きな変化があったときのみ更新
  • エリアベースの更新
  • 進行方向のモニター

■デバイスの状態を確認する方法

+(BOOL)locationServicesEnabled; //位置情報を設定でオンにしているか
+(BOOL)headingAvailable; //このデバイスが進行方向(コンパス)を取得出来るか
+(BOOL)significantLocationChangeMonitoringAvailable; //デバイスが携帯電話か
+(BOOL)regionMonitoringAvailable; //デバイスがエリアモニター可能か
+(BOOL)regionMonitoringEnabled; //設定でエリアモニターを有効にしているか

■モニター時に共通で設定する内容

・モニターの目的

@property (copy) NSString *purpose;

■精度ベースのモニタリング

・モニター内容の設定

@property CLLocationAccuracy desiredAccuracy; //精度(必要最小限に)
@property CLLocationDistance distanceFilter; //最低距離(更新頻度)

・モニターの開始と終了

- (void)startUpdatingLocation;
- (void)stopUpdatingLocation;

・CLLocationManagerのdelegateで通知を受け取る

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation;

■進行方向のモニタリング

・モニター内容の設定

@property CLLocationDegrees headingFilter;
@property CLHeadingOrientation headingOrientation;

・モニターの開始と終了

- (void)startUpdatingHeading;
- (void)stopUpdatingHeading;

・CLLocationmanagerのdelegateで通知を受け取る

- (void)locationManager:(CLLocationManager *)manager
       didUpdateHeading:(CLHeading *)newHeading;

■大きな変更があったときのみ更新のモニタリング

・モニターの開始と終了

- (void)startMonitoringSignificantLocationChanges;
- (void)stopMonitoringSignificantLocationChanges;   

・CLLocationmanagerのdelegateで通知を受け取る

アプリ実行時:精度ベースのモニタリングと同じ

アプリ終了時:自動的にアプリが起動されdelegateが呼びだされる

application:didFinishLaunchingWithOptions:

(UIApplicationLaunchOptionsLocationKeyを受け取る)

CLLocationManagerを作成し、CLLocationオブジェクトで位置情報を取得

■エリアベースの更新のモニタリング

・モニターの開始と終了

- (void)startMonitoringForRegion:(CLRegion *) desiredAccuracy:(CLLocationAccuracy);
- (void)stopMonitoringForRegion:(CLRegion *);

・CLLocationmanagerのdelegateで通知を受け取る

- (void)locationManager:(CLLocationManager *)manager

                                                     didEnterRegion:(CLRegion *)region;
- (void)locationManager:(CLLocationManager *)manager

                                                     didExitRegion:(CLRegion *)region;

- (void)locationManager:(CLLocationManager *)manager
                                     monitoringDidFailForRegion:(CLRegion *)region

                                     withError:(NSError *)error;

※大きな変更があったときのみ更新と同じくアプリ終了時でも自動的に起動される

 

Map KIT (20:33〜)

グールグマップのテクノロジーを使った地図の表示。

■MKMapViewの作り方
オブジェクトライブラリからドラッグアウトする

■MKAnnotationの実装
id <MKAnnotation>オブジェクトを含む配列を作成する

@property (readonly) NSArray *annotations;

 

・MKAnnotation プロトコル

@protocol MKAnnotation

@property (readonly) CLLocationCoordinate2D coordinate; @optional

@property (readonly) NSString *title;

@property (readonly) NSString *subtitle;

@end

 

typedef {

    CLLocationDegrees latitude;

    CLLocationDegrees longitude;

} CLLocationCoordinate2D;

 

・MKAnnotationデータの追加と削除

作成した配列について、次のメソッドを使ってデータの追加と削除を行う。

- (void)addAnnotation:(id )annotation;

- (void)addAnnotations:(NSArray *)annotations;

- (void)removeAnnotation:(id )annotation;

- (void)removeAnnotations:(NSArray *)annotations;

 

・ピン以外の見た目にカスタマイズする方法

デフォルトではMKAnnotationViewがMKPinAnnotationViewになっているので、これを独自のものに変更する。

・MKAnnotationがタップされた時に呼ばれるdelegateメソッド

- (void)mapView:(MKMapView *)sender

didSelectAnnotationView:(MKAnnotationView *)aView

{

if ([aView.leftCalloutAccessoryView isKindOfClass:

[UIImageView class]]) {

UIImageView *imageView =

(UIImageView *)aView.leftCalloutAccessoryView;

imageView.image=...;

  //GCDキューを使う時はビューは再利用されるので注意!

}

}

 

■MKAnnotationVIew

・MKAnnotationのMKAnnotationViewへの割り当て

UITableViewCellがUITableViewに割り当てられるのと同じように、再利用バッファが使われ、次のMKMapViewDelegateのdelegateメソッドを実装してその中で割り当てを行う。

- (MKAnnotationView *)mapView:(MKMapView *)sender

viewForAnnotation:(id )annotation

{

MKAnnotationView *aView = [sender

dequeueReusableAnnotationViewWithIdentifier:@"IDENT"];

if (!aView)

aView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"IDENT"];

// canShowCallout に YES を設定して、

// ここで吹き出しを作る

}

aView.annotation = annotation;

// 吹き出しの内容が低負荷ならここで設定し、

// 高負荷なら mapView:didSelectAnnotationView:で設定する

return aView;

}

 

・MKAnnotationViewのプロパティ

@property id <MKAnnotation> annotation; //注釈

@property UIImage *image; //ピンの代わりの画像

@property UIView *leftCalloutAccessoryView; //左のアイコン

@property UIView *rightCalloutAccessoryView; //右のアイコン @property CGPoint centerOffset;

@property BOOL draggable; //setCoordinate: 実装時のみ動作

 

・アイコンがタップされた時のdelegateメソッド

(void)mapView:(MKMapView *)sender

annotationView:(MKAnnotationView *)aView

calloutAccessoryControlTapped:(UIControl *)control;

 

■MapViewのプロパティ

・マップの表示形式

@property MKMapType mapType;
    MKMapTypeStandard, MKMapTypeSatellite, MKMapTypeHybrid;

・ユーザの現在の位置

@property BOOL showsUserLocation;
@property (readonly) BOOL isUserLocationVisible;
@property (readonly) MKUserLocation *userLocation;

・ユーザ操作の制約

@property BOOL zoomEnabled;
@property BOOL scrollEnabled;

■マップの表示範囲をコントロール

@property MKCoordinateRegion region;

typedef struct {

CLLocationCoordinate2D center;

MKCoordinateSpan span;

} MKCoordinateRegion;

typedef struct {

CLLocationDegrees latitudeDelta;

CLLocationDegrees longitudeDelta;

}MKCoordinateSpan;

- (void)setRegion:(MKCoordinateRegion)region

animated:(BOOL)animated;

 

・センター位置のセット

@property CLLocationCoordinate2D centerCoordinate;

- (void)setCenterCoordinate:(CLLocationCoordinate2D)center

animated:(BOOL)animated;

 

■オーバーレイ

メカニズムは注釈に似ていて、MKAnnotationViewのかわりにMKOverLayViewを使う。

- (void)addOverlay:(id <MKOverlay>)overlay;
- (void)addOverlays:(NSArray *)overlay;
- (void)removeOverlay:(id<MKOverlay>)overlay;
- (void)removeOverlays:(NSArray *)overlay;

 

・MKOverlayのプロトコル

MKAnnotationに加えて…

@property (readonly) MKMapRect boundingMapRect;
- (BOOL)intersectsMapRect:(MKMapRect)mapRect; //optional

 

・描画

- (void)drawMapRect:(MKMapRect)mapRect

          zoomScale:(MKZoomScale)zoomScale
          inContext:(CGContextRef)context;

drawRect: と異なり、contextは提供される。
座標系はビューの座標系ではなく、マップの座標系である。

・座標系の変換

- (MKMapPoint)mapPointForPoint:(CGPoint)point;
- (MKMapRect)mapRectForRect:(CGRect)rect;
- (CGPoint)pointForMapPoint:(MKMapPoint)mapPoint;
- (CGRect)rectForMapRect:(MKMapRect)mapRect;

 

デモ(マップに注釈を表示)(36:58〜)

<前の記事

CP193p - Lecture 10    - CS193p 課題5の内容 次の記事>

コメントをお書きください

コメント: 1
  • #1

    Juicer Reviews (水曜日, 01 5月 2013 06:32)

    I just shared this upon Facebook! My friends will really want it!