Предотвращение исчезновения наложений при увеличении - MKMapView & MKOverlay - PullRequest
6 голосов
/ 04 декабря 2010

Я работаю над приложением для iPhone / iPad, в котором используются полупрозрачные наложения мозаичной карты с помощью MKMapView и MKOverlay.

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

Я не хочу ограничивать масштабирование.

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

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

Есть ли лучшие практики для достижения этой цели?

Два варианта, которые я предложил:

1) Установите предел того, как далеко пользователи могут увеличивать масштаб. Не идеально, потому что даже если наложение имеет низкое разрешение, они, вероятно, все еще находятся в пределах цветного диапазона прозрачности, а наличие прозрачного верхнего слоя, по-видимому, исчезающего, вводит в заблуждение.

2) Предварительный рендеринг плиток, которые идут глубже, чем в противном случае ... Это работает, но оно увеличивает размер моего приложения на порядок.

Должен быть лучший способ. Есть идеи ???

ОБНОВЛЕНИЕ. Наиболее близкий пример кода, который я могу найти, - это пример Apple TileMap из WWDC 2010. Их код страдает от той же проблемы - если вы увеличиваете масштаб «слишком далеко», наложение карты не отображается.

Ответы [ 3 ]

3 голосов
/ 15 декабря 2010

Я изменил пример кода Apple TileMap, добавив режим «OverZoom». Я отправил более подробную информацию и мой код в ответ на этот вопрос .

Я надеюсь, что смогу помочь любому, кто столкнется с этой проблемой.

3 голосов
/ 26 сентября 2014

MKTileOverlay имеет свойство MaximumZ. Для меня мой сервер плиток рендерился только до масштаба 18 (mapnik из данных osm), поэтому я установил overlay.maximumZ = 18, и теперь, когда я увеличиваю до 19 или 20 (самый высокий показатель на iPhone), он просто сохраняет масштаб 18 плиток.

При этом я инициализирую оверлей через initWithURLTemplate:

В viewDidLoad (или везде, где вы инициализируете оверлей):

self.mapView.delegate = self;
NSString *urlTemplate = @"http://servername/osm/{z}/{x}/{y}.png";
self.mapOverlay = [[MKTileOverlay alloc] initWithURLTemplate:urlTemplate];
self.mapOverlay.canReplaceMapContent=YES;
[self.map addOverlay:self.overlay level:MKOverlayLevelAboveLabels];

Затем выполните следующий метод:

-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {    
    if([overlay isKindOfClass:[MKTileOverlay class]]) {
        MKTileOverlay *tileOverlay = (MKTileOverlay *)overlay;
        tileOverlay.maximumZ = 18;  // This is what sets the cap, zoom levels further in will not be rendered and instead will keep previous zoom level tiles.
        MKTileOverlayRenderer *renderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:tileOverlay];
        return renderer;
    }
    return nil;
}
1 голос
/ 04 декабря 2010

Я рекомендую проверить HazardMap пример кода на сайте Apple ... это отличный пример того, как поддерживать масштабирование на всех уровнях с мозаичным MKOverlay.

...