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 中的自定义地图样式的主要内容,如果未能解决你的问题,请参考以下文章