MapKit 中的自定义地图样式

Posted

技术标签:

【中文标题】MapKit 中的自定义地图样式【英文标题】:Custom map style in MapKit 【发布时间】:2013-12-14 22:56:22 【问题描述】:

我正在寻找一种在 ios 7 中实现自定义地图样式的方法,就像您可以使用 Google Maps 一样。我发现一些帖子说 MapKit 无法做到这一点,但它们都是不久前发布的。澄清一下,按风格,我说的是自定义颜色,最好还有字体。下面是自定义 Google 地图样式的示例。

(来源:servendesign.com)

出于性能原因,我真的更喜欢使用 MapKit,但如果不支持它,我也愿意使用其他框架。我见过的是 MapBox 和 Cloudmade,当然还有 Google Maps SDK。

有没有办法用 MapKit 做到这一点?如果没有,最好的方法是什么?

【问题讨论】:

【参考方案1】:

MKMapView 还提供了使用自定义图块覆盖的可能性。 Openstreetmap 有一个很棒的瓦片服务器列表,您可以使用它来获取自定义地图。当然,总是有可能创建自己的图块覆盖集。 Openstreetmap wiki here 中描述了该过程。

在 Swift 中可能的实现可能如下所示:

1.导入 MapKit

import MapKit

2。向地图添加叠加层

let overlayPath = self.mapViewModel.overlayURL
let overlay = MKTileOverlay(URLTemplate: overlayPath)
overlay.canReplaceMapContent = true
self.mapView.addOverlay(overlay)

3。符合 MKMapViewDelegate

class ViewController: UIViewController, MKMapViewDelegate  ... 

4.实现委托方法以使用正确的渲染器来显示图块

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer 
    guard let tileOverlay = overlay as? MKTileOverlay else 
        return MKOverlayRenderer(overlay: overlay)
    
    return MKTileOverlayRenderer(tileOverlay: tileOverlay)

在上面的示例中,overlayURL 取自 openstreetmap 上的图块服务器列表:OpenstreetMap Tile Servers。

例如,如果您想使用雄蕊图(具有水彩风格),您的网址将如下所示:

let overlayURL = "http://tile.stamen.com/watercolor/z/x/y.jpg"

如果您正在搜索深色模式地图,您可能最好使用 Carto Dark:http://a.basemaps.cartocdn.com/dark_all/$z/$x/$y.png

请注意,上述 URL 不支持 SSL (HTTP)。因此,您需要通过在 Info.plist 中添加 App Transport Security Settings 来允许对该特定 URL 的不安全 HTTP 请求。如需更多信息,请查看this link。

【讨论】:

你好@dehlen,感谢这个有用的答案。快速问:我将这段代码放在 MapViewController 的什么位置(尤其是第 2 点中的块,因为无论我放在哪里都会收到红色错误消息。 @DimitriT 你可以把它放在你的 viewDidLoad 函数中。 谢谢德伦。如果您愿意为像我这样的初学者解释一下 - 我应该添加什么代码来获取 mapViewModel 类,因为我收到错误“使用未解析的标识符 MapViewModel”。我想我添加了一个新的 swift 文件,想知道如何添加它。刚刚掌握了地图和注释的窍门——本课程的任何提示都会有很大帮助。 @DimitriT 它只是一个类,我在其中存储了一个指向正确 tileserver URL 的常量。您可以将let overlayPath = self.mapViewModel.overlayURL 替换为let overlayPath = "http://tile.stamen.com/watercolor/z/x/y.jpg" ,就像我在上面的答案中所说的那样。 你不需要它们。它们由地图视图本身代替。只需将占位符保留在字符串中即可。【参考方案2】:

MKMapView 不会公开您有兴趣自定义的属性。 Google Maps SDK 确实支持标记的自定义颜色和图标,这可能足以满足您的目的。

编辑:请继续关注 iOS 11,它可能会提供这种级别的自定义。

【讨论】:

感谢您的意见。在性能方面,您知道 Google Maps SDK 与原生 MapKit 相比有何不同? 我没有权威,但我无法辨别 Google Maps SDK 演示应用程序与使用 MapKit 的任何应用程序之间的主要性能差异。 YMMV。 @Marco,性能提升有利于 MapKit 或 Google Maps SDK? @ScottyBlades,我的回答来自 2013 年,此时可能已经过时。我不知道相对于 MapKit 或 Google Maps SDK 的性能提升。【参考方案3】:

另一个选项是MBXMapKit,它是基于 Apple 的 MapKit 构建的 MapBox 库,尽管它是为 MapBox 图层而设计的。它与MapBox iOS SDK 是分开的,后者是一个全新的重写,旨在像 MapKit 一样工作,但不是基于它。

【讨论】:

谢谢,我会调查的。我确实喜欢它基于 MapKit 构建的事实。

以上是关于MapKit 中的自定义地图样式的主要内容,如果未能解决你的问题,请参考以下文章

地图注释显示不正确的自定义图钉图像

MapKit 自定义注释被添加到地图,但在地图上不可见

iOS 如何让 MapKit 显示自定义室内地图?

MapKit 通过自定义引脚和标注路由

地图套件:自定义地标

Android 地图中的自定义模式项