如何从reverseGeocodeCoordinate获得国家,州,市?
GMSReverseGeocodeResponse
包含
- (GMSReverseGeocodeResult *)firstResult;
其定义如下:
@interface GMSReverseGeocodeResult : NSObject /** Returns the first line of the address. */ - (NSString *)addressLine1; /** Returns the second line of the address. */ - (NSString *)addressLine2; @end
有没有办法从这两个字符串获取国家,ISO国家代码,州(administrative_area_1或相应的一个)(对所有国家和所有地址有效 )?
注意:我试图执行这段代码
[[GMSGeocoder geocoder] reverseGeocodeCoordinate:CLLocationCoordinate2DMake(40.4375, -3.6818) completionHandler:^(GMSReverseGeocodeResponse *resp, NSError *error) { NSLog( @"Error is %@", error) ; NSLog( @"%@" , resp.firstResult.addressLine1 ) ; NSLog( @"%@" , resp.firstResult.addressLine2 ) ; } ] ;
但由于某种原因,处理程序从未被调用过。 我确实添加了应用密钥,并将iOS捆绑包ID添加到了应用密钥。 控制台中未打印错误。 有了这个,我的意思是我不知道线条的内容。
最简单的方法是升级到 iOS 版 Google Maps SDK 1.7 版 (2014年2月发布)。
从发行说明 :
GMSGeocoder
现在通过GMSAddress
提供结构化地址,弃用GMSReverseGeocodeResult
。
从GMSAddress
类参考 ,您可以找到以下属性 :
coordinate
位置,或kLocationCoordinate2DInvalid
如果未知。
thoroughfare
街道号码和名称。
locality
地方或城市。
subLocality
地方,地区或公园的细分。
administrativeArea
地区/州/行政区。
postalCode
邮政编码。
country
国名。
lines
包含地址格式化行的NSString
数组。
但是没有ISO国家代码。
另请注意,某些属性可能返回nil
。
这是一个完整的例子:
[[GMSGeocoder geocoder] reverseGeocodeCoordinate:CLLocationCoordinate2DMake(40.4375, -3.6818) completionHandler:^(GMSReverseGeocodeResponse* response, NSError* error) { NSLog(@"reverse geocoding results:"); for(GMSAddress* addressObj in [response results]) { NSLog(@"coordinate.latitude=%f", addressObj.coordinate.latitude); NSLog(@"coordinate.longitude=%f", addressObj.coordinate.longitude); NSLog(@"thoroughfare=%@", addressObj.thoroughfare); NSLog(@"locality=%@", addressObj.locality); NSLog(@"subLocality=%@", addressObj.subLocality); NSLog(@"administrativeArea=%@", addressObj.administrativeArea); NSLog(@"postalCode=%@", addressObj.postalCode); NSLog(@"country=%@", addressObj.country); NSLog(@"lines=%@", addressObj.lines); } }];
及其输出:
coordinate.latitude=40.437500 coordinate.longitude=-3.681800 thoroughfare=(null) locality=(null) subLocality=(null) administrativeArea=Community of Madrid postalCode=(null) country=Spain lines=( "", "Community of Madrid, Spain" )
或者,您可以考虑在Google地理编码API中使用反向地理 编码 ( 示例 )。
在Swift中回答
使用Google Maps iOS SDK(目前使用的是V1.9.2,您无法指定返回结果的语言):
@IBAction func googleMapsiOSSDKReverseGeocoding(sender: UIButton) { let aGMSGeocoder: GMSGeocoder = GMSGeocoder() aGMSGeocoder.reverseGeocodeCoordinate(CLLocationCoordinate2DMake(self.latitude, self.longitude)) { (let gmsReverseGeocodeResponse: GMSReverseGeocodeResponse!, let error: NSError!) -> Void in let gmsAddress: GMSAddress = gmsReverseGeocodeResponse.firstResult() print("\ncoordinate.latitude=\(gmsAddress.coordinate.latitude)") print("coordinate.longitude=\(gmsAddress.coordinate.longitude)") print("thoroughfare=\(gmsAddress.thoroughfare)") print("locality=\(gmsAddress.locality)") print("subLocality=\(gmsAddress.subLocality)") print("administrativeArea=\(gmsAddress.administrativeArea)") print("postalCode=\(gmsAddress.postalCode)") print("country=\(gmsAddress.country)") print("lines=\(gmsAddress.lines)") } }
使用Google Reverse Geocoding API V3(目前您可以指定返回结果的语言):
@IBAction func googleMapsWebServiceGeocodingAPI(sender: UIButton) { self.callGoogleReverseGeocodingWebservice(self.currentUserLocation()) } // #1 - Get the current user's location (latitude, longitude). private func currentUserLocation() -> CLLocationCoordinate2D { // returns current user's location. } // #2 - Call Google Reverse Geocoding Web Service using AFNetworking. private func callGoogleReverseGeocodingWebservice(let userLocation: CLLocationCoordinate2D) { let url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=\(userLocation.latitude),\(userLocation.longitude)&key=\(self.googleMapsiOSAPIKey)&language=\(self.googleReverseGeocodingWebserviceOutputLanguageCode)&result_type=country" AFHTTPRequestOperationManager().GET( url, parameters: nil, success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in println("GET user's country request succeeded !!!\n") // The goal here was only for me to get the user's iso country code + // the user's Country in english language. if let responseObject: AnyObject = responseObject { println("responseObject:\n\n\(responseObject)\n\n") let rootDictionary = responseObject as! NSDictionary if let results = rootDictionary["results"] as? NSArray { if let firstResult = results[0] as? NSDictionary { if let addressComponents = firstResult["address_components"] as? NSArray { if let firstAddressComponent = addressComponents[0] as? NSDictionary { if let longName = firstAddressComponent["long_name"] as? String { println("long_name: \(longName)") } if let shortName = firstAddressComponent["short_name"] as? String { println("short_name: \(shortName)") } } } } } } }, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in println("Error GET user's country request: \(error.localizedDescription)\n") println("Error GET user's country request: \(operation.responseString)\n") } ) }
我希望这段代码和解释能够帮助未来的读者。
在swift 4.0中,func获取CLLocation并返回邮政地址
func geocodeCoordinates(location : CLLocation)->String{ var postalAddress = "" let geocoder = GMSGeocoder() geocoder.reverseGeocodeCoordinate(location.coordinate, completionHandler: {response,error in if let gmsAddress = response!.firstResult(){ for line in gmsAddress.lines! { postalAddress += line + " " } return postalAddress } }) return "" }