2010-08-01 30 views
13

¿hay alguna manera de hacer que el MKMapView coloque un pin con una dirección determinada? Sin necesidad de utilizar las coordenadasMKMapView con la dirección

Gracias

Respuesta

21

aquí es un fragmento de código que he usado en una aplicación

-(CLLocationCoordinate2D) getLocationFromAddressString:(NSString*) addressStr { 
    NSString *urlStr = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv", 
          [addressStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    NSString *locationStr = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlStr]]; 
    NSArray *items = [locationStr componentsSeparatedByString:@","]; 

    double lat = 0.0; 
    double lon = 0.0; 

    if([items count] >= 4 && [[items objectAtIndex:0] isEqualToString:@"200"]) { 
     lat = [[items objectAtIndex:2] doubleValue]; 
     lon = [[items objectAtIndex:3] doubleValue]; 
    } 
    else { 
     NSLog(@"Address, %@ not found: Error %@",addressStr, [items objectAtIndex:0]); 
    } 
    CLLocationCoordinate2D location; 
    location.latitude = lat; 
    location.longitude = lon; 

    return location; 
} 
+1

Vale la pena echarle un vistazo a los términos y condiciones de geocodificación de Google (http://code.google.com/apis/maps/documentation/geocoding/), sobre todo si usted está construyendo una aplicación comercial. –

+0

Muchas gracias por su respuesta – SampathKumar

+1

Tenga en cuenta que actualmente (iOS7 está desactivado), puede usar la clase CLGeocoder y reenviar una cadena de dirección para recuperar las coordenadas. Utilice el método: "geocodeAddressString: completionHandler:". De esta forma, no es necesario que se registre en el servicio de geocodificación de Google. – idStar

0

Es necesario utilizar un servicio de geocodificación para convertir su dirección de coordenadas. Google, creo, ofrece uno, junto con algunos otros servicios.

5

aquí es un fragmento de código que he usado en una aplicación

[NSString stringWithContentsOfURL:] es obsoleto por ahora . Usted tiene que utilizar:

NSString *locationStr = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlStr] encoding:NSUTF8StringEncoding error:nil]; 
2

ya que Google ha publicado una nueva versión de su API de geocodificación (upgrade notes), la URL de Google Maps proporcionado por @Aaron Saunders ya no es válida. Además, la respuesta ahora es json o xml, así que hice algunos cambios para abordar esto en la respuesta aceptada.

- (CLLocationCoordinate2D)locationFromAddressString:(NSString*)addressString { 

    if (!addressString.length) { 
     ALog(@"provided an empty 'addressStr'"); 
     return CLLocationCoordinate2DMake(0.0, 0.0); 
    } 

    NSString *urlStr = [NSString stringWithFormat:GOOGLE_MAPS_GEOCODING_URL_STR, 
        [addressString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

    NSError *dataError; 
    NSError *jsonError; 
    NSData *responseData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlStr] 
              options:NSDataReadingMappedAlways 
               error:&dataError]; 
    NSDictionary *responseBody = [NSJSONSerialization JSONObjectWithData:responseData 
                  options:NSJSONReadingMutableContainers 
                   error:&jsonError]; 

    if (!dataError && !jsonError && [responseBody[@"status"] isEqualToString:@"OK"]) { 
     NSDictionary *coords = responseBody[@"results"][0][@"geometry"][@"location"]; 
     return CLLocationCoordinate2DMake([coords[@"lat"] doubleValue], 
             [coords[@"lng"] doubleValue]); 
    } 
    else { 
     ALog(@"Address [%@] not found. \nResponse [%@]. \nError [%@]",addressString, responseBody, jsonError); 
     return CLLocationCoordinate2DMake(0.0, 0.0); 
    } 
} 
+0

Sería genial si pudiera proporcionar una URL de muestra también. –

+1

Esta es una URL de muestra: http://maps.googleapis.com/maps/api/geocode/json?address=Mall+Road+Lahore+Pakistan&sensor=false –

5

Dado que este resultado está en la primera página cuando se hace una búsqueda en Google, creo que es bueno para dar una solución más fresca que la geocodificación de Google (limitado). Es mejor utilizar un codificador geográfico de Apple:

NSString *location = @"your address"; 

CLGeocoder *geocoder = [CLGeocoder new]; 
[geocoder geocodeAddressString:location 
      completionHandler:^(NSArray* placemarks, NSError* error){ 
       if (error) { 
        NSLog(@"%@", error); 
       } else if ([placemarks count]) { 
        CLPlacemark *topResult = [placemarks firstObject]; 
        MKPlacemark *placemark = [[MKPlacemark alloc] initWithPlacemark:topResult]; 


        MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(placemark.coordinate, 5000, 5000); 

        [self.mapView setRegion:region animated:YES]; 
        [self.mapView addAnnotation:placemark]; 
       } 
      }]; 
+1

Esta debería ser realmente la respuesta aceptada. Sugiero usar [placemarks firstObject] en lugar de objectAtIndex, y verificar el estado del error. – Ben

+0

Sí, tienes razón, edito el código, solo ten en cuenta que FirstObject solo está disponible públicamente en iOS7 y superior – Climbatize