Ios MapKit中的自定义地图样式

Ios MapKit中的自定义地图样式,ios,google-maps,mapkit,mapbox,cloudmade,Ios,Google Maps,Mapkit,Mapbox,Cloudmade,我正在寻找一种在iOS 7中实现自定义地图样式的方法,就像你可以使用它一样。我发现一些帖子说这在MapKit中是不可能的,但它们都是前一段时间发布的。为了澄清这一点,我说的是定制颜色,最好是字体。下面是自定义谷歌地图样式的示例 (来源:) 出于性能原因,我更喜欢使用MapKit,但如果它不受支持,我也愿意使用其他框架。我看到的是MapBox和CloudMake,当然还有Google地图SDK 有没有一种使用MapKit的方法?如果没有,最好的方法是什么?MKMapView不会公开您感兴趣的自定

我正在寻找一种在iOS 7中实现自定义地图样式的方法,就像你可以使用它一样。我发现一些帖子说这在MapKit中是不可能的,但它们都是前一段时间发布的。为了澄清这一点,我说的是定制颜色,最好是字体。下面是自定义谷歌地图样式的示例


(来源:)

出于性能原因,我更喜欢使用MapKit,但如果它不受支持,我也愿意使用其他框架。我看到的是MapBox和CloudMake,当然还有Google地图SDK


有没有一种使用MapKit的方法?如果没有,最好的方法是什么?

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


编辑:请继续关注iOS 11,它可能提供这一级别的定制。

另一个选项是,它是一个构建在苹果MapKit之上的MapBox库,尽管它适合MapBox层。它独立于,这是一种彻底的重写,旨在像MapKit一样工作,但不是基于它

MKMapView还提供了使用自定义瓷砖覆盖的可能性。Openstreetmap有一个很好的平铺服务器列表,可以用来获取自定义地图。当然,始终可以创建自己的平铺覆盖集。Openstreetmap wiki中描述了该过程

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

1。导入地图套件

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上的平铺服务器列表:

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

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安全设置
,来允许对该特定URL的不安全HTTP请求。有关更多信息,请查看。

谢谢您的输入。你知道Google Maps SDK在性能方面与原生MapKit相比有什么不同吗?我不是权威人士,但我看不出Google Maps SDK演示应用程序与使用MapKit的任何应用程序之间有什么主要的性能差异。YMMV@Marco,性能提升有利于MapKit或Google Maps SDK?@ScottyBlades,我的答案是从2013年开始的,现在可能已经过时了。我不知道vis-a-vis MapKit或Google Maps SDK的性能提升。谢谢,我会研究一下。我很喜欢它是基于MapKit构建的。您好@dehlen,谢谢您的回答。快速问:在我的MapViewController中,我把这些代码放在哪里(特别是第2点中的块,因为无论我放在哪里都会得到红色错误MSG。@例如,Dimitit你可以把它放在viewDidLoad func中。谢谢你,Dehlen。如果你能为像我这样的初学者解释一下,我应该添加什么代码来获得mapViewModel类,因为我得到了错误“使用未解析的标识符MapV”iewModel'。我想我添加了一个新的swift文件,不知道如何添加它。刚刚掌握了地图和注释的窍门-关于这个类的任何提示都会有很大帮助。@Dimitit它只是一个类,我在其中存储了一个指向右tileserver URL的常量。你可以用
let overlayPath=self.mapViewModel.overlayURL
替换
let overlayPath=”http://tile.stamen.com/watercolor/{z} /{x}/{y}.jpg“
就像我在上面的回答中所说的那样。你不需要它们。它们由mapview本身代替。只需将占位符保留在字符串中即可。