1

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

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

到目前为止,我一直在尝试使用下面的代码计算 tilepaths。当用户平移或双击放大时,它工作正常。但是,当捏放大/缩小(缩放级别可以是连续的)时,使用此方法计算的图块有时不正确 - 特别是 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))));
}
4

0 回答 0