【Swift/iOS】CoreLocationで緯度・経度を取得して位置情報を表示する

# 概要
CoreLocationで緯度・経度を取得して位置情報を表示する方法を説明します。

# 確認バージョン
Xcode 11.2.1
Swift 5.1.2
iOS 13.2.3

# CoreLocation
## ライブラリ
TARGET -> Build Phase -> Link Binary With Libraries
CoreLocation.frameworkを追加
<img width="1000" alt="CoreLocationライブラリ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537736/9b651e01-2672-6d43-b859-af7807b63784.png">

## Info.plist
Privacy - Location When In Use Usage Description
位置情報許可のアラート画面に表示される説明を追加します。

# 実装
1. 情報表示用のUILabelを追加
2. 位置情報を利用許可状態を判定
3. 位置情報の更新開始
3. CLLocationデータを逆ジオコーディングして位置情報を取得
4. 位置情報が更新されるとUILabelに設定

```
import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {
    let locationManager = CLLocationManager()
    let geocoder = CLGeocoder()
    let text = [ "緯度", "経度", "国名", "郵便番号", "都道府県", "郡", "市区町村", "丁番なしの地名", "地名", "番地" ]
    var item: [ UILabel ] = []
    var location: [ UILabel ] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //サイズ
        let width = self.view.frame.width / 2
        let height = self.view.frame.height / CGFloat( self.text.count + 1 )
        
        //ラベル
        for ( i, text ) in text.enumerated() {
            //項目
            self.item.append( UILabel() )
            self.item.last!.frame.size = CGSize( width: width, height: height )
            self.item.last!.frame.origin = CGPoint( x: 0, y: height * CGFloat( i + 1 ) )
            self.item.last!.textAlignment = .center
            self.item.last!.text = text
            self.view.addSubview( self.item.last! )
            
            //データ
            self.location.append( UILabel() )
            self.location.last!.frame.size = CGSize( width: width, height: height )
            self.location.last!.frame.origin = CGPoint( x: width, y: height * CGFloat( i + 1 ) )
            self.location.last!.textAlignment = .center
            self.view.addSubview( self.location.last! )
        }
        
        //ロケーションマネージャ
        self.locationManager.requestWhenInUseAuthorization()
        let status = CLLocationManager.authorizationStatus()
        if status == .authorizedWhenInUse {
            self.locationManager.delegate = self
            self.locationManager.distanceFilter = 10
            self.locationManager.startUpdatingLocation()
        }
    }
    
    func locationManager( _ manager: CLLocationManager, didUpdateLocations locations: [ CLLocation ] ) {
        //表示更新
        if let location = locations.first {
            //緯度・経度
            self.location[0].text = location.coordinate.latitude.description
            self.location[1].text = location.coordinate.longitude.description
            
            //逆ジオコーディング
            self.geocoder.reverseGeocodeLocation( location, completionHandler: { ( placemarks, error ) in
                if let placemark = placemarks?.first {
                    //位置情報
                    self.location[2].text = placemark.country
                    self.location[3].text = placemark.postalCode
                    self.location[4].text = placemark.administrativeArea
                    self.location[5].text = placemark.subAdministrativeArea
                    self.location[6].text = placemark.locality
                    self.location[7].text = placemark.subLocality
                    self.location[8].text = placemark.thoroughfare
                    self.location[9].text = placemark.subThoroughfare
                }
            } )
        }
    }
}
```
Githubのソースコードは[こちら](https://github.com/vyeah321/Location)

※最新のコミットは下記の記事で説明するソースコードに更新しました。
[【Swift/iOS】CoreLocationで取得した位置情報を住所に変換する](https://qiita.com/vyeah321/items/c6498ff6801da783cc2f)


# 実行
実行すると位置情報が表示されます。
シミュレータで実行する場合には場所を指定して下さい。
<img width="1000" alt="位置情報シミュレータ" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537736/6599e206-cf85-5e04-2131-85e49944bef7.png>


取得できる情報は言語設定にしたがってローカライズされています。
 
|日本|JAPAN|アメリカ合衆国|USA|
|---|---|---|---|
| <img width="500" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537736/df78a2ce-ee47-2dc7-c97d-a30507a976a4.png> | <img width="500" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537736/7f8f1f81-03de-70d8-f204-6b6be9f89d73.png > | <img width="500" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537736/ae6280d9-1251-80e3-9d7e-cdcfeab29323.png > | <img width="500" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537736/f01bb2c6-8b02-8d04-d3a8-d96696ace9b4.png > |

# 参考
[【CoreLocation】位置情報を取得する](https://qiita.com/chino_tweet/items/db3a536234a43a3c31d9)
[[iOS] MapKitを使って”ジオコーディング・逆ジオコーディング”をやってみる](https://dev.classmethod.jp/smartphone/iphone/geocoding-use-mapkit/)

# 開発アプリ
この記事で紹介した位置情報の取得処理を適用したアプリです。
[Go Back Home - 自宅に帰るためのポータルアプリ](https://www.vyeah.jp/go-back-home)