我看到了用于计算给定
MKMapRect
所需的平铺边界网格的简单代码,但我现在找不到它。 IIRC 它是 MapKit
的内置函数。
给定像
MKMapRect
这样的 mapview.visibleMapRect
和缩放级别,我如何计算将用于给定矩形的平铺路径数组?
import MapKit
class ViewController: UIViewController {
@IBOutlet weak var mapview: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
mapview.delegate = self
let location = CLLocationCoordinate2D(latitude: 44.0, longitude: -120.0)
let span = MKCoordinateSpanMake(1.0, 1.0)
let region = MKCoordinateRegion(center: location, span: span)
mapview.setRegion(region, animated: true)
let rect = mapview.visibleMapRect
let requiredTiles = ?
}
}
对于大多数用例来说,最简单的答案是您不进行计算,而让 MapKit 来完成工作:
你定义自己的MKTileOverlay子类,设置
class DigitransitTileOverlay: MKTileOverlay {
override func url(forTilePath path: MKTileOverlayPath) -> URL {
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "cdn.digitransit.fi"
// standard tile size for MKTileOverlay is 265
//let startPath = "/map/v1/hsl-map-256" // the hsl-map part can be customized with language parameters
// standard tile size for digitransit is 512
let startPath = "/map/v1/hsl-map" // the hsl-map part can be customized with language parameters
let size: String = "" // @2x for retina, empty for normal
urlComponents.path = startPath + "/\(path.z)/\(path.x)/\(path.y)\(size).png"
let url: URL = urlComponents.url!
return url
}
}
然后你设置
digiTransitTileOverlay.canReplaceMapContent = false
digiTransitTileOverlay.tileSize = CGSize(width: 512, height: 512)
mapView.addOverlay(digiTransitTileOverlay, level: .aboveRoads)
tileSize 不是必需的,但似乎可以使某些服务器更快,因为流行的 Web 库更喜欢 512 x 512,因此此图块大小已缓存在我的许多服务器中。
并定义渲染器:
public override func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer? {
if let tileOverlay = overlay as? DigitransitTileOverlay {
let tileOverlayRenderer = MKTileOverlayRenderer(tileOverlay: tileOverlay)
return tileOverlayRenderer
}
return nil
}
如您所见,MapKit 会为您设置的区域中的每个必要图块调用 url(forTilePath。您可以在 MKTileOverlayPath 中获取每个图块的参数