OpenStreetMap Tile-Overlay
在某些情況下,你可能不想使用 Apple 提供的預設地圖。
你可以為包含自定義切片的 mapView
新增疊加層,例如 OpenStreetMap 。
讓我們假設,self.mapView
是你已經新增到 ViewController
的 MKMapView
。
首先,你的 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
。
如果你現在要執行專案,你會發現,你的地圖仍會顯示預設地圖:
那是因為我們還沒有告訴 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
。如果你現在執行你的專案,你應該看到這樣的地圖:
如果要顯示另一個地圖,只需更改 URL 模板即可。OSM Wiki 中有一個 tile-servers 列表 。