在Swift中显示地图上的路线 [英] Display route on map in Swift

查看:173
本文介绍了在Swift中显示地图上的路线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Apple地图上绘制两点之间的路线(Swift代码)。
以下结构用于存储坐标

I am trying to draw the route between two points on Apple map (Swift code). The following structure is used to store the coordinates

struct GeoLocation {
    var latitude: Double
    var longitude: Double

    func distanceBetween(other: GeoLocation) -> Double {
        let locationA = CLLocation(latitude: self.latitude, longitude: self.longitude)
        let locationB = CLLocation(latitude: other.latitude, longitude: other.longitude)
        return locationA.distanceFromLocation(locationB)
    }
}

self.foundLocations - is an array of these structures

在自定义类中,我收到地图上各点的坐标。

In the custom class I recieve the coordinates of the points on the map.

var coordinates = self.foundLocations.map{$0.coordinate}

然后我画上了路线map

Then I draw the route on the map

self.polyline = MKPolyline(coordinates: &coordinates, count: coordinates.count)
        self.mapView.addOverlay(self.polyline, level: MKOverlayLevel.AboveRoads)

要绘制路线我使用以下来自MKMapViewDelegate的方法

To draw the route I use the following method from MKMapViewDelegate

func mapView(mapView: MKMapView!, rendererForOverlay overlay: MKOverlay!) -> MKOverlayRenderer! {
    if let polylineOverlay = overlay as? MKPolyline {
        let render = MKPolylineRenderer(polyline: polylineOverlay)
        render.strokeColor = UIColor.blueColor()
        return render
    }
    return nil
}

而不是实际路线铺设在道路上,我只得到两点之间的直线。
如何显示实际路线?

Instead of the actual route laying on roads I get just a straight line between two points. How can I display the actual route?

推荐答案

您实际上必须使用Apple的地图服务器获取路线 calculateDirectionsWithCompletionHandler

You actually have to fetch the route from Apple's maps' server using calculateDirectionsWithCompletionHandler.

首先创建相关的 MKMapItem s来源和目的地,例如:

First create the relevant MKMapItems for both the source and destination, ex:

let geocoder = CLGeocoder()
let location = CLLocation(latitude: sourceLatitude, longitude: sourceLongitude)

geocoder.reverseGeocodeLocation(location, completionHandler: {
        (placemarks:[AnyObject]?, error:NSError?) -> Void in
        if placemarks?.count > 0 {
            if let placemark: MKPlacemark = placemarks![0] as? MKPlacemark {
                self.source =  MKMapItem(placemark: placemark)
            }
        }
        })

(重复目的地。)

然后获取 MKRoute ,例如:

let request:MKDirectionsRequest = MKDirectionsRequest()

// source and destination are the relevant MKMapItems
request.setSource(source)
request.setDestination(destination)

// Specify the transportation type
request.transportType = MKDirectionsTransportType.Automobile;

// If you're open to getting more than one route, 
// requestsAlternateRoutes = true; else requestsAlternateRoutes = false;
request.requestsAlternateRoutes = true

let directions = MKDirections(request: request)

directions.calculateDirectionsWithCompletionHandler ({
    (response: MKDirectionsResponse?, error: NSError?) in

    if error == nil {
        self.directionsResponse = response
        // Get whichever currentRoute you'd like, ex. 0
        self.route = directionsResponse.routes[currentRoute] as MKRoute
    }
})

然后在检索 MKRoute 后,您可以将折线添加到地图中,如下所示:

Then after retrieving the MKRoute, you can add the polyline to the map like so:

mapView.addOverlay(route.polyline, level: MKOverlayLevel.AboveRoads)

这篇关于在Swift中显示地图上的路线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆