2012-04-18 13 views
9

ho il seguente codice:CLGeocoder ritorno sedi in altri paesi

CLGeocoder *_geo = [[CLGeocoder alloc] init]; 
CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter: CLLocationCoordinate2DMake(37.33233141, -122.03121860) radius:100 identifier:@"San Francisco"]; 
[_geo geocodeAddressString:@"Starbucks" inRegion:region 
      completionHandler:^(NSArray *placemarks, NSError *error) 
{ 
    NSLog("%@", placemarks); 
}]; 

Ciò restituisce una posizione Starbucks nelle Filippine, anche se il centro è al centro di San Francisco.

(NSArray *) $3 = 0x07cd9d10 <__NSArrayM 0x7cd9d10>(
Starbuck's, Metro Manila, Quezon City, Republic of the Philippines @ <+14.63617752,+121.03067530> +/- 100.00m, region (identifier <+14.63584900,+121.02951050> radius 166.35) <+14.63584900,+121.02951050> radius 166.35m 
) 

Qualche idea?

risposta

2

Anche se sembra improbabile, sembra senz'altro che a) Apple non intendesse in avanti nomi commerciali di geocodifica vicino a una regione, oppure b) questo è un bug.

Il CLGeocoder reference, nella sua panoramica, afferma:

richieste Forward-geocoding prendono un indirizzo leggibile dall'utente e trovano la latitudine corrispondente e valore di longitudine ...

che implica certamente un indirizzo fisico reale come stringa di ricerca (in particolare la parte "indirizzo leggibile dall'utente"). Tuttavia, la documentazione per geocodeAddressString: inRegion: completionHandler: afferma che la stringa di ricerca è:

... una stringa che descrive la posizione che si desidera cercare ...

che è ancora più vago. Ho provato a eseguire il tuo codice e codice molto simile ad esso, attraverso un paio di miei progetti e ottengo lo stesso risultato. Anche AppleGeocoderDemo sample mostra il problema (anche se vivo in California a ~ 150 miglia dal tuo esempio lat/long), quindi non è certamente nulla che nessuno di noi abbia scritto.

Ho deciso di cercare di aiutare a risolvere questo problema per/con voi! Ma questa ricerca è tutto ciò che ho. Buona fortuna.

+0

Mi chiedo come fa l'applicazione ufficiale di Google Maps?Sembra che lo stiano facendo correttamente quando digito Starbucks nell'app – ninjaneer

+0

È uno scatto totale al buio, ma probabilmente non usano CoreLocation. L'app Google Maps era presente in iOS 1.0, CoreLocation non appariva prima di iOS 2.0 e CLGeocoder non appariva fino a iOS 5.0. Inoltre, non c'è modo di dire quali limitazioni potrebbero aver imposto Google a Apple come parte dei termini per includere la tecnologia di mappatura di Google su iPhone senza costi (diretti) per gli utenti. –

3

Provare lo stesso problema. Ho presentato un bug con Apple. Ti aggiornerò qui una volta che avrò una risposta.

+0

Eventuali notizie su questo là anni dopo lol – trapper

4

Ecco una soluzione che sta lavorando per me. Sto usando geocodeAddressString: completionHandler: senza prendere in considerazione le regioni.

Dopodiché, ho creato una serie di segnaposto in base a quello restituito, ma includendo solo quelli più vicini.

Si noti che questo codice non controlla se si è verificato un errore. L'ho rimosso per renderlo più semplice.

CLLocation *centerLocation = [[CLLocation alloc] initWithLatitude:37.33233141 longitude:-122.03121860]; 

CLLocationDistance maxDistance = <YOUR_MAX_DISTANCE>; 

CLGeocoder *geo = [[CLGeocoder alloc] init]; 
[geo geocodeAddressString:addressString 
     completionHandler:^(NSArray *placemarks, NSError *error) 
{ 
    NSMutableArray *filteredPlacemarks = [[NSMutableArray alloc] init]; 
    for (CLPlacemark *placemark in placemarks) 
    { 
     if ([placemark.location distanceFromLocation:centerLocation] <= maxDistance) 
     { 
      [filteredPlacemarks addObject:placemark]; 
     } 
    } 

    // Now do whatever you want with the filtered placemarks. 
}]; 

In alternativa, se si desidera continuare a lavorare con le regioni: invece di confrontare le distanze con distanceFromLocation:, è possibile utilizzare CLRegion s' containsCoordinate:.

Spero che aiuti.

Problemi correlati