防止覆盖在缩放时消失 - MKMapView & MKOverlay

Posted

技术标签:

【中文标题】防止覆盖在缩放时消失 - MKMapView & MKOverlay【英文标题】:Preventing overlays from disappearing when zoomed - MKMapView & MKOverlay 【发布时间】:2010-12-04 03:12:33 【问题描述】:

我正在开发一个 iPhone / iPad 应用程序,该应用程序通过 MKMapView 和 MKOverlay 使用半透明平铺地图叠加层。

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

我不想限制缩放。

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

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

是否有任何最佳实践来实现这一目标?

我想出的两个选项:

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

2) 比其他方式更深的预渲染图块...这可行,但它会使我的应用程序的大小膨胀一个数量级。

必须有更好的方法。有什么想法???

更新:我能找到的最接近我正在做的示例代码是来自 WWDC 2010 的 Apple 的 TileMap 示例。他们的代码存在同样的问题 - 如果您放大“太远”,则不会显示地图叠加层。

【问题讨论】:

【参考方案1】:

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

我希望我可以帮助其他遇到此问题的人。

【讨论】:

【参考方案2】:

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;

【讨论】:

这是一个很好的解决方法,但是如果用户在这个“太高的级别”滚动,它不会显示未加载的图块。【参考方案3】:

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

【讨论】:

HazardMap 是一个很好的例子,但它是通过算法生成图块。我正在使用使用 gdal2tiles 从另一张地图上切下的图块。

以上是关于防止覆盖在缩放时消失 - MKMapView & MKOverlay的主要内容,如果未能解决你的问题,请参考以下文章

MKMapView 缩放以显示框架中的所有注释

MKMapView 覆盖在 appDidBecomeActive 上重置

如果在添加注释时缩放,MKMapView 会崩溃

相对于缩放级别缩放 MKMapView 注释

MKMapView 不移动和缩放到搜索结果

从另一个类缩放 MkMapView