Tôi đang làm việc trên một ứng dụng sử dụng chế độ xem MKOverlay để lớp bản đồ tùy chỉnh của riêng tôi trên bản đồ cơ sở của Google. Tôi đã sử dụng mã mẫu TileMap tuyệt vời của Apple (từ WWDC 2010) làm hướng dẫn.Tính gạch để hiển thị trong MapRect khi "phóng to" vượt ra ngoài bộ lớp phủ phủ
Vấn đề của tôi - khi "bị quá tải" đến mức chi tiết sâu hơn bộ gạch được tạo của tôi, mã sẽ không hiển thị gì vì không có ô có sẵn ở cấp Z được tính.
Hành vi tôi muốn - khi "quá tải", ứng dụng sẽ chỉ giữ cho việc phóng to mức độ sâu nhất của ô. Đó là trải nghiệm người dùng tốt cho lớp phủ để trở nên mờ hơn - đó là một trải nghiệm rất xấu để lớp phủ biến mất.
Đây là mã trả về các ô để vẽ - tôi cần tìm ra cách sửa đổi số này để giới hạn chiều sâu Z mà không làm vỡ tỷ lệ khung được tính cho lớp phủ. Bất kỳ suy nghĩ nào ???
- (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;
}
FYI, đây là chức năng helper zoomScaleToZoomLevel rằng ai đó hỏi về:
// 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;
}
Chris - bạn là một phao cứu sinh. Tôi không mong muốn tạo một giải pháp thay thế, vì vậy tôi đã thực hiện tìm kiếm và câu trả lời của bạn xuất hiện ngay lập tức. Tôi đã sao chép hàm 'zoomScaleToZoomLevel' và' TILE_SIZE' không đổi thành tệp TileOverlayView.m từ TileOverlay.m nên nó sẽ không gây ra lỗi, nhưng khác với nó hoạt động hoàn hảo. Cảm ơn rất nhiều! –
nhận xét đã bị xóa, mã hoạt động tốt – Craig
Tôi đang sử dụng một cách khác để tìm gạch của mình như được mô tả tại https://github.com/mtigas/iOS-MapLayerDemo, nhưng ý tưởng là về cơ bản giống nhau. Tôi đang gặp khó khăn trong việc chuyển đổi zoom sang nó. Bất cứ ai làm điều này? –