¿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
¿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
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;
}
Es necesario utilizar un servicio de geocodificación para convertir su dirección de coordenadas. Google, creo, ofrece uno, junto con algunos otros servicios.
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];
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);
}
}
Sería genial si pudiera proporcionar una URL de muestra también. –
Esta es una URL de muestra: http://maps.googleapis.com/maps/api/geocode/json?address=Mall+Road+Lahore+Pakistan&sensor=false –
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];
}
}];
Esta debería ser realmente la respuesta aceptada. Sugiero usar [placemarks firstObject] en lugar de objectAtIndex, y verificar el estado del error. – Ben
Sí, tienes razón, edito el código, solo ten en cuenta que FirstObject solo está disponible públicamente en iOS7 y superior – Climbatize
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. –
Muchas gracias por su respuesta – SampathKumar
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