テックキャンプ130日目〜マップから緯度経度を取得

kobasaです(´ω`*)
外部ディスプレイの設定が上手くいかなくて悩んでいました。
2Kのディスプレイに接続しているのに選択肢に2560×1440が出てこない?

購入したディスプレイの問題なのか、Mac側の問題なのかもわからなかったのですが、
やっと解決しました!option押しながら解像度変更ボタンクリックで出てきました!
なんで隠しコマンドみたいになってんだw
これで作業効率が上がるといいすねぇ。

130日目の勉強内容

マップを画面に表示させる

・ライブラリーから「MapKitView」を選択。UI上でマップを表示させたい範囲に編集する。
・「MapKit」「CoreLocation」をimportする。
・「CLLocationManagerDelegate」「UIGestureRecognizerDelegate(長押しの操作)」
のプロトコルを宣言する。

これでマップ表示は終わり!表示させるだけなら簡単ですね!

ロングタップ(長押し)の設定

ライブラリから「Long Press Gesture Recognizer」を選択し、
ロングタップの設定をしたい要素の上にドロップする。
UIバーの右から2番目に「Long Press Gesture Recognizer」が表示されるので、
control+ドラッグでコードに紐付ける。このときactionとして使用する場合は、
Typeに「UILongPressGestureRecognizer」を選択する(Anyではない)

@IBAction func longPressTap(_ sender: UILongPressGestureRecognizer) {
	//タップを開始したときの処理
	if sender.state == .began{
        
	//タップを終了したときの処理
	}else if sender.state == .ended{

        }
}

マップ上から緯度と経度を取得する

ロングタップした位置から緯度と軽度を取得し、住所に変換するメソッドに渡す。
タップを終了したときの処理内に記述。

//画像のロングタップした位置を変数化
let tapPoint = sender.location(in: view)

//ロングタップした画像の位置(CGPoint)を指定してMKMapView上の
//緯度「latitude」経度「longitude」を取得
let center = mapView.convert(tapPoint, toCoordinateFrom: mapView)
let lat = center.latitude
let log = center.longitude

//取得した緯度経度を引数に指定し、住所に変換するメソッドを呼び出し
convert(lat: lat, log: log)

緯度と経度を住所に変換する(逆ジオコーディング)

緯度と経度から住所を割り出し、ラベルに表示させるメソッド。
やたらif文が多い。省略できるところがあるかも。

func convert(lat:CLLocationDegrees, log:CLLocationDegrees){
	let geocoder = CLGeocoder()
	let location = CLLocation(latitude: lat, longitude: log)
        
	geocoder.reverseGeocodeLocation(location) { (placeMark,error) in
		if let placeMark = placeMark{
			if let pm = placeMark.first{
				if pm.administrativeArea != nil || pm.locality != nil{                        
					self.addressString = pm.name! + pm.administrativeArea! + pm.locality!
				}else{
				//都市がないような場所は名前を表示させる処理
				self.addressString = pm.name!
				}
			}
			self.addressLabel.text = self.addressString
		}
	}
}

geocoder.reverseGeocodeLocation(location) { (placeMark,error) in
の部分はクロージャーという書き方でplaceMarkerrorの値が入った後に括弧内がよばれる。
クロージャーの中では「外で宣言した変数にはselfをつける」というルールがある。

取得した緯度経度のadministrativeAreaやlocalityが空白でなければ
name・administrativeArea・localityを足し合わせて、住所としてラベルに表示させる。
・name:町名から番地・建物名まで入る。
administrativeArea:都道府県が入る。
locality:市区町村が入る。日本で使用するならnameが最後の方が良いのでは?

地域名が空白の位置などをタップしてしまうとエラーになってしまうぽい。
今回はその辺りのバリデーションはなし。エラーを発生させない工夫は大変そうですね。

コメント

タイトルとURLをコピーしました