"Transform the user’s location displayed on a map into an informative textual description by reverse geocoding."
지도에 표시된 사용자의 위치를 리버스 지오코딩을 통해 정보를 갖는 텍스트 설명으로 변환합니다.
사용자를 지도 컨텐트를 사용하는 앱의 요소로 안내하기 위해 지도에서 사용자의 위치를 보여줄 수 있습니다. 예를 들어 사용자의 현재 위치는 검색 결과를 가져오거나 방향을 계산하기 위해 레피런스의 지점이 될 수 있습니다. 추가적으로 지도 바깥에 위치 정보를 표시할 수 있으며, 사용자의 현재 도시 혹은 거리 주소로 채워진 검색 영역 같은 것이 대표적입니다. 앱에서 이러한 정보를 제공하려면 사용자의 위치를 표시하기 위한 지도 뷰를 설정해야 하고, 위치를 정보를 갖는, 사용자 친화적인 데이터로 번역해야 합니다.
사용자 친화적인 장소 정보를 제공하려면 사용자의 현재 표시를 표시하기 위해 showsUserLocation
을 활성화해서 지도 뷰를 설정해야 합니다. 이 속성을 활성화 한 후 지도 딜리게이트는 mapView(_:didUpdate:)
를 통해 사용자의 위치에 대한 업데이트를 받기 시작하며, MKUserLocation
객체로 나타납니다.
CLPlacemark
객체는 사용자 장소명을 나타내며, 거리 이름, 도시 이름, 국가 혹은 지역명, 기타 다른 장소 아이덴티파이어에 대한 속성을 포함합니다. mapView(_:didUpdate:)
가 사용자의 위치에 대한 업데이트를 받으면 MKUserLocation
객체를 CLGeocoder
를 갖는 리버스 지오코딩 위치 속성을 통해 CLPlacemark
으로 변환합니다. 사용자 위치의 읽을 수 있는 설명은 장소표시에서 속성으로써 사용 가능하며, locality
속성에 저장된 도시 정보와 같은 것이 있습니다.
Important
지오코딩 요청은 각 앱에서 rate가 제한됩니다.
Important
Geocoding requests are rate-limited for each app. Issue new geocoding requests only when the user has moved a significant distance and after a reasonable amount of time has passed.
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
guard let newLocation = userLocation.location else { return }
let currentTime = Date()
let lastLocation = self.currentLocation
self.currentLocation = newLocation
// Only get new placemark information if you don't have a previous location,
// if the user has moved a meaningful distance from the previous location, such as 1000 meters,
// and if it's been 60 seconds since the last geocode request.
if let lastLocation = lastLocation,
newLocation.distance(from: lastLocation) <= 1000,
let lastTime = lastGeocodeTime,
currentTime.timeIntervalSince(lastTime) < 60 {
return
}
// Convert the user's location to a user-friendly place name by reverse geocoding the location.
lastGeocodeTime = currentTime
geocoder.reverseGeocodeLocation(newLocation) { (placemarks, error) in
guard error == nil else {
self.handleError(error)
return
}
// Most geocoding requests contain only one result.
if let firstPlacemark = placemarks?.first {
self.mostRecentPlacemark = firstPlacemark
self.currentCity = firstPlacemark.locality
}
}
}
위도/경도 쌍과 해당 위치의 더 사용자 친화적 설명 사이를 변환합니다.
https://developer.apple.com/documentation/corelocation/converting_between_coordinates_and_user-friendly_place_names
https://velog.io/@panther222128/Converting-Between-Coordinates-and-User-Friendly-Place-Names