[iOS] CLGeocoder 위도,경도 정보로 지역명 가져오기

hiju·2021년 11월 22일
0

iOS

목록 보기
8/8

CLGeocoder

화면상에 경도/위도값을 가지고 네트워크 연결을 하여, placemark를 뽑아주는 기능!!
즉 coordinate 정보에 맞게 place name으로 변환시켜주는 코더라고 보면 된다.
이런 간편한 기능을 제공하다니,, 🤔

그렇다면 얘는 도대체 어떻게 사용해야할까?

애플문서에는 지오코딩 사용하기 위한 규칙?? 같은게 있음
영어를 한국어로 번역해보았다

  • 하나의 사용자 작업에서 최대 하나의 지오코딩 요청을 보낸다
  • 사용자가 동일한 위치의 지오코딩과 관련된 여러 작업을 수행하는 경우 각 작업에 대한 개별 요청을 시작하는 대신 초기 지오코딩 요청의 결과를 재사용한다
  • 일반적인 상황에서 분당 지오코딩 요청을 두번이상 보내면 안된다고 한다 (일반적이라면 뭐.. 그냥 평소를 말하는 거겠지? ??)
  • 사용자가 결과를 즉시 볼 수 없는 시간에 지오코딩 요청을 시작하지 마세요 앱이 비활성 상태이거나 백그라운드에 있는 경우 요청 시작 xx
  • 근데 이거하려면 네트워크에 액세스할 수 있어야한다
  • 특정 위치에 정보를 사용할 수 없는 경우 에러 보고함
  • Mapkit 과 함께 쓸 수도 있고 독립적으로도 사용 가능

일단 생각해볼게 네트워크 요청이 필요한 거고, 그렇기때문에 너무 빈번하게 가져오면 안됨.!
요청이 각 앱에 대해 비율이 제한되어 있다고 한다, 짧은 시간에 너무 많은 요청을 하면 일부 요청이 실패할 수도 있다고...ㅎ 최대 비율을 초과하면 지오코더는 오류객체로 완료 핸들러에 반환한다고 함.

조심해서 쓰도록 할게요,,

얼마나 제한해서 써야 얘가 괜찮을까??? 한번 시험은 해봐야겠다 🤔

그러면 이제 변환이 어떻게 이루어지고, 네트워크 연결 성공하고나서 받는 객체는 뭐지?
하면 값으로 CLPlacemark 타입 객체를 받는다

CLPlacemark

장소의 이름, 주소 기타 관련 정보 포함하는 사용자에게 친화적인 설명들

name
장소의 이름. (예) 한깉로 12-3

isoCountryCode
축약된 국가 , 또는 지역 이름 (예) KR

country
국가 또는 지역의 이름 (예) 대한민국

postalCode
우편번호 (예) 16212

administrativeArea
시/도 정보 (예) 경기도

subAdminstrativeArea
추가 관리 지역 정보 (예) nil이 나오던데 모르겠슴

locality
장소 표시와 연결된 도시 (예) 수원시

subLocality
추가 도시 수준 정보 (예) 동작구

thoroughfare
상세 주소 (예) 한깉로251번길

subThoroughfare
추가 거리 정보 (예) 16-2

region
지리적 지역 (예) CLRegion으로 나옴 뭐 radius, center.. 위도경도값 나오는듯?

timeZone
연결된 시간대 (예) TimeZone 타입으로 나옴. Asia/Seoul이나GMT+9.. 등등으로 나옴

inlandWater
장소 표시와 연결된 내륙 수역의 이름

ocean
장소 표시와 연결된 바다의 이름

등등.....

암튼 하나하나 반환값 살펴봤는데 프로퍼티들이 많다! 이보다 더 있는데, 그건 애플문서에서 확인을..!
나는 흠.. 어느정도 반환을 해줄까? 생각하다가,
administrativeArea랑 locality + subLocality? 정도만 반환하게 써봤다. ㅎㅎ

사용법

import CoreLocation

let location = CLLocation(latitude: coordinate.latitude, longitude: coordinate.longitude)
let geocoder = CLGeocoder()
let locale = Locale(identifier: "Ko-kr")
geocoder.reverseGeocodeLocation(findLocation, preferredLocale: locale) { [weak self] placemarks, _ in
	guard let placemarks = placemarks,
	      let address = placemarks.last
	else { return }
	DispatchQueue.main.async {
		self?.=-----label.text = "" //하고싶은 액션 적기
	}
}

위도/경도 값을 가진 CLLocation을 reverseGeocodeLocation()에 넣어서 요청을 한다.
locale은 넣어도 되구 안넣어도 된다! 선택사항 ㅎㅎ
클로저 매개변수로 CLPlacemark 객체가 변환된다. 내가 넣었던 경도/위도에 맞게 웅~ 알아써 여기에 대한 사용자 친화적인 정보들을 줄게~ 하는거!

흠... 끗

profile
IOS 개발자

0개의 댓글