【问题标题】:openweathermap MKTileOverlay does not show in mapviewopenweathermap MKTileOverlay 不在地图视图中显示
【发布时间】:2019-06-27 02:10:59
【问题描述】:

我已尝试阅读尽可能多的有关此主题的文章。据我所知 我这样做是正确的,但是我的地图从不显示结果 我的电话。我试图查看 precipitation_new 层和 在测试时,我将我的模拟器位置设置为当前的区域 显示降水,但我从未在地图上看到任何东西。这是我的 第一次尝试使用 MKTileOverlay。

我尝试将 canReplaceMapContent 更改为 NO 和 YES 以及改变 具有相同结果的 alpha。

我已验证我的地图委托已连接并正在处理我的所有其他地图调用。我也知道我正在下载请求,因为 openweathermap 也阻止了我几次调用他们的网站 经常(我现在只能得到 60 req/min)。

我正在做以下事情:

- (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;
    }
}

一个小问题:我如何计算我提出的请求数? 看来我这样做的方式并没有计算所有请求 我正在制作,我很快就被关闭了。

感谢您的帮助。

[编辑] 实际上,我确实对它进行了子类化以缓存图块,但是图块始终是白色的(当我在浏览器中复制/粘贴链接时),但我仍然没有看到它们出现在地图上。该贴图仅显示法线贴图(未更改)。我尝试将“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()
    }
}

【问题讨论】:

    标签: ios openweathermap mktileoverlay


    【解决方案1】:

    您的代码实际上运行良好,您只需将 URL 设置为 https://tile.openweathermap.org/{z}/{x}/{y}.png?appid=&lt;my_app_id&gt;,而它应该是 https://tile.openweathermap.org/map/precipitation_new/{z}/{x}/{y}.png?appid=&lt;my_app_id&gt;。请求的数量完全错误,但瓷砖确实显示正确。您可能还想将 canReplaceMapContent 设置为 false。

    当我使用您的代码时,它总共发出 28 个请求以显示美国大陆。我将 MKTileOverlay 子类化以添加有助于解决 API 限制的缓存机制。

    【讨论】:

    • 我在上面添加了代码和cmets。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    相关资源
    最近更新 更多