"Convert between a latitude/longitude pair and a more user-friendly description of that location."
위도/경도 쌍과 해당 위치의 더 사용자 친화적 설명 사이를 변환합니다.
CLLocationManager
객체는 위치를 위도/경도 쌍으로 알려줍니다. 이 값이 고유하게 모든 위치를 나타내는 동안 이 값은 사용자가 즉시 위치에 연결시킬 수 있는 값은 아닙니다. 사용자는 거리 이름 혹은 도시 이름처럼 위치를 설명할 수 있는 이름에 더 익숙합니다. CLGeocoder
클래스는 지리적 좌표와 해당 위치와 관련이 있는 사용자 친화적 이름을 변환할 수 있도록 해줍니다. 위도/경도 쌍을 사용자에게 친근한 장소명으로 변환할 수도 있으며, 그 반대도 가능합니다.
Figure 1 Converting between coordinates and user-friendly descriptions
사용자 장소명은 거리 이름, 도시 이름, 국가 혹은 지역 이름, 우편 번호, 기타 다른 것으로 구체화하기 위한 속성을 포함하고 있는 CLPlacemark
객체에 의해 표현됩니다. 장소표시 역시 관련있는 지리적 형태 혹은 위치에서 관심있는 지점을 설명하는 속성을 포함하고 있으며, 산, 강, 비즈니스, 랜드마크의 이름이 대표적입니다.
지오코더 객체는 one-shot 객체(즉 하나의 변환을 만드려면 각 개체를 사용해야 하는)입니다. 여러 지오코더 객체를 생성할 수 있고 여러 개의 변환을 수행할 수 있지만 애플 rate는 수행할 수 있는 변환의 수를 제한합니다. 짧은 시간 안에 너무 많은 요청을 만드는 것은 몇 가지 요청을 실패시키는 원인이 됩니다. 변환에 대한 관리 방법의 팁은 CLGeocoder
의 오버뷰를 보시기 바랍니다.
CLGeocoder
<>
CLLocation
객체를 갖는 경우 해당 위치에 대한 CLPlacemark
객체를 가져오려면 지오코더 객체의 reverseGeocodeLocation(_:completionHandler:)
메소드를 홏울해야 합니다. 사용자에게 위치에 대한 정보를 표시하길 원하는 경우 보통은 좌표를 장소표시로 변환할 것입니다. 예를 들어 사용자가 지도에서 위치를 선택하면 해당 위치의 주소를 보여주길 원할 것입니다.
Listing 1은 CLLocationManager
객체가 알려준 마지막 장소에 대한 장소표시 정보를 가져오는 방법을 보여주고 있습니다. 지오코더 객체에 대한 호출은 비동기이기 때문에 이 메소드의 호출자는 결과와 함께 실행되는 컴플리션 핸들러로 전달해야 합니다.
Listing 1 Reverse geocoding a coordinate
func lookUpCurrentLocation(completionHandler: @escaping (CLPlacemark?)
-> Void ) {
// Use the last reported location.
if let lastLocation = self.locationManager.location {
let geocoder = CLGeocoder()
// Look up the location and pass it to the completion handler
geocoder.reverseGeocodeLocation(lastLocation,
completionHandler: { (placemarks, error) in
if error == nil {
let firstLocation = placemarks?[0]
completionHandler(firstLocation)
}
else {
// An error occurred during geocoding.
completionHandler(nil)
}
})
}
else {
// No location was available.
completionHandler(nil)
}
}
사용자가 제공한 주소 정보를 갖고 있는 경우 상응하는 위치 데이터를 가져오려면 CLGeocoder
의 메소드를 호출해야 합니다. CLGeocoder
클래스는 사용자 입력 스트링으로 혹은 주소 관련 정보의 딕셔너리으로 변환하는 옵션을 제공합니다. 해당 정보는 애플 서버로 전달되며, 애플 서버는 정보를 해석하고 결과를 반환합니다.
사용자가 제공한 정보의 정확성에 따라 하나 혹은 여러 결과를 받을 수 있습니다. 예를 들어 "100 Main St., USA" 스트링을 전달하는 것은 검색 지역 혹은 추가적인 세부사항을 구체화하지 않는 한 여러 결과를 반환할 것입니다. 어떤 결과가 정확한지 결정하는 것을 돕기 위해 지오코더는 실제로 좌표 및 제공된 기존 정보를 포함하고 있는 CLPlacemark
객체를 반환합니다.
Listing 2는 사용자가 제공한 스트링으로부터 좌표 값을 가져올 수 있는 방법을 보여주고 있습니다. 예시는 첫 번째 결과만을 포함해 제공된 컴플리션 핸들러를 호출하고 있습니다. 스트링이 어떤 위치에도 상응하지 않는 경우 메소드는 오류 및 유효하지 않은 좌표와 함께 컴플리션 핸들러를 호출합니다.
Listing 2 Getting a coordinate from an address string
func getCoordinate( addressString : String,
completionHandler: @escaping(CLLocationCoordinate2D, NSError?) -> Void ) {
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(addressString) { (placemarks, error) in
if error == nil {
if let placemark = placemarks?[0] {
let location = placemark.location!
completionHandler(location.coordinate, nil)
return
}
}
completionHandler(kCLLocationCoordinate2DInvalid, error as NSError?)
}
}
지리적 좌표와 장소명 사이를 변환하는 인터페이스입니다.
https://developer.apple.com/documentation/corelocation/clgeocoder
https://velog.io/@panther222128/CLGeocoder
지리적 좌표의 사용자 친화적 설명이며, 장소명, 주소, 기타 관련 정보를 포함할 수 있습니다.
https://developer.apple.com/documentation/corelocation/clplacemark
https://velog.io/@panther222128/CLPlacemark
지도에 표시된 사용자의 위치를 리버스 지오코딩을 통해 정보를 갖는 텍스트 설명으로 변환합니다.
https://developer.apple.com/documentation/mapkit/mkmapview/converting_a_user_s_location_to_a_descriptive_placemark
https://velog.io/@panther222128/Converting-a-Users-Location-to-a-Descriptive-Placemark