dev._.note

[Swift] Mapkit 위치 검색 본문

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