防止覆盖在缩放时消失 - 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的主要内容,如果未能解决你的问题,请参考以下文章