我试图阅读尽可能多的关于这个主题的文章。AFAIK 我这样做是正确的,但是我的地图从未显示我的通话结果。我试图查看 precipitation_new 图层并在测试时将我的模拟器位置设置为当前显示降水的区域,但我在地图上从未看到任何内容。这也是我第一次尝试使用 MKTileOverlay。
我已经尝试将 canReplaceMapContent 更改为 NO 和 YES,并以相同的结果更改 alpha。
我已验证我的地图委托已连接并正在处理我的所有其他地图调用。我也知道我正在下载请求,因为 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;
}
}
一个小问题:我如何计算我提出的请求数量?似乎我这样做的方式并没有计算我提出的所有请求,而且我很快就被关闭了。
谢谢你的帮助。
[编辑] 实际上,我确实对其进行了子类化以缓存图块,但是图块始终是白色的(当我在浏览器中复制/粘贴链接时),但我仍然没有看到它们出现在地图上。该贴图仅显示法线贴图(未更改)。我尝试将“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()
}
}