iOS OpenStreetMap拼贴叠加

示例

在某些情况下,您可能不想使用Apple提供的默认映射。

您可以向其中添加一个mapView包含自定义图块的覆盖图,例如来自OpenStreetMap的图块。

假设self.mapView您MKMapView是您已经添加到中的ViewController。

首先,您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)

要使用自定义映射,建议使用.aboveLabelsfor 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中有一个磁贴服务器列表。