您的位置:首页 > 理论基础 > 计算机网络

swift地图定位(十八)发送网络请求给苹果服务器获取导航路线并解析和绘制到MKMapView

2016-11-15 23:25 537 查看
import UIKit
import MapKit

class ViewController: UIViewController {

@IBOutlet weak var mapView: MKMapView!

lazy var geoCoder: CLGeocoder = {
return CLGeocoder()
}()

override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
geoCoder.geocodeAddressString("上海") { (pls: [CLPlacemark]?, error:Error?) -> Void in
let shPL = pls?.first
let shCircle = MKCircle(center: (shPL?.location?.coordinate)!, radius: 50000)
self.mapView.add(shCircle)

self.geoCoder.geocodeAddressString("北京") { (pls: [CLPlacemark]?, error:Error?) -> Void in
let bjPL = pls?.first
let bjCircle = MKCircle(center: (bjPL?.location?.coordinate)!, radius: 50000)
self.mapView.add(bjCircle)

self.getRouteMessage(shPL!, endCLPL: bjPL!)
}
}
}

func getRouteMessage(_ startCLPL: CLPlacemark, endCLPL: CLPlacemark) {
let request: MKDirectionsRequest = MKDirectionsRequest()

let sourceMKPL: MKPlacemark = MKPlacemark(placemark: startCLPL)
request.source = MKMapItem(placemark: sourceMKPL)

let destinationMKPL: MKPlacemark = MKPlacemark(placemark: endCLPL)
request.destination = MKMapItem(placemark: destinationMKPL)

let directions: MKDirections = MKDirections(request: request)
directions.calculate { (response: MKDirectionsResponse?, error: Error?) in
if error == nil {
print(response)
// MKDirectionsResponse
// routes: [MKRoute]

// MKRoute
// name: 路线名称
// advisoryNotices: [String] : 提示信息
// distance: CLLocationDistance 长度
// expectedTravelTime: NSTimeInterval: 预计到达时间段
// transportType : 行走方式(步行, 驾驶, 公交)
// polyline: MKPolyline: 导航路线对应的数据模型
// steps: [MKRouteStep]: 每一步该怎么走

// MKRouteStep
// instructions: String : 行走提示: 前方路口左转
// notice: 警告信息
// distance : 每一节路线的长度距离
// transportType: 每一路的交通方式
for route in (response?.routes)! {// MKRoute
print(route.advisoryNotices)//["需要步行至目的地。", "需要过收费站。"]
print(route.name, route.distance, route.expectedTravelTime)//G2京沪高速 1304493.0 56547.0
// 当我们添加一个覆盖层数据模型时, 系统绘自动查找对应的代理方法, 找到对应的覆盖层"视图"
self.mapView.add(route.polyline)
for step in route.steps {// MKRouteStep
print(">\(step.instructions)")
}
}
}
}
}
}

extension ViewController: MKMapViewDelegate {
/**
当添加一个覆盖层数据模型到地图上时, 地图会调用这个方法, 查找对应的覆盖层"视图"(渲染图层)
- parameter mapView: 地图
- parameter overlay: 覆盖层"数据模型"
- returns: 覆盖层视图
*/
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
// 不同的覆盖层数据模型, 对应不同的覆盖层视图来显示
var resultRender = MKOverlayRenderer()

if overlay.isKind(of: MKPolyline.self) {
let render: MKPolylineRenderer = MKPolylineRenderer(overlay: overlay)
render.lineWidth = 3
render.strokeColor = UIColor.red
resultRender = render

} else if overlay.isKind(of: MKCircle.self) {
let circleRender: MKCircleRenderer = MKCircleRenderer(overlay: overlay)
circleRender.fillColor = UIColor.cyan
circleRender.alpha = 0.1
resultRender = circleRender
}
return resultRender
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MKMapView swift 地图