CLGeocoder 將地址字串 (郵編、城市、詳細地址) 轉換為 CLPlacemark (含經緯度、行政區劃等)。
let geocoder = CLGeocoder()
let address = "10001" // 紐約郵編,或 "北京市朝陽區"
geocoder.geocodeAddressString(address) { placemarks, error in
if let error = error {
print("地理編碼失敗: \(error.localizedDescription)")
// 錯誤碼處理: kCLErrorNetwork, kCLErrorGeocodeFoundNoResult 等
return
}
guard let placemark = placemarks?.first else {
print("無結果")
return
}
if let location = placemark.location {
let lat = location.coordinate.latitude
let lon = location.coordinate.longitude
print("座標: \(lat), \(lon)")
// 使用座標...
}
// 額外信息
print("國家: \(placemark.country ?? "")")
print("城市: \(placemark.locality ?? "")")
print("郵編: \(placemark.postalCode ?? "")")
}
// 僅在指定區域內搜索 (如當前地圖可見區域)
let region = CLCircularRegion(center: mapView.region.center,
radius: mapView.region.span.latitudeDelta * 111000,
identifier: "map_region")
geocoder.geocodeAddressString(address, in: region) { placemarks, error in
// 結果優先匹配區域內
}
let location = CLLocation(latitude: 39.9042, longitude: 116.4074)
geocoder.reverseGeocodeLocation(location) { placemarks, error in
if let placemark = placemarks?.first {
let address = [
placemark.name, // POI 名稱
placemark.thoroughfare, // 街道
placemark.subThoroughfare,// 號碼
placemark.locality, // 城市
placemark.administrativeArea, // 省/州
placemark.postalCode, // 郵編
placemark.country // 國家
].compactMap { $0 }.joined(separator: ", ")
print("地址: \(address)")
}
}
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:@"10001"
completionHandler:^(NSArray * _Nullable placemarks, NSError * _Nullable error) {
if (error) {
NSLog(@"錯誤: %@", error.localizedDescription);
return;
}
for (CLPlacemark *placemark in placemarks) {
CLLocation *loc = placemark.location;
NSLog(@"緯度: %f, 經度: %f", loc.coordinate.latitude, loc.coordinate.longitude);
}
}];
| 錯誤碼 | 含義 | 處理建議 |
|---|---|---|
kCLErrorNetwork | 網絡不可用 | 提示用戶檢查網絡、重試機制 |
kCLErrorGeocodeFoundNoResult | 無匹配結果 | 提示「未找到地址」、建議輸入更詳細地址 |
kCLErrorGeocodeFoundPartialResult | 部分匹配 | 返回結果但提示可能不準確 |
kCLErrorDeferred | 請求延遲 (頻率限制) | 指數退避重試、避免高頻調用 |
preferredLocale 指定NSLocationWhenInUseUsageDescription (雖純地理編碼不強制,但建議配置)
func geocodeAddress(_ address: String) async throws -> CLLocationCoordinate2D {
let geocoder = CLGeocoder()
let placemarks = try await geocoder.geocodeAddressString(address)
guard let coordinate = placemarks.first?.location?.coordinate else {
throw CLError(.geocodeFoundNoResult)
}
return coordinate
}
// 使用
Task {
do {
let coord = try await geocodeAddress("北京市海淀區")
// 更新地圖...
} catch {
// 錯誤處理
}
}