2010-12-04 46 views
5

我正在使用通過MKMapView和MKOverlay使用半透明平鋪地圖疊加層的iPhone/iPad應用程序。當放大時防止疊加層消失 - MKMapView和MKOverlay

我希望用戶能夠深深放大到地圖,但我的地圖疊加的分辨率只到6級

我不想限制變焦。

但是...如果用戶放大「太遠」,然後滾動到新的圖塊,如果它們比覆蓋圖塊的樹更深,則不會繪製我的圖層。

即使在用戶放大的情況下,我也希望覆蓋圖可以繪製。

是否有任何最佳實踐來實現這一目標?

我想出了兩個選項:

1)把遠用戶如何放大的限制。這並不理想,因爲即使覆蓋層的分辨率較低,它們仍可能處於透明色的有色範圍內,並且透明的覆蓋層似乎消失是誤導性的。

2)預渲染的瓷磚比其他方式走得更深......這是有效的,但它會將我的應用程序放大一個數量級。

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

更新:我正在做的最接近的代碼示例是蘋果的WWDC 2010的TileMap示例。它們的代碼遭受同樣的問題 - 如果放大「太遠」,則不會顯示地圖疊加層。

回答

2

我通過添加「OverZoom」模式修改了Apple的TileMap示例代碼。我已發佈更多詳細信息和我的代碼作爲this question的答案。

我希望我可以幫助其他任何人解決這個問題。

1

我建議您查看蘋果網站上的HazardMap sample code ......這是一個很好的例子,說明如何在平鋪的MKOverlay上支持各級縮放。

+0

HazardMap是一個很好的例子,但它是算法生成瓷磚。我正在使用使用gdal2tiles從另一張地圖切片的切片。 – radven 2010-12-04 03:50:01

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]; 

然後implment以下方法:

-(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; 
} 
+0

這是一個很好的解決方法,但如果用戶在這個「太高級別」滾動,它將不會顯示未加載的圖塊。 – dulgan 2015-01-14 09:04:42