openweathermap MKTileOverlay не отображается в виде карты

Я постарался прочитать как можно больше статей на эту тему. Насколько я знаю, я делаю это правильно, однако моя карта никогда не показывает результаты моих звонков. Я пытаюсь посмотреть на слой осадка_новый, и во время тестирования я установил местоположение своего симулятора в область, которая в настоящее время показывает осадки, но я ничего не вижу на своей карте. Это моя первая попытка использовать MKTileOverlay.

Я попытался изменить canReplaceMapContent на NO и YES, а также изменить альфа-канал с теми же результатами.

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

Я делаю следующее:

- (void) setupTileRenderer
{
    NSString *tileTemplate = @"https://tile.openweathermap.org/{z}/{x}/{y}.png?appid=<my_app_id>";
    MKTileOverlay *tileOverlay = [[MKTileOverlay alloc] initWithURLTemplate:tileTemplate];
    tileOverlay.minimumZ = 2;
    tileOverlay.maximumZ = 16;

    tileOverlay.canReplaceMapContent = YES;
    _tileRenderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:tileOverlay];
    _tileRenderer.alpha = 0.5;

    DISPATCH_ASYNC {
        [_mapView addOverlay:tileOverlay level:MKOverlayLevelAboveLabels];
    });
}

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKTileOverlay class]])
    {
        _tileRendererRequests++;
        if (_tileRendererRequests > 55) {
            NSLog(@"OWMREQ - too many requests per min");
        }
        NSLog(@"OWMREQ _tileRendererRequests: %ld", (long)_tileRendererRequests);
        return _tileRenderer;
    }
}

Небольшой вопрос: как мне подсчитать количество запросов, которые я делаю? Кажется, что то, как я это делаю, не учитывает все запросы, которые я делаю, и меня очень быстро закрывают.

Спасибо за любую помощь.

[EDIT] На самом деле я сделал подкласс для кэширования плиток, однако плитки всегда белые (когда я копирую/вставляю ссылку в браузере), но я все еще не вижу их на карте. Карта просто показывает карту нормалей (ничего не изменилось). Я попытался изменить «canReplaceMapContent» на false с теми же результатами. Я убедился, что я дошел до строки результата (данные, ноль), и он показывает количество 1444 байтов на плитке, которая должна содержать осадки. Я использовал другое приложение-радар, чтобы проверить, где я смотрю, был ли дождь. Вот мой код:

override func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) -> Void) {

    let baseURL = "https://tile.openweathermap.org/map/precipitation_new/"
    let key = String(path.x) + "|" + String(path.y) + "|" + String(path.z)

    if let thisImg = cachedData.getRadarTileObject(key: key) {
        result(thisImg, nil)
    }
    else {
        let keyid = "my key id"
        let url = self.baseURL + String(path.z) + "/" + String(path.x) + "/" + String(path.y) + ".png?appid=" + keyid
        let theUrl = URL(string: url)
        print("URL: \(url)")
        let request = NSMutableURLRequest.init(url: theUrl!, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 30)
        request.httpMethod = "GET"

        let session = URLSession.shared
        let dataTask = session.dataTask(with: request as URLRequest) {data,response,error in

            if error == nil {
                if let count = data?.count {
                    if count > 0 {
                        result(data, nil)
                        return
                    }
                }
            }
            else {
                print("ERROR loading tile data: \(String(describing: error?.localizedDescription))")
            }
            result(nil, nil)
        }
        dataTask.resume()
    }
}

person Tim    schedule 02.02.2019    source источник


Ответы (1)


Ваш код на самом деле работает отлично, вы просто установили свой URL-адрес как https://tile.openweathermap.org/{z}/{x}/{y}.png?appid=<my_app_id>, когда он должен быть https://tile.openweathermap.org/map/precipitation_new/{z}/{x}/{y}.png?appid=<my_app_id>. Количество запросов совершенно неверно, но плитки отображаются правильно. Вы также можете установить canReplaceMapContent в false.

Когда я использовал ваш код, он делал в общей сложности 28 запросов, чтобы показать континентальную часть Соединенных Штатов. Я создал подкласс MKTileOverlay, чтобы добавить механизм кэширования, который помог с ограничениями API.

person Alex    schedule 12.03.2019
comment
Я добавил код и комментарии выше. Спасибо за помощь! - person Tim; 18.03.2019