确定visibleMapRect的MapKit图块

问题描述 投票:0回答:1

我看到了用于计算给定

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 = ?
    }
}
ios swift mapkit mkmapview mkmaprect
1个回答
0
投票

对于大多数用例来说,最简单的答案是您不进行计算,而让 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 中获取每个图块的参数

© www.soinside.com 2019 - 2024. All rights reserved.