教程 | 10分钟入门Mapbox iOS SDK
Mapbox iOS SDK 是Mapbox针对 iOS 系统的矢量地图库。今天我们来教大家如何使用Cocoapod 来安装 Mapbox iOS SDK,并通过 Xcode 载入地图、改变地图样式(style)、添加一个几何图形(polygon)等操作。
开发工具:
Xcode 8.0 以上 (可以在 Mac App Store 中免费获取);
Swift 3.0 (Xcode 自带);
Cocoapod (没有安装可以在 Terminal 输入 sudo gem install cocoapods);
一个Mapbox的访问Token(可在https://www.mapbox.com/studio/ 获得);
配置开发环境:
打开Xcode,依次点击 File ‣ New ‣ Project 创建新项目。找到 iOS 下的 Application 选项,选择Single View Application模板。
将新项目命名为My First MapboxApp。Language选择Swift,Devices选择Universal。该步骤将引导你创建一个 iPhone/iPad 应用程序。
完成后你就会看到你的项目一览:
设置您的access token
要在你的应用中显示 Mapbox 提供的地图,需要将你的access token 添加到该应用程序的 Info.plist 文件中(Info.plist 是一个文本文件,包含了你的应用的基础信息,如版本号、 APP名称等)。
设置步骤:
1. 在 Project navigator(左侧边栏中)找到Info.plist选项。
2. 选中最开始的“Information Property List”一行,然后点击Editor ‣ Add Item。
3. 将新插入行的 Key 设为 MGLMapboxAccessToken,并设置访问令牌的 Value。
Access token 是用来在和Mapbox服务器沟通时用来辨识当前用户的。
使用Cocoapod 导入Mapbox iOS SDK
Cocoapod 是一个在 iOS开发中用得比较多的依赖管理工具,当你的的项目用到很多第三方库的时候Cocoapod 可以帮你很好的管理它们。 你也不必去手动下载和配置SDK,Cocoapod会帮你完成90%的配置工作。
在 Project navigator(左侧边栏中),右击选择New File... ‣ Empty 然后键入Podfile。
Podfile 内容为:
platform :ios, '8.0'
target ‘My First MapboxApp' do
pod 'Mapbox-iOS-SDK', '~> 3.6'
end
打开Terminal, 把当前目录变到项目的根目录,然后键入命令:
pod install
Cocoapod 会下载然后配置好你的项目。完成后关掉Xcode,找到你的项目目录,打开
My First MapboxApp.xcworkspace 文件,这个文件就是Cocoapod帮你生成的项目文件。
使用代码添加地图
添加一个默认地图
我们的新开的项目里有一个ViewController.swift 的文件,这个文件是一个ViewController类,主要作用是来管理数据和视觉元素,在IOS开发中是很重要的一个角色。打开ViewController.swift, 在viewDidLoad 的方法下添加下列代码:
override func viewDidLoad() {
super.viewDidLoad()
let mapView = MGLMapView(frame: view.bounds)
mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
mapView.setCenter(CLLocationCoordinate2D(latitude: 59.31, longitude: 18.06), zoomLevel: 9, animated: false)
view.addSubview(mapView)
}
现在你已经成功添加了一个地图视图,那么我们来试试看。选择一个 iPhone 型号,然后点击左边的 Play 按钮进行测试。你应该可以看到下列效果:
改变地图样式地图
Mapbox最大的卖点就是可自定义地图,除了在Map Studio上面定制个性化的地图,我们的SDK也提供了几款漂亮的样式供您参考。SDK默认提供的以下样式:
StreetsStyle(街道)
OutdoorStyle(户外)
DarkStyle(暗色)
SatelliteStyle(卫星)
SatelliteStreetsStyle(卫星街道)
TrafficDayStyle(交通日)
TrafficNightStyle (交通夜)
下面的代码使用卫星街道样式:
override func viewDidLoad() {
super.viewDidLoad()
let mapView = MGLMapView(frame: view.bounds)
let streetStyle = MGLStyle.satelliteStreetsStyleURL()
mapView.styleURL = streetStyle
mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// Set the map’s center coordinate and zoom level.
mapView.setCenter(CLLocationCoordinate2D(latitude: 59.31, longitude: 18.06), zoomLevel: 12, animated: false)
view.addSubview(mapView)
}
效果如下:
添加Polygon(多边形)
对于大多数用户来说,光一个地图是远远不够的,在地图上加入(annotation)注释和几何图形是必要的。下面我会简单介绍一下如何在Mapbox 地图上添加几何图形。
在代码中导入Mapbox framework:
import Mapbox
加入一个公共变量:
var mapView: MGLMapView!
在viewDidLoad中添加地图然后设置代理:
override func viewDidLoad() {
super.viewDidLoad()
mapView = MGLMapView(frame: view.bounds)
let streetStyle = MGLStyle.satelliteStreetsStyleURL()
mapView.styleURL = streetStyle
mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// Set the map’s center coordinate and zoom level.
mapView.setCenter(CLLocationCoordinate2D(latitude: 45.520486, longitude: -122.673541), zoomLevel: 11, animated: false)
view.addSubview(mapView)
mapView.delegate = self
}
让当前类满足代理:
class ViewController: UIViewController, MGLMapViewDelegate
在viewDidAppear中开启几何图层:
override func viewDidAppear(_ animated: Bool) {
// Draw the polygon after the map has initialized
drawShape()
}
func drawShape() {
// Create a coordinates array to hold all of the coordinates for our shape.
var coordinates = [
CLLocationCoordinate2D(latitude: 45.522585, longitude: -122.685699),
CLLocationCoordinate2D(latitude: 45.534611, longitude: -122.708873),
CLLocationCoordinate2D(latitude: 45.530883, longitude: -122.678833),
CLLocationCoordinate2D(latitude: 45.547115, longitude: -122.667503),
CLLocationCoordinate2D(latitude: 45.530643, longitude: -122.660121),
CLLocationCoordinate2D(latitude: 45.533529, longitude: -122.636260),
CLLocationCoordinate2D(latitude: 45.521743, longitude: -122.659091),
CLLocationCoordinate2D(latitude: 45.510677, longitude: -122.648792),
CLLocationCoordinate2D(latitude: 45.515008, longitude: -122.664070),
CLLocationCoordinate2D(latitude: 45.502496, longitude: -122.669048),
CLLocationCoordinate2D(latitude: 45.515369, longitude: -122.678489),
CLLocationCoordinate2D(latitude: 45.506346, longitude: -122.702007),
CLLocationCoordinate2D(latitude: 45.522585, longitude: -122.685699)
]
let shape = MGLPolygon(coordinates: &coordinates, count: UInt(coordinates.count))
mapView.addAnnotation(shape)
}
实现代理方法,通过以下几个方法来控制几何图形的颜色与透明度:
func mapView(_ mapView: MGLMapView, alphaForShapeAnnotation annotation: MGLShape) -> CGFloat {
return 0.5
}
func mapView(_ mapView: MGLMapView, strokeColorForShapeAnnotation annotation: MGLShape) -> UIColor {
return .white
}
func mapView(_ mapView: MGLMapView, fillColorForPolygonAnnotation annotation: MGLPolygon) -> UIColor {
return UIColor(red: 59/255, green: 178/255, blue: 208/255, alpha: 1)
}
最终结果如下:
小结
通过以上步骤,我们已经用 Mapbox iOS SDK 创建了一个小的地图应用程序。
我们会同步更新操作指南,帮助您掌握 Mapbox 所有厉害的功能。下面的一些相关资源可以帮助你跟进 Mapbox 的更新动态:
Mapbox iOS SDK API API文档;
Mapbox iOS SDK Samples iOS示例;
Mobile applications Mobile应用教程;
Mapbox GL Native on GitHub 可追踪 Mapbox Mobile 的开源项目;