2013-02-23 6 views
22

GMSReverseGeocodeResponse содержитКак получить страну, штат, город от reverseGeocodeCoordinate?

- (GMSReverseGeocodeResult *)firstResult; 

, определение, как:

@interface GMSReverseGeocodeResult : NSObject<NSCopying> 

/** 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 к ключу приложения. В консоли не отображается ошибка. Я имею в виду, что я не знаю содержания строк.

+0

Я открыл запрос на картах google ios sdk http://code.google.com/p/gmaps-api-issues/issues/detail?id=4974 – user2101384

+0

«GMSGeocoder» теперь предоставляет структурированные адреса через 'GMSAddress ', обесценивая' GMSReverseGeocodeResult'. " - [SDK для Карт Google для выпусков выпусков iOS, версия 1.7, февраль 2014] (https://developers.google.com/maps/documentation/ios/releases#version_17_-_february_2014). – Pang

+0

Да, это было исправлено Google (почти 1 год спустя). Я просто не знаю, как закрыть этот вопрос. – user2101384

ответ

33

Самый простой способ - перейти на версию 1.7 из Google Maps SDK for iOS (выпущен в феврале 2014 года).
От release notes:

GMSGeocoder теперь предоставляет структурированные адреса через GMSAddress, протестующий GMSReverseGeocodeResult.

Из GMSAddress Class Reference, вы можете найти these properties:

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

В качестве альтернативы, вы можете рассмотреть возможность использования Reverse Geocoding в The Google Geocoding API (example).

15

Ответ в 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 обратного геокодирования API V3 (в настоящее время вы можете specify язык, на котором следует возвращать результаты):

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

} 

Я надеюсь, что это фрагмент кода и объяснение помогут будущим читателям.