2015-06-29 2 views
6

Sto utilizzando il completamento automatico dell'API di Google Places per iOS e restituisce placeID. Come posso ottenere GMSAddress dal placeID? Attualmente utilizzo lookupPlaceID per ottenere GMSPlace, quindi uso reverseGeocodeCoordinate per ottenere GMSAddress dalle coordinate in GMSPlace. Richiede però l'API di Google 3 volte: Completamento automatico, lookupPlaceID, reverseGeocodeCoordinate.Come ottenere GMSAddress da PlaceID o GMSPlace

C'è un modo per ottenere GMSAddress da PlaceID o GMSPlace direttamente?

+1

Dal [GMSAddress] (https://developers.google.com/maps/documentation/ ios/reference/interface_g_m_s_address), dice 'GMSAddress' è il risultato di una' 'richiesta di geocodifica inversa', contenente un indirizzo leggibile dall'uomo. Quindi devi fare un 'reverseGeocodeCoordinate' per ottenere il' GMSAddress'. Quindi non puoi evitare di usare 'Completamento automatico' e' cercaOrdiniID', quindi 'InvertireGeocoderCoordinate'. – ztan

+0

@ztan capito. grazie – JordanChina

+0

Un problema che potresti avere con questa soluzione è che la proprietà 'name' di' GMSPlace' potrebbe essere diversa dalla proprietà 'thoroughfare' di' GMSAddress', anche se 'coordinate' sono esattamente le stesse. –

risposta

5

Questo è un bug con 1.1.0 dell'SDK di Google Maps per iOS. Vedi here.

Come indicato dalla documentazione here, la proprietà address deve esporre un GMSAddress su istanze GMSPlace.

Sono appena passato a utilizzare l'API REST. Non è male scrivere un wrapper veloce per l'API e abbandonare completamente l'SDK di Google. Se stai usando Alamofire ping me e potrei essere in grado di condividere quello che ho scritto.

+0

hai ragione. Nel documento, c'è la proprietà dell'indirizzo, ma in realtà non viene restituita nell'SDK. – JordanChina

+2

Spero davvero che Google aggiunga quella correzione in 1.10.2 ... Recupero dei dettagli del luogo senza poter accedere all'indirizzo ... Speriamo che la prossima versione venga rilasciata a breve. – manonthemoon

+1

Si prega di tutti 'stella' il problema in modo che riceve più attenzione da Google. https://code.google.com/p/gmaps-api-issues/issues/detail?id=8121 – Robert

1

Ora, per ora, il codice è al di sotto sicuro (sufficiente) per questa versione dell'SDK (1.10.5)? Qual è la probabilità che questo si rompa nei prossimi 6 mesi?

NSArray* dic = [place valueForKey:@"addressComponents"]; 

for (int i=0;i<[dic count];i++) { 
    if ([[[dic objectAtIndex:i] valueForKey:@"type"] isEqualToString:@"street_number"]) { 
    NSLog(@"street_number: %@",[[dic objectAtIndex:i] valueForKey:@"name"]); 
} 
+0

Se ci si accerta di non aver mai accidentalmente aggiornato l'SDK (ad esempio, eseguendo un 'pod install' senza una versione SDK esplicitamente definita), allora sì, questo è sicuro in termini di non crash. Tuttavia, non puoi essere sicuro di ciò che 'addressComponents' contiene e potresti finire senza dati corretti. Al momento ho riscontrato lo stesso problema e ho preferito l'approccio descritto nella domanda. –

+0

puoi aiutarmi a recuperare il codice postale da GMSPlace. –

3

ho potuto ottenere l'indirizzo da placedID in una chiamata API, ecco il codice:

GMSPlacesClient *placesClient = [[GMSPlacesClient alloc] init]; 

[placesClient lookUpPlaceID:result.placeID callback:^(GMSPlace *place, NSError *error) { 
    if (error != nil) { 
     NSLog(@"Place Details error %@", [error localizedDescription]); 
     return; 
    } 
    if (place != nil) { 
     NSString *locality = @""; 
     for (GMSAddressComponent *add in place.addressComponents) { 
      //locality 
       NSLog(@"%@",add.type); 
       NSLog(@"%@",add.name); 
//type will be street_name, locality, admin_area, country, 
//name will hold the corresponding value 
     } 

    } else { 
     NSLog(@"No place details for %@", result.placeID); 
    } 

}];