1

MKMapView に現在表示されているタイルの MKTileOverlayPath を特定の瞬間に決定するための信頼できる方法を見つけようとしています (ユーザーがズームイン/ズームアウトしてパンするとき)。私のアプリケーションは、MKTileOverlayPath によってクエリされるサーバーからの動的コンテンツを表示します。

これを MKMapView または MKTileOverlay クラスから直接判断する方法はありますか?

これまでのところ、以下のコードを使用してタイルパスを計算しようとしました。ユーザーがパンまたはダブルクリックしてズームインすると、問題なく動作します。ただし、ピンチしてズームイン/アウトする場合 (ズームレベルが連続している場合)、この方法を使用して計算されたタイルが正しくない場合があります。具体的には、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