在谷歌地图中显示方向并绘制线条

时间:2016-12-14 09:06:22

标签: ios swift google-maps

我真的被困在这里。我只是学习如何在我的视图中显示谷歌地图。现在我想从一个地方到另一个地方做出指示。

到目前为止,这是我的代码:

@IBAction func direction(_ sender: Any) {    
Alamofire.request("https://maps.googleapis.com/maps/api/directions/json?" +
        "origin=Disneyland&destination=Universal+Studios+Hollywood4&").responseJSON
        {response in
            if(response.result.isSuccess){
                print(response.result.value)

我使用的链接是来自网络的示例。 现在我只想知道如何划线和指导.. 谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

我的答案来自我的代码段中的Swift 2

    //MARK:- Draw Route Betweeen two points
/**
 To draw a route between to cordinates.

 - parameter origin:            Source marker cordinate
 - parameter destination:       destination marker cordinate
 - parameter zoomCamera:        True if you want to zoom the map.
 - parameter completionHandler: GMSPolyline - to draw the route.
 */

func drawRoute(origin: CLLocation, destination: CLLocation, zoomCamera : Bool!, completionHandler: (polyline : AnyObject) -> Void)
{
    let key : String = Macros.apiKeys.key

    let originString: String = "\(origin.coordinate.latitude),\(origin.coordinate.longitude)"

    let destinationString: String = "\(destination.coordinate.latitude),\(destination.coordinate.longitude)"

    let directionsAPI: String = "https://maps.googleapis.com/maps/api/directions/json?"

    let directionsUrlString: String = "\(directionsAPI)&origin=\(originString)&destination=\(destinationString)&key=\(key)"

    Alamofire.request(.GET, directionsUrlString, parameters: ["": ""])
        .responseJSON { response in

            if let JSON = response.result.value
            {
                self.getRoutesWayPointsBetweenCordinates(origin.coordinate, destination: destination.coordinate, completionHandler:
                    { (routesArray) in

                        if routesArray.count > 0
                        {
                            let routesArray : NSArray = JSON.objectForKey("routes") as! NSArray

                            if routesArray.count > 0
                            {
                                let routeDic = routesArray[0]

                                let routeOverviewPolyline = routeDic .objectForKey("overview_polyline")

                                let points : String = routeOverviewPolyline! .objectForKey("points") as! String


                                // Creating Path between source and destination.
                                    self.path = GMSPath(fromEncodedPath: points)

                                    if self.polyline != nil
                                    {
                                        self.polyline.map = nil
                                    }

                                    self.polyline  = GMSPolyline(path: self.path)

                                    self.polyline.strokeWidth = 4.5

                                    self.polyline.geodesic = true

                                    self.animateRoute(self.polyline, origin: origin.coordinate, destination: destination.coordinate, pathColor:UIColor.blueColor(), zoomCamera: zoomCamera)

                                    completionHandler(polyline: self.polyline)
                            }

                        }else
                        {
                            let poly : GMSPolyline = GMSPolyline()
                            poly.strokeWidth = 5.5
                            completionHandler(polyline:  poly)
                        }
                })
            }
    }
}


func animateRoute(polyline : GMSPolyline, origin : CLLocationCoordinate2D, destination : CLLocationCoordinate2D, pathColor : UIColor, zoomCamera : Bool!)
{

    polyline.strokeColor = pathColor

    polyline.map = self.customMapView // Drawing route

    let bounds = GMSCoordinateBounds(path: path)

    var pad : CGFloat = 40.0

    if padding != nil
    {
        pad = padding
    }
    if zoomCamera == true
    {
        zoomCameraWithBounds(bounds, pad: pad)
    }
}

/**
 It will zoom the camera at specific bounds

 - parameter bounds: Bounds around which the camera should zoom
 - parameter pad:    Padding value from the edges of the window.
 */
func zoomCameraWithBounds(bounds : GMSCoordinateBounds, pad : CGFloat)
{
    let camera = self.customMapView.cameraForBounds(bounds, insets:UIEdgeInsetsZero)

    self.customMapView.camera = camera!

    let zoomCamera = GMSCameraUpdate.fitBounds(bounds, withPadding: pad)

    self.customMapView.animateWithCameraUpdate(zoomCamera) // Above lines will update map camera to fit to bounds so that the complete route between source and destination is visible.
}

你所做的是调用drawRoute函数并将源和目标坐标传递给它,它也使用Alamofire进行api命中

重要更改此 Macros.apiKeys.key 使用您的谷歌API密钥并确保其启用了正确的功能

答案 1 :(得分:0)

我将使用objective-c进行解释。我希望你能把它翻译成快速。

您是否已使用此pod 'GoogleMaps',对吧? 我认为你已经成功地展示谷歌地图。

GMSMapView *mapView_ = [GMSMapView mapWithFrame:self.mapView.frame camera:camera];

...

所以我会跳过它。

我在这里解释一下显示方向。

NSString *url_string = @"https://maps.googleapis.com/maps/api/directions/json?origin=Disneyland&destination=Universal+Studios+Hollywood4&";

如果您的出发地和目的地是纬度和经度,您可以使用此API:" https://maps.googleapis.com/maps/api/directions/json?origin=%f,%f&destination=%f,%f"

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url_string]];

if (data) {

NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSArray *routesArray = [json objectForKey:@"routes"];
NSDictionary *routeDict = [routesArray objectAtIndex:0];
NSDictionary *routeOverviewPolyline = [routeDict objectForKey:@"overview_polyline"];
NSString *points = [routeOverviewPolyline objectForKey:@"points"];

GMSMutablePath *path = [GMSMutablePath path];
path = [GMSPath pathFromEncodedPath:points].mutableCopy;

GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path];
rectangle.map = mapView_;

}