0x00 利用MapKit实现路线查询功能
从天安门导航到清华西门的步行路线
效果图:
0x01 思路
苹果的MapKit提供了查询两个地点间路线的的功能, 可以向地图服务器发送一个请求, 获得路线.
输入参数主要有:
起点, 一个MKMapItem对象
终点, 一个MKMapItem对象
交通方式: MKDirectionsTransportType, 包括步行, 公交, 驾车
苹果返回的结果主要有:
路线: 一个MKPolyline对象
相关API
- MKDirections
- MKDirectionsRequest
展示
利用MKMapView展示路线
0x02 代码实现
//
// ViewController.swift
//
import UIKit
import MapKit
class ViewController: UIViewController,MKMapViewDelegate {
//MARK: - IB
@IBOutlet weak var mapView: MKMapView!
//MARK: - ViewLifeCircle
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let req导航请求=MKDirectionsRequest()
//步行
req导航请求.transportType=MKDirectionsTransportType.Walking
//从天安门出发
let place天安门=MKMapItem(placemark: MKPlacemark(coordinate: CLLocationCoordinate2D(latitude:39.915112 , longitude: 116.403963), addressDictionary: ["name":"天安门"]))
req导航请求.source=place天安门
//到清华大学
let place清华大学=MKMapItem(placemark: MKPlacemark(coordinate: CLLocationCoordinate2D(latitude: 40.003656, longitude: 116.321781), addressDictionary: ["name":"清华大学西门"]))
req导航请求.destination=place清华大学
//发送导航请求
let direction导航=MKDirections(request: req导航请求)
mapView.setRegion(MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2D(latitude: 40.003656, longitude: 116.321781), 20000, 20000), animated: false)
direction导航.calculateDirectionsWithCompletionHandler { (res查询结果:MKDirectionsResponse?, error:NSError?) -> Void in
if let polyline=res查询结果?.routes.first?.polyline {
self.mapView.addOverlay(polyline, level: MKOverlayLevel.AboveLabels)
}
}
}
// MARK: - MapView
func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
let ret=MKPolylineRenderer(overlay: overlay)
ret.lineWidth=2
ret.strokeColor=UIColor.redColor()
return ret
}
}
0x03 参考和工具
- 文档: 苹果定位和地图编程指南
- 天安门和清华西门坐标: 百度地图坐标拾取器
- 代码编写: Xcode 7.1
- 图片截图: command+shift+4