gpt4 book ai didi

mapkit - 为缓存的图 block 自定义 MKTileOverlay

转载 作者:行者123 更新时间:2023-12-02 03:42:10 76 4
gpt4 key购买 nike

我正在尝试更新我的瓦片 map 代码以使用 iOS 7 的 MKTileOverlayMKTileOverlayRenderer,并且我可以使用一些指针来使事情更好地工作。

首先,这里是 iOS6 代码:AppleTileOverlay.mTileOverlayView.m .当我用一个在所有方面都相同的类替换 TileOverlayView 时,这在 iOS 7 中仍然工作得很好,除了它是 MKOverlayRenderer 的子类而不是 MKOverlayView.

我正在测试的新作品是 MKTileOverlay 的子类,唯一的方法是:

-(NSURL *)URLForTilePath:(MKTileOverlayPath)path {
NSString *tileKey = [[NSString alloc] initWithFormat:@"%d%d%d", path.x, path.y, path.z];
NSString *tilePath = [[NSBundle mainBundle] pathForResource:tileKey ofType:nil inDirectory:@"TileFolder"];

NSURL *url;
if (tilePath) {
url = [NSURL fileURLWithPath:tilePath];
}

return url;
}

大部分时间 map block 加载正常,但日志中充满了这样的消息:

Error loading URL (null): Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x1b3e19e0 {NSUnderlyingError=0x1894d470 "bad URL", NSLocalizedDescription=bad URL}

来自为 URL 返回 nil 的方法。

所以问题是:我可以避免这些错误消息,还是应该坚持使用我拥有的旧覆盖类?

最佳答案

我认为在 Swift 2.0 中,URLForFilePath(...) 不能返回 nil,因为它不是可选的。

我设法使用 MKTileOverlay 子类解决了这个问题,如上所示检查有效的图 block 路径并在图 block 图像不可用时加载“虚拟”透明图 block 。

override func URLForTilePath(path: MKTileOverlayPath) -> NSURL {

let tileKey = String(format:"%d/%d/%d",path.z,path.x,path.y)

let tilePath = NSBundle.mainBundle().pathForResource(tileKey, ofType: "png", inDirectory: "Maps/Map1880")

let blankTilePath = NSBundle.mainBundle().pathForResource("blank", ofType: "png", inDirectory: "Maps")

var url: NSURL

if ((tilePath) != nil)
{
url = NSURL.fileURLWithPath(tilePath!)
} else {
url = NSURL.fileURLWithPath(blankTilePath!)
}

return url;
}

这不是很优雅,因为它为不属于叠加层的每个图 block 加载空白图 block 。

但是,有一个更好的解决方案,感谢 Apple 开发者论坛上的用户:junkpile,尝试加载不存在的 overlay tiles 的问题是 boundingMapRect 默认设置为 MKMapRectWorld,即整个世界。

要将其限制在所需的覆盖区域,子类化 MKTileOverlay

这是一个例子:

import MapKit
class CustomTileOverlay : MKTileOverlay {

override var boundingMapRect: MKMapRect {
get {
//North-East Corner of region
let lat1 = 53.46075
let long1 = -1.92618
//South-West Corner of region
let lat2 = 53.43018
let long2 = -1.992885

//Convert to Coordinates
let coord1 = CLLocationCoordinate2DMake(lat1,long1)
let coord2 = CLLocationCoordinate2DMake(lat2,long2)

//Convert to map points
let p1 = MKMapPointForCoordinate (coord1);
let p2 = MKMapPointForCoordinate (coord2);

//Return the MKMapRect
return MKMapRectMake(fmin(p1.x,p2.x), fmin(p1.y,p2.y), fabs(p1.x-p2.x), fabs(p1.y-p2.y));
}
}
}

关于mapkit - 为缓存的图 block 自定义 MKTileOverlay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19409942/

76 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com