Dev/SWIFT
[Swift] Mapkit 위치 검색
Laena
2024. 3. 8. 19:33
한국 기준으로 검색
func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
guard let searchText = searchBar.text, !searchText.isEmpty else { return }
// 한국 내 지역을 중심으로 검색 범위 설정
let koreaRegion = CLCircularRegion(center: CLLocationCoordinate2D(latitude: 37.5665, longitude: 126.9780), radius: 50000, identifier: "Korea")
geocoder.geocodeAddressString(searchText, in: koreaRegion) { [weak self] (placemarks, error) in
guard let strongSelf = self else { return }
if let error = error {
print("Error searching address: \(error)")
return
}
// 검색 결과 중 첫 번째 결과 사용
if let placemark = placemarks?.first, let location = placemark.location {
let region = MKCoordinateRegion(center: location.coordinate, latitudinalMeters: 1000, longitudinalMeters: 1000)
strongSelf.locationPickerView.mapView.setRegion(region, animated: true)
// 검색된 위치의 주소 정보 업데이트
strongSelf.updateAddressLabel(with: placemark, searchText: searchText)
}
}
}
한국형 주소로 구성
private func fetchAddressFromCoordinates(_ coordinates: CLLocationCoordinate2D) {
let location = CLLocation(latitude: coordinates.latitude, longitude: coordinates.longitude)
geocoder.reverseGeocodeLocation(location) { [weak self] (placemarks, error) in
guard let strongSelf = self else { return }
if let error = error {
print("Error fetching address: \(error)")
return
}
if let placemark = placemarks?.first {
var addressComponents: [String] = []
// 주/지역명 추가 (도시명과 동일하지 않은 경우에만 추가)
if let administrativeArea = placemark.administrativeArea, administrativeArea != placemark.locality {
addressComponents.append(administrativeArea)
}
// 도시명 추가
if let locality = placemark.locality {
addressComponents.append(locality)
}
// 도로명 주소 또는 지번 주소 추가 (도로명 주소가 있는 경우 우선적으로 추가)
if let thoroughfare = placemark.thoroughfare {
addressComponents.append(thoroughfare)
if let subThoroughfare = placemark.subThoroughfare {
addressComponents.append(subThoroughfare)
}
} else if let name = placemark.name, !addressComponents.contains(name) {
// 도로명 주소가 없고 지번 주소가 이미 추가된 주소 구성 요소에 포함되지 않은 경우 지번 주소 추가
addressComponents.append(name)
}
let addressString = addressComponents.joined(separator: " ")
DispatchQueue.main.async {
strongSelf.locationPickerView.addressLabel.text = addressString
print("주소: \(addressString)")
}
}
}
}