Подтвердить что ты не робот

Как найти текущий уровень масштабирования MKMapView?

Я хочу знать текущий уровень масштабирования MKMapView в программировании на iphone, как я могу это сделать? На самом деле у меня есть одно приложение, которое принимает несколько аргументов (Радиус от центра до угла MKMapView) возвращает данные о магазине в том, что, когда я нахожусь на MKMapView, радиус очень высокий, и он изменяется, когда Radius меньше, поэтому я хочу знать уровень масштабирования и настроить свой веб-сервис в соответствии с этим. Как я могу получить уровень масштабирования текущей видимой области MKMapView?

4b9b3361

Ответ 1

Вы можете использовать span внутри свойства region MKMapView. Он определяется следующим образом:

typedef struct {
    CLLocationDegrees latitudeDelta;
    CLLocationDegrees longitudeDelta;
} MKCoordinateSpan;

Взгляните на documentation. Это хорошо объяснено там.

Ответ 2

Я создал для него очень простой вспомогательный подкласс:

#define MERCATOR_RADIUS 85445659.44705395
#define MAX_GOOGLE_LEVELS 20

@interface MKMapView (ZoomLevel)
- (double)getZoomLevel;
@end

@implementation MKMapView (ZoomLevel)

- (double)getZoomLevel
{
    CLLocationDegrees longitudeDelta = self.region.span.longitudeDelta;
    CGFloat mapWidthInPixels = self.bounds.size.width;
    double zoomScale = longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * mapWidthInPixels);
    double zoomer = MAX_GOOGLE_LEVELS - log2( zoomScale );
    if ( zoomer < 0 ) zoomer = 0;
//  zoomer = round(zoomer);
    return zoomer;
}

@end

Ответ 3

Самый простой способ получить Integer текущего уровня масштабирования - это использовать функцию MapView: regionDidChangeAnimated. Эта функция распознает каждое изменение масштаба и даст вам основание для вычисления коэффициента масштабирования.

Просто вставьте эту функцию в свой класс MapView (работает для Swift 3.0):

var mapView: MKMapView! = nil

...

func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
    let zoomWidth = mapView.visibleMapRect.size.width
    let zoomFactor = Int(log2(zoomWidth)) - 9
    print("...REGION DID CHANGE: ZOOM FACTOR \(zoomFactor)")
}

И вы получите из него значение zoomFactor, где 0 - самая близкая точка, которую вы можете увеличить на карте, и каждое более высокое значение - это далекое расстояние...: -)

Ответ 4

Все предыдущие ответы не учитывают текущее вращение карты. MKMapView longitudeDelta отличается для невращающейся карты и повернутой карты. Вот большая функция для вычисления прямого масштабирования карты: fooobar.com/questions/65310/...

И вот мое улучшение в Swift, которое учитывает поворот карты и возвращает текущий уровень масштабирования:

class MyMapView : MKMapView {

  func getZoom() -> Double {
    // function returns current zoom of the map
    var angleCamera = self.camera.heading
    if angleCamera > 270 {
        angleCamera = 360 - angleCamera
    } else if angleCamera > 90 {
        angleCamera = fabs(angleCamera - 180)
    }
    let angleRad = M_PI * angleCamera / 180 // camera heading in radians
    let width = Double(self.frame.size.width)
    let height = Double(self.frame.size.height)
    let heightOffset : Double = 20 // the offset (status bar height) which is taken by MapKit into consideration to calculate visible area height
    // calculating Longitude span corresponding to normal (non-rotated) width
    let spanStraight = width * self.region.span.longitudeDelta / (width * cos(angleRad) + (height - heightOffset) * sin(angleRad))
    return log2(360 * ((width / 256) / spanStraight)) + 1;
  }

}

Вы можете загрузить образец проекта в моем репо: https://github.com/d-babych/mapkit-wrap

Ответ 5

Если это помогает, вы также можете использовать mapView.camera.altitude чтобы получить текущую высоту отображаемой в данный момент области карты.