Пользовательский «ExportFactory»

Настольное приложение, использующее MEF , импортирует множество «ServiceProvider'ов». Каждая часть (ServiceProvider) представляет собой класс внутри отдельной DLL . отличный пример кода TileMap (из WWDC 2010) в качестве руководства. Мой ...

Я работаю над приложением, которое использует представления MKOverlay для наложения моих собственных карт поверх базовой карты Google. В качестве руководства я использовал превосходный образец кода Apple TileMap (из WWDC 2010).

Моя проблема - когда «увеличено» до уровня детализации более глубокого, чем мой сгенерированный набор плиток, код ничего не отображает, потому что нет доступных плиток на рассчитанном уровне Z.

Я хочу поведение - при "увеличенном масштабе" приложение должно просто увеличивать самый глубокий уровень плиток. Это хороший пользовательский опыт, когда наложение становится более размытым - очень плохой опыт, когда наложение исчезает.

Вот код, который возвращает плитки для рисования - мне нужно выяснить, как изменить это, чтобы ограничить глубину Z, не нарушая масштабирование кадра, вычисляемого для наложения плитки. Есть какие-нибудь мысли ???


- (NSArray *)tilesInMapRect:(MKMapRect)rect zoomScale:(MKZoomScale)scale
{
    NSInteger z = zoomScaleToZoomLevel(scale);

    // PROBLEM: I need to find a way to cap z at my maximum tile directory depth.

    // Number of tiles wide or high (but not wide * high)
    NSInteger tilesAtZ = pow(2, z);

    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++) {
            // As in initWithTilePath, need to flip y index
            // to match the gdal2tiles.py convention.
            NSInteger flippedY = abs(y + 1 - tilesAtZ);

            NSString *tileKey = [[NSString alloc] 
                                  initWithFormat:@"%d/%d/%d", z, x, flippedY];
            if ([tilePaths containsObject:tileKey]) {
                if (!tiles) {
                    tiles = [NSMutableArray array];
                }

                MKMapRect frame = MKMapRectMake((double)(x * TILE_SIZE) / scale,
                                                (double)(y * TILE_SIZE) / scale,
                                                TILE_SIZE / scale,
                                                TILE_SIZE / scale);

                NSString *path = [[NSString alloc] initWithFormat:@"%@/%@.png",
                      tileBase, tileKey];
                ImageTile *tile = [[ImageTile alloc] initWithFrame:frame path:path];
                [path release];
                [tiles addObject:tile];
                [tile release];
            }
            [tileKey release];
        }
    }

    return tiles;
}

К вашему сведению, вот вспомогательная функция zoomScaleToZoomLevel, о которой кто-то спросил:

// Convert an MKZoomScale to a zoom level where level 0 contains 4 256px square tiles,
// which is the convention used by gdal2tiles.py.
static NSInteger zoomScaleToZoomLevel(MKZoomScale scale) {
    double numTilesAt1_0 = MKMapSizeWorld.width / TILE_SIZE;
    NSInteger zoomLevelAt1_0 = log2(numTilesAt1_0);  // add 1 because the convention skips a virtual level with 1 tile.
    NSInteger zoomLevel = MAX(0, zoomLevelAt1_0 + floor(log2f(scale) + 0.5));
    return zoomLevel;
}
10
задан radven 21 February 2011 в 17:34
поделиться