OpenStreetMap Tile-Overlay

在某些情況下,你可能不想使用 Apple 提供的預設地圖。

你可以為包含自定義切片的 mapView 新增疊加層,例如 OpenStreetMap

讓我們假設,self.mapView 是你已經新增到 ViewControllerMKMapView

首先,你的 ViewController 需要符合協議 MKMapViewDelegate

class MyViewController: UIViewController, MKMapViewDelegate

然後你必須將 ViewController 設定為 mapView 的代表

mapView.delegate = self

接下來,配置地圖的疊加層。你需要一個 URL 模板。所有磁貼伺服器上的 URL 都應該與此類似,即使你將離線儲存地圖資料:http://tile.openstreetmap.org/{z}/{x}/{y}.png

let urlTeplate = "http://tile.openstreetmap.org/{z}/{x}/{y}.png"
let overlay = MKTileOverlay(urlTemplate: urlTeplate)
overlay.canReplaceMapContent = true

配置疊加後,必須將其新增到 mapView

mapView.add(overlay, level: .aboveLabels)

要使用自定義地圖,建議使用 .aboveLabels 作為 level。否則,預設標籤將顯示在自定義地圖上。如果要檢視預設標籤,可以在此處選擇 .aboveRoads

如果你現在要執行專案,你會發現,你的地圖仍會顯示預設地圖:

StackOverflow 文件

那是因為我們還沒有告訴 mapView,如何渲染疊加層。這就是為什麼你必須先設定委託的原因。現在你可以將 func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer 新增到檢視控制器:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    if overlay is MKTileOverlay {
        let renderer = MKTileOverlayRenderer(overlay: overlay)
        return renderer
    } else {
        return MKTileOverlayRenderer()
    }
}

這將返回正確的 MKOverlayRenderer 到你的 mapView。如果你現在執行你的專案,你應該看到這樣的地圖:

StackOverflow 文件

如果要顯示另一個地圖,只需更改 URL 模板即可。OSM Wiki 中有一個 tile-servers 列表