如何找到MKMapView的当前缩放级别?

问题描述 投票:29回答:5

我想知道iphone编程中MKMapView的当前缩放级别,我该怎么做?实际上我有一个应用程序,即几个参数(从MKMapView的中心到角落的半径)返回商店的详细信息,当我在MKMapView时,半径非常高,当Radius较小时它会改变,所以我想知道缩放级别并根据它设置我的webservice,如何获得当前MKMapView可见区域的缩放级别?

iphone mkmapview
5个回答
15
投票

你可以在spanregion财产中使用MKMapView。它的定义如下:

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

看看documentation。那里有很好的解释。


50
投票

我为它创建了非常简单的辅助子类:

#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

10
投票

获取当前缩放级别的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是你可以放大到地图的最近点,每个更高的值是一个遥远的变焦...... :-)


5
投票

所有先前的答案都没有考虑当前的地图旋转。 MKMapView的longitudeDelta因非旋转地图和旋转地图而异。这是直接地图缩放计算的一个很好的功能:https://stackoverflow.com/a/15020534/4923516

这是我对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


0
投票

如果它有帮助您也可以使用mapView.camera.altitude来获取当前显示的地图区域的当前高度。

当我搜索如何获得地图缩放级别时,这就是帮助我的。

© www.soinside.com 2019 - 2024. All rights reserved.