Converting a User's Location to a Descriptive Placemark

Panther·2021년 8월 24일
0

https://developer.apple.com/documentation/mapkit/mkmapview/converting_a_user_s_location_to_a_descriptive_placemark

"Transform the user’s location displayed on a map into an informative textual description by reverse geocoding."

지도에 표시된 사용자의 위치를 리버스 지오코딩을 통해 정보를 갖는 텍스트 설명으로 변환합니다.

Overview

사용자를 지도 컨텐트를 사용하는 앱의 요소로 안내하기 위해 지도에서 사용자의 위치를 보여줄 수 있습니다. 예를 들어 사용자의 현재 위치는 검색 결과를 가져오거나 방향을 계산하기 위해 레피런스의 지점이 될 수 있습니다. 추가적으로 지도 바깥에 위치 정보를 표시할 수 있으며, 사용자의 현재 도시 혹은 거리 주소로 채워진 검색 영역 같은 것이 대표적입니다. 앱에서 이러한 정보를 제공하려면 사용자의 위치를 표시하기 위한 지도 뷰를 설정해야 하고, 위치를 정보를 갖는, 사용자 친화적인 데이터로 번역해야 합니다.

Display the User Location Annotation

사용자 친화적인 장소 정보를 제공하려면 사용자의 현재 표시를 표시하기 위해 showsUserLocation을 활성화해서 지도 뷰를 설정해야 합니다. 이 속성을 활성화 한 후 지도 딜리게이트는 mapView(_:didUpdate:)를 통해 사용자의 위치에 대한 업데이트를 받기 시작하며, MKUserLocation 객체로 나타납니다.

Geocode the User Location Annotation

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
            }
        }
    }

See Also


Converting Between Coordinates and User-Friendly Place Names

위도/경도 쌍과 해당 위치의 더 사용자 친화적 설명 사이를 변환합니다.

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


0개의 댓글