如何从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 "" } 
Interesting Posts