Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在谷歌地图上绘制正确的多段线_Ios_Swift_Google Maps_Google Maps Api 3_Google Maps Sdk Ios - Fatal编程技术网

Ios 如何在谷歌地图上绘制正确的多段线

Ios 如何在谷歌地图上绘制正确的多段线,ios,swift,google-maps,google-maps-api-3,google-maps-sdk-ios,Ios,Swift,Google Maps,Google Maps Api 3,Google Maps Sdk Ios,我已经成功地从a点到b点绘制了一条多段线,但由于某些原因,它显示的是线性线,而不是正确的航路点 这是密码 let path = GMSMutablePath() path.addLatitude(3.1970044, longitude:101.7389365) path.addLatitude(3.2058354, longitude:101.729536) let polyline = GMSPolyline(path: path)

我已经成功地从a点到b点绘制了一条多段线,但由于某些原因,它显示的是线性线,而不是正确的航路点

这是密码

let path = GMSMutablePath()
        path.addLatitude(3.1970044, longitude:101.7389365)
        path.addLatitude(3.2058354, longitude:101.729536)
        let polyline = GMSPolyline(path: path)
        polyline.strokeWidth = 5.0
        polyline.geodesic = true
        polyline.map = mapView
我原以为它会做一些航路点,但它只显示直线多段线


您需要获得路线的所有积分。要获得路线,您需要使用Google Direction API。然后使用数组的第一个结果,即最短的结果,使用编码路径使用pathFromEncodedPath:method绘制一条多边形线。

self.googleMapsView是google地图视图

示例:self.getDirections(“26.9211992,75.8185761”,目的地:“26.8472496,75.7691909”,航路点:[“26.8686811,75.7568383],旅行模式:无,完成处理程序:无)

示例:谷歌方向链接

let baseURLGeocode=”https://maps.googleapis.com/maps/api/geocode/json?"
让baseURLDirections=”https://maps.googleapis.com/maps/api/directions/json?"
var selectedRoute:字典!
var概览多段线:字典!
变量原始坐标:CLLocationCoordinate2D!
var DestinationCoordination:CLLocationCoordinate2D!
func getDirections(起点:String!、终点:String!、航路点:Array!、travelMode:AnyObject!、completionHandler:((状态:String,成功:Bool)->Void)?){
如果让originLocation=原点{
如果让destinationLocation=目的地{
var directionsURLString=baseURLDirections+“origin=“+originLocation+”&destination=“+destinationLocation
如果让航路点=航路点{
directionsURLString+=“&waypoints=optimize:true”
对于航路点中的航路点{
方向URLSTRING+=“|”+航路点
}
}
打印(方向URL字符串)
directionsURLString=directionsURLString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
让directionsURL=NSURL(字符串:directionsURLString)
dispatch\u async(dispatch\u get\u main\u queue(),{()->Void in
让directionsData=NSData(contentsOfURL:directionsURL!)
做{
让dictionary:dictionary=尝试将NSJSONSerialization.JSONObjectWithData(directionsData!,选项:NSJSONReadingOptions.MutableContainers)作为!dictionary
让status=dictionary[“status”]作为!字符串
如果状态==“正常”{
self.selectedRoute=(字典[“路由”]作为!数组)[0]
self.overview polyline=self.selectedRoute[“overview\u polyline”]作为字典
让legs=self.selectedRoute[“legs”]作为!数组
让startLocationDictionary=legs[0][“开始位置”]作为!Dictionary
self.originCoordinate=CLLocationCoordinate2DMake(startLocationDictionary[“lat”]as!Double,startLocationDictionary[“lng”]as!Double)
让endLocationDictionary=legs[legs.count-1][“end\u location”]作为!Dictionary
self.destinationCoordinate=CLLocationCoordinate2DMake(endLocationDictionary[“lat”]as!Double,endLocationDictionary[“lng”]as!Double)
将originAddress=legs[0][“起始地址”]设为!字符串
让destinationAddress=legs[legs.count-1][“end_address”]作为!字符串
让originMarker=GMSMarker(位置:self.originCoordinate)
originMarker.map=self.googleMapsView
originMarker.icon=GMSMarker.markerImageWithColor(UIColor.greenColor())
originMarker.title=originAddress
让destinationMarker=GMSMarker(位置:self.DestinationCoordination)
destinationMarker.map=self.googleMapsView
destinationMarker.icon=GMSMarker.markerImageWithColor(UIColor.redColor())
destinationMarker.title=destinationAddress
如果航路点!=nil&&waypoints.count>0{
对于航路点中的航路点{
设lat:Double=(waypoint.componentsSeparatedByString(“,”[0]作为NSString)。doubleValue
设lng:Double=(waypoint.componentsSeparatedByString(“,”[1]作为NSString)。doubleValue
让标记器=GMS标记器(位置:CLLocationCoordinate2DMake(lat,lng))
marker.map=self.googleMapsView
marker.icon=GMSMarker.markerImageWithColor(UIColor.purpleColor())
}
}
让route=self.Overview多段线[“点”]作为!字符串
让路径:GMSPath=GMSPath(fromEncodedPath:route)!
让routePolyline=GMSPolyline(路径:path)
routePolyline.map=self.googleMapsView
}
否则{
打印(“状态”)
//completionHandler(状态:status,success:false)
}
}
抓住{
打印(“捕获”)
//completionHandler(状态:“”,成功:false)
}
})
}
否则{
打印(“目的地为零”)
//completionHandler(状态:“目标为零”,成功:false)
}
}
否则{
打印(“原点为零”)
//completionHandler(状态:“原点为零”,成功:false)
}
}
适用于Swift 3.0 请使用此代码

func getDirections(origin: String!, destination: String!, waypoints:    Array<String>!, travelMode: AnyObject!, completionHandler: ((_ status:   String, _ success: Bool) -> Void)?) {

        if let originLocation = origin {
            if let destinationLocation = destination {
                var directionsURLString = baseURLDirections + "origin=" + originLocation + "&destination=" + destinationLocation
                if let routeWaypoints = waypoints {
                    directionsURLString += "&waypoints=optimize:true"

                    for waypoint in routeWaypoints {
                        directionsURLString += "|" + waypoint
                    }
                }
                print(directionsURLString)
                directionsURLString = directionsURLString.addingPercentEscapes(using: String.Encoding.utf8)!
                let directionsURL = NSURL(string: directionsURLString)
                DispatchQueue.main.async( execute: { () -> Void in
                    let directionsData = NSData(contentsOf: directionsURL! as URL)
                    do{
                        let dictionary: Dictionary<String, AnyObject> = try JSONSerialization.jsonObject(with: directionsData! as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! Dictionary<String, AnyObject>

                        let status = dictionary["status"] as! String

                        if status == "OK" {
                            self.selectedRoute = (dictionary["routes"] as! Array<Dictionary<String, AnyObject>>)[0]
                            self.overviewPolyline = self.selectedRoute["overview_polyline"] as! Dictionary<String, AnyObject>

                            let legs = self.selectedRoute["legs"] as! Array<Dictionary<String, AnyObject>>

                            let startLocationDictionary = legs[0]["start_location"] as! Dictionary<String, AnyObject>
                            self.originCoordinate = CLLocationCoordinate2DMake(startLocationDictionary["lat"] as! Double, startLocationDictionary["lng"] as! Double)

                            let endLocationDictionary = legs[legs.count - 1]["end_location"] as! Dictionary<String, AnyObject>
                            self.destinationCoordinate = CLLocationCoordinate2DMake(endLocationDictionary["lat"] as! Double, endLocationDictionary["lng"] as! Double)

                            let originAddress = legs[0]["start_address"] as! String
                            let destinationAddress = legs[legs.count - 1]["end_address"] as! String

                            let originMarker = GMSMarker(position: self.originCoordinate)
                            originMarker.map = self.mapView
                            originMarker.icon = UIImage(named: "mapIcon")
                            originMarker.title = originAddress

                            let destinationMarker = GMSMarker(position: self.destinationCoordinate)
                            destinationMarker.map = self.mapView
                            destinationMarker.icon = UIImage(named: "mapIcon")
                            destinationMarker.title = destinationAddress

                            if waypoints != nil && waypoints.count > 0 {
                                for waypoint in waypoints {
                                    let lat: Double = (waypoint.components(separatedBy: ",")[0] as NSString).doubleValue
                                    let lng: Double = (waypoint.components(separatedBy: ",")[1] as NSString).doubleValue

                                    let marker = GMSMarker(position: CLLocationCoordinate2DMake(lat, lng))
                                    marker.map = self.mapView
                                    marker.icon = UIImage(named: "mapIcon")

                                }
                            }

                            let route = self.overviewPolyline["points"] as! String

                            let path: GMSPath = GMSPath(fromEncodedPath: route)!
                            let routePolyline = GMSPolyline(path: path)
                            routePolyline.map = self.mapView
                            routePolyline.strokeColor = UIColor(red: 44, green: 134, blue: 200)
                            routePolyline.strokeWidth = 3.0
                        }
                        else {
                            print("status")
                            //completionHandler(status: status, success: false)
                        }
                    }
                    catch {
                        print("catch")

                        // completionHandler(status: "", success: false)
                    }
                })
            }
            else {
                print("Destination is nil.")
                //completionHandler(status: "Destination is nil.", success: false)
            }
        }
        else {
            print("Origin is nil")
            //completionHandler(status: "Origin is nil", success: false)
        }
    }
func-getDirections(起点:String!、终点:String!、航路点:Array!、travelMode:AnyObject!、completionHandler:((u-status:String,uu-success:Bool)->Void)?){
如果让originLocation=原点{
如果让destinationLocation=目的地
func getDirections(origin: String!, destination: String!, waypoints:    Array<String>!, travelMode: AnyObject!, completionHandler: ((_ status:   String, _ success: Bool) -> Void)?) {

        if let originLocation = origin {
            if let destinationLocation = destination {
                var directionsURLString = baseURLDirections + "origin=" + originLocation + "&destination=" + destinationLocation
                if let routeWaypoints = waypoints {
                    directionsURLString += "&waypoints=optimize:true"

                    for waypoint in routeWaypoints {
                        directionsURLString += "|" + waypoint
                    }
                }
                print(directionsURLString)
                directionsURLString = directionsURLString.addingPercentEscapes(using: String.Encoding.utf8)!
                let directionsURL = NSURL(string: directionsURLString)
                DispatchQueue.main.async( execute: { () -> Void in
                    let directionsData = NSData(contentsOf: directionsURL! as URL)
                    do{
                        let dictionary: Dictionary<String, AnyObject> = try JSONSerialization.jsonObject(with: directionsData! as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! Dictionary<String, AnyObject>

                        let status = dictionary["status"] as! String

                        if status == "OK" {
                            self.selectedRoute = (dictionary["routes"] as! Array<Dictionary<String, AnyObject>>)[0]
                            self.overviewPolyline = self.selectedRoute["overview_polyline"] as! Dictionary<String, AnyObject>

                            let legs = self.selectedRoute["legs"] as! Array<Dictionary<String, AnyObject>>

                            let startLocationDictionary = legs[0]["start_location"] as! Dictionary<String, AnyObject>
                            self.originCoordinate = CLLocationCoordinate2DMake(startLocationDictionary["lat"] as! Double, startLocationDictionary["lng"] as! Double)

                            let endLocationDictionary = legs[legs.count - 1]["end_location"] as! Dictionary<String, AnyObject>
                            self.destinationCoordinate = CLLocationCoordinate2DMake(endLocationDictionary["lat"] as! Double, endLocationDictionary["lng"] as! Double)

                            let originAddress = legs[0]["start_address"] as! String
                            let destinationAddress = legs[legs.count - 1]["end_address"] as! String

                            let originMarker = GMSMarker(position: self.originCoordinate)
                            originMarker.map = self.mapView
                            originMarker.icon = UIImage(named: "mapIcon")
                            originMarker.title = originAddress

                            let destinationMarker = GMSMarker(position: self.destinationCoordinate)
                            destinationMarker.map = self.mapView
                            destinationMarker.icon = UIImage(named: "mapIcon")
                            destinationMarker.title = destinationAddress

                            if waypoints != nil && waypoints.count > 0 {
                                for waypoint in waypoints {
                                    let lat: Double = (waypoint.components(separatedBy: ",")[0] as NSString).doubleValue
                                    let lng: Double = (waypoint.components(separatedBy: ",")[1] as NSString).doubleValue

                                    let marker = GMSMarker(position: CLLocationCoordinate2DMake(lat, lng))
                                    marker.map = self.mapView
                                    marker.icon = UIImage(named: "mapIcon")

                                }
                            }

                            let route = self.overviewPolyline["points"] as! String

                            let path: GMSPath = GMSPath(fromEncodedPath: route)!
                            let routePolyline = GMSPolyline(path: path)
                            routePolyline.map = self.mapView
                            routePolyline.strokeColor = UIColor(red: 44, green: 134, blue: 200)
                            routePolyline.strokeWidth = 3.0
                        }
                        else {
                            print("status")
                            //completionHandler(status: status, success: false)
                        }
                    }
                    catch {
                        print("catch")

                        // completionHandler(status: "", success: false)
                    }
                })
            }
            else {
                print("Destination is nil.")
                //completionHandler(status: "Destination is nil.", success: false)
            }
        }
        else {
            print("Origin is nil")
            //completionHandler(status: "Origin is nil", success: false)
        }
    }
func drawMap ()
{

    let str = String(format:"https://maps.googleapis.com/maps/api/directions/json?origin=\(originLatitude),\(originlongitude)&destination=\(destinationlatitude),\(destinationlongitude)&key=AIzaSyC8HZTqt2wsl14eI_cKxxxxxxxxxxxx")


    Alamofire.request(str).responseJSON { (responseObject) -> Void in

        let resJson = JSON(responseObject.result.value!)
        print(resJson)

        if(resJson["status"].rawString()! == "ZERO_RESULTS")
        {

        }
        else if(resJson["status"].rawString()! == "NOT_FOUND")
        {

        }
        else{

            let routes : NSArray = resJson["routes"].rawValue as! NSArray
            print(routes)

            let position = CLLocationCoordinate2D(latitude: self.sellerlatitude, longitude: self.sellerlongitude)

            let marker = GMSMarker(position: position)
            marker.icon = UIImage(named: "mapCurrent")
            marker.title = "Customer have selected same location as yours"
            marker.map = self.Gmap

            let position2 = CLLocationCoordinate2D(latitude: self.Buyyerlatitude, longitude: self.Buyyerlongitude)

            let marker1 = GMSMarker(position: position2)
            marker1.icon = UIImage(named: "makeupmarker")
            marker1.title = self.locationAddress
            marker1.map = self.Gmap

            let pathv : NSArray = routes.value(forKey: "overview_polyline") as! NSArray
            print(pathv)
            let paths : NSArray = pathv.value(forKey: "points") as! NSArray
            print(paths)
            let newPath = GMSPath.init(fromEncodedPath: paths[0] as! String)


            let polyLine = GMSPolyline(path: newPath)
            polyLine.strokeWidth = 3
            polyLine.strokeColor = UIColor.blue
            polyLine.map = self.Gmap

            let bounds = GMSCoordinateBounds(coordinate: position, coordinate: position2)
            let update = GMSCameraUpdate.fit(bounds, with: UIEdgeInsetsMake(170, 30, 30, 30))
            self.Gmap!.moveCamera(update)

        }
    }
}
    func drawMap(SourceCordinate : CLLocationCoordinate2D, destinationcordinate :CLLocationCoordinate2D)
   {
       self.mapView.clear()
       let str = String(format:"https://maps.googleapis.com/maps/api/directions/json?origin=\(SourceCordinate.latitude),\(SourceCordinate.longitude)&destination=\(destinationcordinate.latitude),\(destinationcordinate.longitude)&key=\(googleServiceKey)")
       print(str)
       Alamofire.request(str).responseJSON { (responseObject) -> Void in
           let resJson = JSON(responseObject.result.value!)
           print(resJson)
           let routes : NSArray = resJson["routes"].rawValue as! NSArray
           if(resJson["status"].rawString()! == "ZERO_RESULTS"){}
           else if(resJson["status"].rawString()! == "NOT_FOUND"){}
           else if routes.count == 0{}
           else{
               let routes : NSArray = resJson["routes"].rawValue as! NSArray
               let position = CLLocationCoordinate2D(latitude: SourceCordinate.latitude, longitude: SourceCordinate.longitude)
               /*let marker = GMSMarker(position: position)
               marker.icon = #imageLiteral(resourceName: "ic_usermaplocation")//UIImage(named: "ic_MapPinGreyIcon")
               marker.title = "" // Addres
               marker.map = self.mapView
               let position2 = CLLocationCoordinate2D(latitude: destinationcordinate.latitude, longitude: destinationcordinate.longitude)
               let marker1 = GMSMarker(position: position2)
               marker1.icon = #imageLiteral(resourceName: "ic_usermaplocation")//UIImage(named: "ic_LocationPinRedIcon")
               marker1.title = "" // Destination Address
               marker1.map = self.mapView*/
               let pathv : NSArray = routes.value(forKey: "overview_polyline") as! NSArray
               let paths : NSArray = pathv.value(forKey: "points") as! NSArray
               let newPath = GMSPath.init(fromEncodedPath: paths[0] as! String)
               let polyLine = GMSPolyline(path: newPath)
               polyLine.strokeWidth = 5
               polyLine.strokeColor =  .black
               let ThemeOrange = GMSStrokeStyle.solidColor( .black)
               let OrangeToBlue = GMSStrokeStyle.gradient(from:  .black, to:  .black)
               polyLine.spans = [GMSStyleSpan(style: ThemeOrange),
                                 GMSStyleSpan(style: ThemeOrange),
                                 GMSStyleSpan(style: OrangeToBlue)]
               polyLine.map = self.mapView
               let camera = GMSCameraPosition.camera(withLatitude: self.sourceLat, longitude: self.sourceLong, zoom: 15.0)
               self.mapView.animate(to: camera)
               /*let bounds = GMSCoordinateBounds(coordinate: position, coordinate: position2)
                let update = GMSCameraUpdate.fit(bounds, with: UIEdgeInsets(top: 100, left: 100, bottom: 400, right: 100))
                self.objMapVIew!.moveCamera(update)*/
           }
       }
   }
func drawMap (src: CLLocationCoordinate2D, dst: CLLocationCoordinate2D) {

        let str = String(format:"https://maps.googleapis.com/maps/api/directions/json?origin=\(src.latitude),\(src.longitude)&destination=\(dst.latitude),\(dst.longitude)&key=AIzaSyBKV************")

        Alamofire.request(str).responseJSON { (responseObject) -> Void in

            let resJson = JSON(responseObject.result.value!)
            print(resJson)

            if(resJson["status"].rawString()! == "ZERO_RESULTS")
            {

            }
            else if(resJson["status"].rawString()! == "NOT_FOUND")
            {

            }
            else{

                let routes : NSArray = resJson["routes"].rawValue as! NSArray
                print(routes)

                let position = CLLocationCoordinate2D(latitude: src.latitude, longitude: src.longitude)

                let marker = GMSMarker(position: position)
                marker.icon = UIImage(named: "mapCurrent")
                marker.title = "Customer have selected same location as yours"
                marker.map = self.mapView

                let position2 = CLLocationCoordinate2D(latitude: dst.latitude, longitude: dst.longitude)

                let marker1 = GMSMarker(position: position2)
                marker1.icon = UIImage(named: "makeupmarker")
                marker1.title = "aa"
                marker1.map = self.mapView

                let pathv : NSArray = routes.value(forKey: "overview_polyline") as! NSArray
                print(pathv)
                let paths : NSArray = pathv.value(forKey: "points") as! NSArray
                print(paths)
                let newPath = GMSPath.init(fromEncodedPath: paths[0] as! String)


                let polyLine = GMSPolyline(path: newPath)
                polyLine.strokeWidth = 3
                polyLine.strokeColor = UIColor.blue
                polyLine.map = self.mapView

                let bounds = GMSCoordinateBounds(coordinate: position, coordinate: position2)
                let update = GMSCameraUpdate.fit(bounds, with: UIEdgeInsetsMake(170, 30, 30, 30))
                self.mapView!.moveCamera(update)

            }
        }
    }
let fromLoc = CLLocationCoordinate2DMake(latitude1, longitude1)
let toLoc = CLLocationCoordinate2DMake(latitude2, longitude2)

drawMap(src: fromLoc, dst: toLoc)