2012-04-18 13 views
9

tengo el siguiente código:CLGeocoder regresar ubicaciones en otros países

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); 
}]; 

Esto devuelve una tienda Starbucks en las Filipinas a pesar de que el centro está en el centro de 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 
) 

¿Alguna idea?

Respuesta

2

Aunque parece improbable, sin duda parece que a) Apple no tenía la intención de enviar nombres de empresas de geocodificación cerca de una región, ob) esto es un error.

El CLGeocoder reference, en su visión general, establece:

peticiones hacia el geocodificación toman una dirección legible por el usuario y encontrar la latitud correspondiente y el valor de la longitud ...

que sin duda implica una dirección física real como la cadena de búsqueda (especialmente la parte de "dirección legible por el usuario"). Sin embargo, la documentación para geocodeAddressString: inRegion: completionHandler: establece que la cadena de búsqueda es:

... una cadena que describe la ubicación que desea buscar ...

que es aún más vaga. Intenté ejecutar tu código y código muy similar a él, a través de un par de mis proyectos y obtengo el mismo resultado. Incluso el de Apple GeocoderDemo sample presenta el problema (aunque yo vivo en California a ~ 150 millas de su ejemplo de latitud/longitud), por lo que ciertamente ninguno de nosotros ha escrito.

¡Me puse a buscar ayuda para resolver este problema para/contigo! Pero, este poco de investigación es todo lo que tengo. La mejor de las suertes.

+0

Me pregunto ¿cómo lo hace la aplicación oficial de Google Maps?Parece que lo están haciendo correctamente cuando escribo en Starbucks en la aplicación – ninjaneer

+0

Es un tiro total en la oscuridad, pero probablemente no estén usando CoreLocation. La aplicación Google Maps estuvo presente en iOS 1.0, CoreLocation no apareció hasta iOS 2.0 y CLGeocoder no apareció hasta iOS 5.0. Tampoco hay forma de saber qué limitaciones puede haber puesto Google en Apple como parte de sus términos para incluir la tecnología de mapeo de Google en el iPhone a un costo (directo) para los usuarios. –

3

Experimentando el mismo problema. He archivado un error con la manzana. Te actualizaré aquí una vez que reciba una respuesta.

+0

Cualquier noticia sobre esto años después lol – trapper

4

Aquí es una solución que funciona para mí. Estoy usando geocodeAddressString: completionHandler: sin tener en cuenta las regiones.

Después de eso, construyo una matriz de marcas de posición basadas en la devuelta pero solo incluyendo las más cercanas.

Tenga en cuenta que este código no verifica si ha habido un error. Lo he eliminado para hacerlo más simple.

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. 
}]; 

Alternativamente, si desea seguir trabajando con las regiones: en lugar de comparar las distancias con distanceFromLocation:, puede utilizar CLRegion 's containsCoordinate:.

Espero que ayude.

Cuestiones relacionadas