Обновление MKMapView до CLPlacemark, возвращенного из CLGeocoder

Я хочу иметь возможность обновлять регион, отображаемый в MKMapView, позволяя пользователю вводить адрес или местоположение в UIAlertView. В настоящее время у меня есть:

        if (geocoder.geocoding)
            [geocoder cancelGeocode];

        [geocoder geocodeAddressString:[[alertView textFieldAtIndex:0] text] completionHandler:^(NSArray *placemarks, NSError *error) {
            if (!error) {
                NSLog(@"Found a location");
            } else {
                NSLog(@"Error in geocoding");
            }

            NSLog(@"Num found: %d", [placemarks count]);

            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            MKCoordinateRegion region;
            region.center.latitude = placemark.region.center.latitude;
            region.center.longitude = placemark.region.center.longitude;
            MKCoordinateSpan span;
            double radius = placemark.region.radius / 1000;

            NSLog(@"Radius is %f", radius);
            span.latitudeDelta = radius / 112.0;
            //span.longitudeDelta = ??? 

            region.span = span;

            NSLog(@"Region is %f %f %f", region.center.latitude, region.center.longitude, span.latitudeDelta);

            [mapView setRegion:region animated:YES];
        }];

Моя проблема в том, что я не уверен, как рассчитать дельту долготы.


person brendan    schedule 06.02.2012    source источник
comment
Вы можете просто установить его равным latitudeDelta, и вид карты будет корректироваться по мере необходимости. Но вам не нужно рассчитывать пролет самостоятельно в первую очередь. Вы можете использовать region = MKCoordinateRegionMakeWithDistance(placemark.region.center, placemark.region.radius, placemark.region.radius);. Не уверен насчет второй части вашего вопроса.   -  person    schedule 06.02.2012
comment
Кажется, это работает. Я предполагаю, что мне придется использовать сторонний геокодер, чтобы увидеть все результаты с одинаковым именем.   -  person brendan    schedule 06.02.2012
comment
Анна, не могли бы вы добавить это в качестве ответа?   -  person brendan    schedule 25.02.2012


Ответы (1)


Вы можете просто установить его равным latitudeDelta, и вид карты изменится по мере необходимости.

Но вам не нужно рассчитывать пролет самостоятельно в первую очередь. Вы можете использовать:

region = MKCoordinateRegionMakeWithDistance(
             placemark.region.center, 
             placemark.region.radius, 
             placemark.region.radius);

Не уверен насчет второй части вашего вопроса.


В iOS 7 и выше region, возвращаемый CLPlacemark, на самом деле является CLCircularRegion (см. Устаревшие методы CLRegion - как получить радиус?).

Хотя исходный код по-прежнему будет работать как есть, вы можете получить предупреждение компилятора о том, что radius и center устарели.

Чтобы избежать предупреждения, введите region как CLCircularRegion:

CLCircularRegion *pmCircularRegion = (CLCircularRegion *)placemark.region;

region = MKCoordinateRegionMakeWithDistance(
         pmCircularRegion.center,
         pmCircularRegion.radius,
         pmCircularRegion.radius);
person Community    schedule 25.02.2012
comment
К сожалению, центр устарел. - person Ben Affleck; 17.03.2015
comment
@ Энди, спасибо, я разместил код, который должен избегать предупреждения компилятора. - person ; 17.03.2015