将MKMap分解为瓷砖 - 瓷砖太小

时间:2013-06-12 09:21:25

标签: ios objective-c mkmapview mapkit

我正在使用MKMapViewMKOverlay处理MKOverlayView的叠加层。首先,我想根据当前的缩放级别将世界划分为区块。因此,当我缩小时,我只想要一个大的瓷砖,下一个缩放级别4个瓷砖,然后9个等等。这是有效的。现在我的问题:

在zoomLevel 3上,图块之间开始有间隙。仅在4个Tiles的缩放级别2上不会发生这种情况,但在每个后续缩放级别中都不会发生这种情况。

 _ _ _
|1 2 3|
|4 5 6| <-- Tiles
|7_8_9|

这两张图分别分别显示了1,2,4,5和5,6,8,9。

enter image description here enter image description here

正如您所看到的,每个瓷砖后间隙会增加。现在到我的代码:

drawMapRect:

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
    NSUInteger zoomLevel = [self zoomLevelForZoomScale:zoomScale];
    HeatMap *heatMap = (HeatMap *)self.overlay;
    HeatMapTileManager *tileManager = [heatMap getHeatMapTileManagerForZoomLevel:zoomLevel];
    MKMapRect mapTile = [tileManager getRectForMapPoint:mapRect.origin atZoomLevel:zoomLevel];

    CGContextSetAlpha(context, 0.5);
    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();    
    CGColorRef color = CGColorCreate(rgb, (CGFloat[]){ .745, .941, .467, 1 });
    CGContextSetFillColorWithColor(context, color);
    CGRect mapTileCGRect = [self rectForMapRect:mapTile];
    CGContextFillRect(context, mapTileCGRect);
}

getRectForMapPoint:

- (MKMapRect) getRectForMapPoint:(MKMapPoint)mapPoint
                       atZoomLevel:(NSInteger)level
{        
    double stepSize = MKMapSizeWorld.width / (double)level;

    double rectIDx = floor(mapPoint.x / stepSize);
    double rectIDy = floor(mapPoint.y / stepSize);

    MKMapRect mapRect = MKMapRectMake(stepSize * rectIDx,
                                      stepSize * rectIDy,
                                      stepSize,
                                      stepSize);

    NSLog(@"X: %f, Width:  %f", mapRect.origin.x, stepSize);
    NSLog(@"Y: %f, Height: %f", mapRect.origin.y, stepSize);

    return mapRect;
}

2 个答案:

答案 0 :(得分:1)

平铺的常用方法是将每个图块划分为4.因此顶层有1个图块。把它切成4,你有下一层。将其中的每一个切成4,你就可以使用下一层等等。这样,任何图层上的图块都可以很容易地计算出图块上方或下方的边界,如果图层的数据尚未准备就绪可以使用上面瓷砖的一部分,或者加入下面的四个瓷砖,然后使用它。

答案 1 :(得分:0)

您可能需要查看http://tilemill.com,以便更轻松地为此类内容平铺内容。