То, что вы имеете в виду, - это прямое геокодирование, и, к сожалению, Apple не предоставила API для этого. Тем не менее, есть следующая лучшая вещь, сторонний API. Проверьте этот проект, я успешно использовал его в двух проектах, прекрасно работает: https://github.com/bjornsallarp/BSForwardGeocoder
Убедитесь, что вы включили необходимые файлы, чтобы вы могли включить BSForwardGeocoder без ошибок. Затем просто создайте класс, который вы хотите использовать в BSForwardGeocoderDelegate, и реализуйте в своем классе следующие два метода протокола:
-(void)queryAddress
{
// Initialize member BSForwardGeocoder object
if (forwardGeocoder == nil) {
forwardGeocoder = [[BSForwardGeocoder alloc] initWithDelegate:self];
}
// send the request
[forwardGeocoder findLocation:@"Saint Paul, MN"];
}
и
-(void)forwardGeocoderFoundLocation:(BSForwardGeocoder *)geocoder
{
/*
* BSForwardGeocoder delegate method. Receives the callback upon geocoding data gather completion.
*/
if (forwardGeocoder.status == G_GEO_SUCCESS) {
int searchResults = [forwardGeocoder.results count];
for (int i = 0; i < searchResults; i++) {
// See the sample project code fore other useful location properties...
// Here I retrieve the returned lat and lon.
Result *location = [forwardGeocoder.results objectAtIndex:i];
mLatitude = location.latitude;
mLongitude = location.longitude;
}
} else {
NSString *message = @"";
switch (forwardGeocoder.status) {
case G_GEO_BAD_KEY:
message =@"Bad Api Key";
break;
case G_GEO_UNKNOWN_ADDRESS:
message = @"Address Not Found!";
break;
case G_GEO_TOO_MANY_QUERIES:
message = @"Too Many Queries";
break;
default:
break;
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Information"
message:message
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles: nil];
[ alert show ];
[ alert release ];
}
}
Это вернет широту и долготу Сент-Пола, штат Миннесота, используя большую библиотеку, предоставленную sallarp.
Если вы хотите перетащить аннотации вокруг карты и получить информацию о их координатах, это также возможно, вам нужно сделать свой класс делегатом mkmapview и реализовать метод mapView:annotationView:didChangeDragState:fromOldState:
. В вашей реализации сначала проверьте, равен ли newState mkAnnotationViewDragStateEnding, если это так, вы можете получить информацию о его координатах через свойство annotationView.annotation.coordinate. Конечно, вам нужно установить свойство draggable представлений аннотаций в YES. При желании вы можете отправить эти координаты в формате NSString в Google с помощью метода запроса BSForwardGeocoder и получить связанную с ним информацию.
Грег