vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

位置情報で遊んでみる その1

どうにも明確な目的が無いとフラフラしがちです。

今回はiPhoneの位置情報機能で遊んでみることにします。

PointMap - GitHub

地図を表示する

まずは画面に地図を表示します。
プロジェクトは適当にSingle View Applicationなどで作成。

まずはLibrariyに以下を追加します。

  • CoreLocation.framework
  • MapKit.framework

地図自体は、StoryboardのViewControllerにMap ViewをドラッグアンドドロップすればOK。
大きさを適当に決めて、下にはボタンとか置いちゃいます。

f:id:mslGt:20140528000357p:plain

ViewControllerにMap、ボタンをそれぞれ関連づけしておきます。
(この時"<MapKit/MapKit.h>"をインポートしていないとエラーになります)

後は実行すればAppleのMapアプリでおなじみの地図が表示されます。

ユーザーの現在位置を取得する

ユーザーを追跡するには、CLLocationManagerDelegateとCLLocationManagerを使用します。

CLLocationManagerDelegateは、MKMapViewDelegateとともに継承しておきます。

MainViewController.m

    @interface MainViewController () < CLLocationManagerDelegate, MKMapViewDelegate>
    @property (weak, nonatomic) IBOutlet MKMapView *mmvMap;
    @property (weak, nonatomic) IBOutlet UIBarButtonItem *btnCurrentLocation;
    @property (weak, nonatomic) IBOutlet UIBarButtonItem *btnStartLogging;
    @property (weak, nonatomic) IBOutlet UIBarButtonItem *btnStopLogging;
    @property (strong, nonatomic) CLLocationManager *clmLocationManager;

    - (IBAction)btnCurrentLocationTouched:(id)sender;
    - (IBAction)btnStartLoggingTouched:(id)sender;
    - (IBAction)btnStopLoggingTouched:(id)sender;

    @end

    @implementation MainViewController

    - (void)viewDidLoad
    {
        [self prepareLocationManager];
        [super viewDidLoad];
    }
    - (void)prepareLocationManager
    {
        _clmLocationManager = [[CLLocationManager alloc] init];
        _clmLocationManager.delegate = self;
        // 位置情報の更新頻度
        _clmLocationManager.activityType = CLActivityTypeAutomotiveNavigation;
        // 位置情報取得の最短距離(m)
        _clmLocationManager.distanceFilter = kCLDistanceFilterNone;
        // 位置情報の取得制度
        _clmLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
    }

これで準備はOK。

あとはstartUpdatingLocationで位置情報の更新が開始されます。
また、更新を止めたい場合は、stopUpdatingLocationで止めることができます。

以下のように、ボタンでOn/Off切り替えられるようにしてみました。

MainViewController.m

    - (IBAction)btnStartLoggingTouched:(id)sender {
        // 位置情報の更新を開始する
        [_clmLocationManager startUpdatingLocation];
    
        // 停止ボタンをEnabledにする
        _btnStartLogging.enabled = NO;
        _btnStopLogging.enabled = YES;
    }

    - (IBAction)btnStopLoggingTouched:(id)sender {
        // 位置情報の更新をストップする
        [_clmLocationManager stopUpdatingLocation];
    
        // 開始ボタンをEnabledにする
        _btnStartLogging.enabled = YES;
        _btnStopLogging.enabled = NO;
    }

シミュレータで現在位置を指定する

デフォルトでは、iOSシミュレータで実行すると現在位置が無しの状態で表示されます。

デバッグ>位置>位置情報をカスタマイズ で緯度、経度を入力することで任意の位置を現在地に指定できます。

参考

参考書籍