另一个MKMapView缩放级别和离线地图

JZa*_*ela 5 offline zoom mkmapview ios mktileoverlay

我一直在iOS 7中使用MKMapView尝试设置并以编程方式获取缩放级别,以便在我离线时下载和重用地图图块.

因为我无法将整个地图下载到我的手机中,所以我只是按照适当的缩放级别下载了几个平铺,然后我修复了缩放级别并使用了思想MKTileOverlayMKTileOverlayRenderer的平铺.

我尝试使用Troybrant的算法(http://troybrant.net/blog/2010/01/set-the-zoom-level-of-an-mkmapview),但它对我来说效果不佳.它无法正确建立缩放级别.

所以我创建了一个我自己的工作正常.

关于我自己的方法的一些解释:

  • 在最大地图缩放级别(20),您将看到每个地图点的比例为1:1.整个地图将有256*2 ^ 20点.

  • 在视网膜显示器中,在地图点和像素之间存在2.0比例因子.

  • Apple地图的缩放级别可以从3到19(最小和最大)不等

  • 然后有一个简单的反向规则:

    • 在最大缩放级别,我们的视图将显示与其具有的像素一样多的点(视网膜显示器的点像素比例因子为2.0)
    • 如果缩放级别降低,则显示的地图点数量应增加(反向规则)


有了这些信息,我们的想法是设置MKMapView的visibleRect属性:

visibleRect width points = 2.0 * mapView.bounds.size.width * 2^(20-zoom)
Run Code Online (Sandbox Code Playgroud)

使用该公式,我已经能够将我的地图居中并适当地应用它们缩放级别.


正如Troybrant所做的那样,我使用以下方法创建了一个类别:

@interface MKMapView (ZoomLevel)

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
                  zoomLevel:(NSUInteger)zoomLevel
                  animated:(BOOL)animated;
@end

@implementation MKMapView (ZoomLevel)

- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
                  zoomLevel:(NSUInteger)zoomLevel
                  animated:(BOOL)animated
{
    MKMapPoint centrePoint = MKMapPointForCoordinate(centreCoord);

    CGFloat rectWidth = 2.0 * self.bounds.size.width * pow(2, 20-zoomLevel);
    CGFloat rectHeight = 2.0 * self.bounds.size.height * pow(2, 20-zoomLevel);

    MKMapRect visibleRect = MKMapRectMake(centrePoint.x-rectWidth/2, centrePoint.y-rectHeight/2, rectWidth, rectHeight);

    [self setVisibleMapRect:visibleRect animated:animated];
}

@end
Run Code Online (Sandbox Code Playgroud)


我希望这段代码可以帮助你们所有人.