MKMapView MKTileOverlay - 确定当前可见的图块

时间:2013-10-30 17:07:58

标签: ios mkmapview

我正在尝试找到一种可靠的方法来确定任何给定时刻(当用户放大/缩小和平移时)MKMapView中当前可见的平铺的MKTileOverlayPath。我的应用程序显示来自MKTileOverlayPath查询的服务器的动态内容。

有没有办法直接从MKMapView或MKTileOverlay类中确定这个?

到目前为止,我一直在尝试使用下面的代码计算tilepath。当用户平移或双击放大时,它可以正常工作。但是,当捏合放大/缩小(缩放级别可以连续)时,使用此方法计算的切片有时不正确 - 特别是y坐标似乎是一次性的。

我很难弄清楚为什么代码无法正常使用捏缩放级别,所以我想知道是否有另一种方法来确定当前可见的切片。我已经尝试实现一个虚拟的MKTileOVerlay来拦截所请求的磁贴,但是目前在任何给定时间都没有看到它。

任何提示都将不胜感激。

- (NSMutableArray *)tilesInMapRect:(MKMapRect)rect zoomScale:(MKZoomScale)scale
{

    NSInteger z = [self zoomLevel];

    NSInteger minX = floor((MKMapRectGetMinX(rect) * scale) / TILE_SIZE);
    NSInteger maxX = floor((MKMapRectGetMaxX(rect) * scale) / TILE_SIZE);
    NSInteger minY = floor((MKMapRectGetMinY(rect) * scale) / TILE_SIZE);
    NSInteger maxY = floor((MKMapRectGetMaxY(rect) * scale) / TILE_SIZE);

    NSMutableArray *tiles = nil;

    for (NSInteger x = minX; x <= maxX; x++) {
        for (NSInteger y = minY; y <= maxY; y++) {

            NSString *tileString = [NSString stringWithFormat:@"z%ix%iy%i",z,x,y];
            if (!tiles) {
                tiles = [NSMutableArray array];
            }
            [tiles addObject:tileString];
        }
    }

    return tiles;
}

- (NSUInteger) zoomLevel {
    return (21 - round(log2(self.mapView.region.span.longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * self.mapView.bounds.size.width))));
}

0 个答案:

没有答案