我正在尝试找到一种可靠的方法来确定在任何给定时刻(当用户放大/缩小和平移时)当前在 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))));
}