14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

位置情報から今の自分のいる場所をマップで表示するコード書いた

Last updated at Posted at 2015-08-25

簡単な地図をMapViewで表示するコード
こっちで書いてたやつからの発展。

目標はこんな感じ

  1. 一回だけ自分の位置を取得する
  2. 取得した位置情報を元に地図を表示

そしてできあがったソースがこちら。

ViewController.swift
    var locationManager: CLLocationManager?

    override func viewDidLoad() {
        super.viewDidLoad()
        
        locationManager = CLLocationManager()
        
        if (locationManager != NSNull()) {
            locationManager?.delegate = self
        
            locationManager?.requestAlwaysAuthorization()
            
            
            let status = CLLocationManager.authorizationStatus()
            switch status{
            case .Restricted, .Denied:
                break
            case .NotDetermined:
                // iOS8での位置情報追跡リクエストの方法
                if ((locationManager?.respondsToSelector("requestWhenInUseAuthorization")) != nil){
                    locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
                    locationManager?.requestWhenInUseAuthorization()
                    locationManager?.startUpdatingLocation()
                }else{
                    locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
                    locationManager?.startUpdatingLocation()
                }
            case .AuthorizedWhenInUse, .AuthorizedAlways:
                // 従来の位置情報追跡リクエストの方法
                locationManager?.startUpdatingLocation()
            default:
                break
            }
        }
    }
    
    override func viewWillAppear(animated: Bool) {
        locationManager?.startUpdatingLocation()
    }
    
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    

    func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
        
        let latitude = newLocation.coordinate.latitude
        let longitude = newLocation.coordinate.longitude
        let location = CLLocationCoordinate2DMake(latitude,longitude)
        
        mkMapView.setCenterCoordinate(location, animated: true)
        
        var region: MKCoordinateRegion = mkMapView.region
        region.center = location
        region.span.latitudeDelta = 0.02
        region.span.longitudeDelta = 0.02
        
        let pointAnnotation: MKPointAnnotation = MKPointAnnotation()
        
        pointAnnotation.coordinate = location
        pointAnnotation.title = "現在地"
        
        mkMapView.addAnnotation(pointAnnotation)
        mkMapView.setRegion(region, animated: true)
        
        //地図の形式
        mkMapView.mapType = MKMapType.Standard
        locationManager?.stopUpdatingLocation()
    }
    
    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    }

このままだと男料理すぎるので、少し細かく刻んでいきます。

位置情報取得認証
// 位置情報取得確認のメッセージを表示。必須。      
locationManager?.requestAlwaysAuthorization()
          
          
let status = CLLocationManager.authorizationStatus()
  // 位置情報取得の認証状態で分岐
  switch status{
    case .Restricted, .Denied:
         break
  case .NotDetermined:
       if ((locationManager?.respondsToSelector("requestWhenInUseAuthorization")) != nil){
          // iOS8ではinfo.plistに"requestWhenInUseAuthorization"か、"requestAlwaysAuthorization"を記載しないといけない
          // requestWhenInUseAuthorization:起動中のみ使用、requestAlwaysAuthorization:いつでも使用できる。
          
          // 精度の指定
          locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
          locationManager?.requestWhenInUseAuthorization()
          // 位置情報取得の開始
          locationManager?.startUpdatingLocation()
       }else{
            locationManager?.desiredAccuracy = kCLLocationAccuracyBestForNavigation
            locationManager?.startUpdatingLocation()
       }
  case .AuthorizedWhenInUse, .AuthorizedAlways:
       // 従来の位置情報追跡リクエストの方法
       locationManager?.startUpdatingLocation()
  default:
       break
  }

この部分のコードで、位置情報取得のためのAuthorizationと位置情報の取得開始ができる。

そして、以下の部分が位置情報取得開始後の処理にあたる。

// 位置情報を取得したときに呼ばれる。Androidでのコールバックかも。
func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
      // 取得した位置情報の緯度経度
      let latitude = newLocation.coordinate.latitude
      let longitude = newLocation.coordinate.longitude
      let location = CLLocationCoordinate2DMake(latitude,longitude)
      
      // 表示するマップの中心を、取得した位置情報のポイントに指定
      mkMapView.setCenterCoordinate(location, animated: true)
      
      // 表示する領域を設定する
      var region: MKCoordinateRegion = mkMapView.region
      // 領域設定の中心
      region.center = location
      // 表示する領域の拡大・縮小の係数
      region.span.latitudeDelta = 0.02
      region.span.longitudeDelta = 0.02
      
      // ピンのオブジェクトを生成
      let pointAnnotation: MKPointAnnotation = MKPointAnnotation()
      
      // ピンの位置を取得した位置情報の位置に設定
      pointAnnotation.coordinate = location
      // ピンをタップした際に表示される吹き出しの内容
      pointAnnotation.title = "現在地"
      
      // 設定したピンをマップ上に反映
      mkMapView.addAnnotation(pointAnnotation)
      // 決定した表示設定をMapViewに適用
      mkMapView.setRegion(region, animated: true)
      
      // 地図の形式。Standardがデフォルトの地図。Satteliteが航空地図。
      mkMapView.mapType = MKMapType.Standard
      // 位置情報は既に取得したので、これ以降取得を行わないように位置情報取得を停止
      locationManager?.stopUpdatingLocation()
  }
  
  // 位置情報取得が失敗した際に呼ばれる。
  func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
  }

とりあえずこんな形。自分の位置にピンを立てるとかを忘れたので、次はそれを追加したりする予定。

14
16
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?