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 列表 。