我正在使用通过MKMapView和MKOverlay使用半透明平铺地图叠加层的iPhone / iPad应用程序。
我希望用户能够深入放大地图,但我的地图叠加层的分辨率只会达到6级。
我不想限制缩放。
但是......如果用户缩放“太远”然后滚动到新的图块,如果它们比覆盖图块树更深,则不会绘制我的叠加层。
我希望即使在用户放大深度时也能绘制叠加层。
有没有最佳实践来实现这一目标?
我提出了两个选项:
1)设置用户可以缩放的范围限制。不理想,因为即使叠加是低分辨率,它们仍可能在透明的彩色范围内,并且透明的覆盖层看似消失是误导。
2)预渲染瓷砖比其他方式更深入...这样可行,但它会使我的应用程序的尺寸大小达到一个数量级。
必须有更好的方法。任何想法???
更新:我能找到的最接近的示例代码是来自WWDC 2010的Apple的TileMap示例。他们的代码遇到了同样的问题 - 如果放大“太远”,则不会显示地图叠加。< / p>
答案 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
支持所有级别的缩放。