代码之家  ›  专栏  ›  技术社区  ›  Tim

openweathermap MKTileOverlay不显示在mapview中

  •  0
  • Tim  · 技术社区  · 7 年前

    我做的正确,但我的地图从来没有显示结果 我的电话。我正试着去看新一层的降水 在测试时,我将模拟器的位置设置为当前 显示降水,但我在地图上什么也没看到。这是我的

    我尝试将canReplaceMapContent更改为NO和YES以及variating

    我已经确认我的地图代表已连接,并且正在为我的所有其他地图调用工作。我也知道,我下载请求,因为openweathermap已经阻止了我好几次打电话给他们的网站

    - (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,结果相同。我验证了我得到了result(data,nil)行,它显示了一个应该包含沉淀的磁贴上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()
        }
    }
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   Alex    7 年前

    你的代码实际上工作得很好,你只需将你的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 错了。

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