swift 导航方案2 使用苹果服务器的数据导航
2020-05-20 本文已影响0人
越天高
// 操作覆盖层, 实际上操作的是覆盖层:"数据模型"
// 添加覆盖层, 添加一个覆盖层:"数据模型"
// // 删除覆盖层, 删除一个覆盖层:"数据模型"
@IBOutlet weak var mapView: MKMapView!
lazy var geoCode : CLGeocoder = {
return CLGeocoder()
}()
override func viewDidLoad()
{
super.viewDidLoad()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
{
geoCode.geocodeAddressString("南京")
{ (placeMarks, error) in
if error == nil
{
//添加一个圆形的覆盖层
let njMark = placeMarks?.first
let njLayer = MKCircle(center: (njMark?.location?.coordinate)!, radius: 1000)
self.mapView.addOverlay(njLayer)
self.geoCode.geocodeAddressString("济南")
{ (placeMarks, error) in
if error == nil
{
//添加一个圆形的覆盖层
let jnMark = placeMarks?.first
let jnLayer = MKCircle(center: (jnMark?.location?.coordinate)!, radius: 1000)
self.mapView.addOverlay(jnLayer)
self.calulate(startMark: njMark!, endMark: jnMark!)
}
}
}
}
}
func calulate( startMark : CLPlacemark , endMark : CLPlacemark )
{
//开始的地点
let startMP = MKPlacemark(placemark: startMark)
let startItem = MKMapItem(placemark: startMP)
//结束的地点
let endMP = MKPlacemark(placemark: endMark)
let endItem = MKMapItem(placemark: endMP)
//创建导航路线请求对象
let request = MKDirections.Request()
//设置参数
request.source = startItem
request.destination = endItem
//创建导航对象
let directions = MKDirections(request: request)
//开始计算请求
directions.calculate
{ (response, error) in
if (error == nil)
{
print(response!)
for route in (response?.routes)!
{
// MKRoute
// name: 路线名称
// advisoryNotices: [String] : 提示信息
// distance: CLLocationDistance 长度
// expectedTravelTime: NSTimeInterval: 预计到达时间段
// transportType : 行走方式(步行, 驾驶, 公交)
// polyline: MKPolyline: 导航路线对应的数据模型
// steps: [MKRouteStep]: 每一步该怎么走
// MKRouteStep
// instructions: String : 行走提示: 前方路口左转
// notice: 警告信息
// distance : 每一节路线的长度距离
// transportType: 每一路的交通方式
print(route.name)
print(route.advisoryNotices)
print(route.distance)
// 添加覆盖层数据模型
// 当我们添加一个覆盖层数据模型时, 系统绘自动查找对应的代理方法, 找到对应的覆盖层"视图"
self.mapView.addOverlay(route.polyline)
for step in route.steps
{
print(step.instructions)
}
}
}
}
}
}
mapView的代理方法
extension ViewController : MKMapViewDelegate
{
/**
当添加一个覆盖层数据模型到地图上时, 地图会调用这个方法, 查找对应的覆盖层"视图"(渲染图层)
- parameter mapView: ditu
- parameter overlay: 覆盖层"数据模型"
- returns: 覆盖层视图
*/
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer
{
// 不同的覆盖层数据模型, 对应不同的覆盖层视图来显示
var reusltRender = MKOverlayRenderer()
if overlay.isKind(of: MKPolyline.self)
{
let render = MKPolylineRenderer(overlay: overlay)
//设置线宽
render.lineWidth = 5
//设置线的颜色
render.strokeColor = UIColor.blue
reusltRender = render;
}
if overlay.isKind(of: MKCircle.self)
{
let render = MKCircleRenderer(overlay: overlay)
//设置线宽
render.lineWidth = 5
//设置线的颜色
render.strokeColor = UIColor.red
reusltRender = render;
}
return reusltRender
}