防止叠加在缩放时消失 - MKMapView& MKOverlay

时间:2010-12-04 03:12:34

标签: iphone mkmapview overlay tiles

我正在使用通过MKMapView和MKOverlay使用半透明平铺地图叠加层的iPhone / iPad应用程序。

我希望用户能够深入放大地图,但我的地图叠加层的分辨率只会达到6级。

我不想限制缩放。

但是......如果用户缩放“太远”然后滚动到新的图块,如果它们比覆盖图块树更深,则不会绘制我的叠加层。

我希望即使在用户放大深度时也能绘制叠加层。

有没有最佳实践来实现这一目标?

我提出了两个选项:

1)设置用户可以缩放的范围限制。不理想,因为即使叠加是低分辨率,它们仍可能在透明的彩色范围内,并且透明的覆盖层看似消失是误导。

2)预渲染瓷砖比其他方式更深入...这样可行,但它会使我的应用程序的尺寸大小达到一个数量级。

必须有更好的方法。任何想法???

更新:我能找到的最接近的示例代码是来自WWDC 2010的Apple的TileMap示例。他们的代码遇到了同样的问题 - 如果放大“太远”,则不会显示地图叠加。< / p>

3 个答案:

答案 0 :(得分:3)

我通过添加“OverZoom”模式修改了Apple的TileMap示例代码。我已发布更多详细信息和我的代码作为this question的答案。

我希望能帮助遇到这个问题的其他人。

答案 1 :(得分:3)

MKTileOverlay具有maximumZ属性。对我来说,我的磁贴服务器只渲染到缩放18(来自osm数据的mapnik),所以我设置了overlay.maximumZ = 18,现在当我放大到19或20(iPhone上最高)时,它只是保持缩放18个瓷砖。

那就是说我正在通过initWithURLTemplate初始化我的叠加层:

在viewDidLoad中(或初始化叠加层的任何地方):

self.mapView.delegate = self;
NSString *urlTemplate = @"http://servername/osm/{z}/{x}/{y}.png";
self.mapOverlay = [[MKTileOverlay alloc] initWithURLTemplate:urlTemplate];
self.mapOverlay.canReplaceMapContent=YES;
[self.map addOverlay:self.overlay level:MKOverlayLevelAboveLabels];

然后实施以下方法:

-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {    
    if([overlay isKindOfClass:[MKTileOverlay class]]) {
        MKTileOverlay *tileOverlay = (MKTileOverlay *)overlay;
        tileOverlay.maximumZ = 18;  // This is what sets the cap, zoom levels further in will not be rendered and instead will keep previous zoom level tiles.
        MKTileOverlayRenderer *renderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:tileOverlay];
        return renderer;
    }
    return nil;
}

答案 2 :(得分:1)

我建议您查看Apple网站上的HazardMap sample code ...这是一个很好的示例,说明如何使用平铺MKOverlay支持所有级别的缩放。