如何在谷歌地图上显示路线上的时间

时间:2016-08-02 12:48:53

标签: ios mkmapview mkannotation mkpolyline

enter image description here我创建了带有多个注释的路由。 我希望在注释之间显示文本,这与附加的屏幕截图完全相同。

任何人都可以帮忙吗?

由于

1 个答案:

答案 0 :(得分:1)

我试过会显示两个注释之间的距离,但是当你点击MKPolylineOverlay时却没有。更重要的是,我没有维持任何标准。

这是我的控制器结构。

import UIKit
import MapKit

class RouteViewController: UIViewController, MKMapViewDelegate {

    @IBOutlet weak var mapView: MKMapView!

    //Rest of the code see below
}

首先,我将添加一些注释,以便在 viewDidLoad 委托方法中进行映射,如下所示。

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

    let annotation1 = MKPointAnnotation()
    annotation1.title = "Times Square"
    annotation1.coordinate =  CLLocationCoordinate2D(latitude: 40.759011, longitude: -73.984472)

    let annotation2 = MKPointAnnotation()
    annotation2.title = "Empire State Building"
    annotation2.coordinate =  CLLocationCoordinate2D(latitude: 40.748441, longitude: -73.985564)

    let annotation3 = MKPointAnnotation()
    annotation3.title = "Some Point"
    annotation3.coordinate =  CLLocationCoordinate2D(latitude: 40.7484, longitude: -73.97)

    let arrayOfPoints = [ annotation1, annotation2, annotation3]
    self.mapView.addAnnotations(arrayOfPoints)
    self.mapView.centerCoordinate = annotation2.coordinate

    for (index, annotation) in arrayOfPoints.enumerate() {
        if index < (arrayOfPoints.count-1) {
            //I am taking the two consecutive annotation and performing the routing operation.
            self.directionHandlerMethod(annotation.coordinate, ePoint: arrayOfPoints[index+1].coordinate)
        }
    }
}

directionHandlerMethod 中,我正在执行方向的实际请求,如下所示

func directionHandlerMethod(sPoint: CLLocationCoordinate2D, ePoint: CLLocationCoordinate2D) {
    let sourcePlacemark = MKPlacemark(coordinate: sPoint, addressDictionary: nil)
    let destinationPlacemark = MKPlacemark(coordinate: ePoint, addressDictionary: nil)
    let sourceMapItem = MKMapItem(placemark: sourcePlacemark)
    let destinationMapItem = MKMapItem(placemark: destinationPlacemark)

    let directionRequest = MKDirectionsRequest()
    directionRequest.source = sourceMapItem
    directionRequest.destination = destinationMapItem
    directionRequest.transportType = .Automobile
    let directions = MKDirections(request: directionRequest)
    directions.calculateDirectionsWithCompletionHandler {
        (response, error) -> Void in
        guard let response = response else {
            if let error = error {
                print("Error: \(error)")
            }
            return
        }
        //I am assuming that it will contain one and only one result so I am taking that one passing to addRoute method
        self.addRoute(response.routes[0])
    }
}

接下来,我将在 addRoute 方法中的地图上添加折线路线,如下所示,

func addRoute(route: MKRoute) {
    let polyline = route.polyline

    //Here I am taking the centre point on the polyline and placing an annotation by giving the title as 'Route' and the distance in the subtitle
    let annoatation = MKPointAnnotation()
    annoatation.coordinate = MKCoordinateForMapPoint(polyline.points()[polyline.pointCount/2])
    annoatation.title = "Route"
    let timeInMinute = route.expectedTravelTime / 60
    let distanceString =  String.localizedStringWithFormat("%.2f %@", timeInMinute, timeInMinute>1 ? "minutes" : "minute")
    annoatation.subtitle = distanceString
    self.mapView.addAnnotation(annoatation)

    self.mapView.addOverlay(polyline)
}

接下来我正在实施 rendererForOverlay 委托方法,如下所示

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
    let renderer = MKPolylineRenderer(overlay: overlay)
    renderer.strokeColor = UIColor.blueColor()
    renderer.lineWidth = 2
    renderer.lineCap = .Butt
    renderer.lineJoin = .Round
    return renderer
}

下一个是重要的一个委托方法,即 viewForAnnotation 。在这里,我正在做一些事情,比如放置标签而不是下面的注释,

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
    if annotation.title != nil && annotation.title!! == "Route" {
        let label = UILabel()
        label.adjustsFontSizeToFitWidth = true
        label.backgroundColor = UIColor.whiteColor()
        label.minimumScaleFactor = 0.5
        label.frame = CGRect(x: 0, y: 0, width: 100, height: 30)
        label.text = annotation.subtitle ?? ""
        let view = MKAnnotationView()
        view.addSubview(label)
        return view
    }
    return nil
}