PolyLines未显示在Google地图中

时间:2017-11-06 04:58:10

标签: ios swift google-maps-api-3 google-maps-markers google-polyline

我希望在Google地图上显示目标和来源之间的路径。我是google方向api在坐标之间的路线,我得到回应并设置在谷歌地图但没有在地图上显示。我的代码是

func getPolylineRoute(from source: CLLocationCoordinate2D, to destination: CLLocationCoordinate2D){

    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)

    let url = URL(string: "https://maps.googleapis.com/maps/api/directions/json?origin=\(source.latitude),\(source.longitude)&destination=\(destination.latitude),\(destination.longitude)&sensor=true&mode=driving&key=AIzaSyAyU5txJ86b25-_l0DW-IldSKGGYqQJn3M")!

    let task = session.dataTask(with: url, completionHandler: {
        (data, response, error) in

        DispatchQueue.main.async {

            if error != nil {
                print(error!.localizedDescription)
                AppManager.dissmissHud()
            }
            else {
                do {
                    if let json : [String:Any] = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]{

                        guard let routes = json["routes"] as? NSArray else {
                            DispatchQueue.main.async {
                                AppManager.dissmissHud()
                            }
                            return
                        }

                        if (routes.count > 0) {
                            let overview_polyline = routes[0] as? NSDictionary
                            let dictPolyline = overview_polyline?["overview_polyline"] as? NSDictionary

                            let points = dictPolyline?.object(forKey: "points") as? String

                            self.showPath(polyStr: points!)

                            DispatchQueue.main.async {
                                AppManager.dissmissHud()

                                let bounds = GMSCoordinateBounds(coordinate: source, coordinate: destination)
                                let update = GMSCameraUpdate.fit(bounds, with: UIEdgeInsetsMake(75, 20, 20, 20))
                                self.vwMap!.moveCamera(update)
                            }
                        }
                        else {
                            DispatchQueue.main.async {
                                AppManager.dissmissHud()
                            }
                        }
                    }
                }
                catch {
                    print("error in JSONSerialization")
                    DispatchQueue.main.async {
                        AppManager.dissmissHud()
                    }
                }
            }
        }
    })
    task.resume()
}


func drawPlyLineOnMap()  {

    let source : CLLocationCoordinate2D  =  CLLocationCoordinate2DMake(Double((model?.fromAddressLatitude)!), Double((model?.fromAddressLongtitude)!))
    let destination : CLLocationCoordinate2D  =  CLLocationCoordinate2DMake(Double((model?.toAddressLatitude)!), Double((model?.toAddressLongtitude)!))

    self.vwMap.clear()
    //Source pin
    let marker = GMSMarker()
    let markerImage = UIImage(named: "from_pin")!.withRenderingMode(.alwaysOriginal)
    let markerView = UIImageView(image: markerImage)
    marker.position = source
    marker.iconView = markerView
    //marker.userData = dict
    marker.map = vwMap

    //Destination pin
    let markerTo = GMSMarker()
    let markerImageTo = UIImage(named: "to_red_pin")!.withRenderingMode(.alwaysOriginal)
    let markerViewTo = UIImageView(image: markerImageTo)
    markerTo.position = destination
    // marker.userData = dict
    markerTo.iconView = markerViewTo
    markerTo.map = vwMap

    var arrAdTemp:[AddressTableModel] = []
    arrAdTemp.append(contentsOf: arrAddresses)
    arrAdTemp.removeLast()
    arrAdTemp.removeFirst()
    for obj in arrAdTemp {
        print(obj.strLatitude)
        print(obj.strLongtitude)
        let stopOver : CLLocationCoordinate2D  =  CLLocationCoordinate2DMake(obj.strLatitude, obj.strLongtitude)
        let markerStop = GMSMarker()
        let markerImageStop = UIImage(named: "to_red_pin")!.withRenderingMode(.alwaysOriginal)
        let markerViewStop = UIImageView(image: markerImageStop)
        markerStop.position = stopOver
        //marker.userData = dict
        markerStop.iconView = markerViewStop
        markerStop.map = vwMap
    }

    self.getPolylineRoute(from: source, to: destination)
}

func showPath(polyStr :String){
    let path = GMSPath(fromEncodedPath: polyStr)
    let polyline = GMSPolyline(path: path)
    polyline.strokeWidth = 3.0
    polyline.strokeColor = UIColor.black
    polyline.map = vwMap // Your map view
}

我在下面尝试了很多答案,但没有为我工作。请帮帮我。

  1. 1st answer tried
  2. 2nd answer tried
  3. 3rd answer tried

2 个答案:

答案 0 :(得分:5)

您正在设置错误的界限,因此它不会显示在您的地图上。我已经尝试过你的代码它工作正常。请将您的边界区域更改为(0,0,0,0)

 func getPolylineRoute(from source: CLLocationCoordinate2D, to destination: CLLocationCoordinate2D){

        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)

        let url = URL(string: "https://maps.googleapis.com/maps/api/directions/json?origin=\(source.latitude),\(source.longitude)&destination=\(destination.latitude),\(destination.longitude)&sensor=true&mode=driving&key=AIzaSyAyU5txJ86b25-_l0DW-IldSKGGYqQJn3M")!

        let task = session.dataTask(with: url, completionHandler: {
            (data, response, error) in

            DispatchQueue.main.async {

                if error != nil {
                    print(error!.localizedDescription)
                    AppManager.dissmissHud()
                }
                else {
                    do {
                        if let json : [String:Any] = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]{

                            guard let routes = json["routes"] as? NSArray else {
                                DispatchQueue.main.async {
                                    AppManager.dissmissHud()
                                }
                                return
                            }

                            if (routes.count > 0) {
                                let overview_polyline = routes[0] as? NSDictionary
                                let dictPolyline = overview_polyline?["overview_polyline"] as? NSDictionary

                                let points = dictPolyline?.object(forKey: "points") as? String

                                self.showPath(polyStr: points!)

                                DispatchQueue.main.async {
                                    AppManager.dissmissHud()

                                    let bounds = GMSCoordinateBounds(coordinate: source, coordinate: destination)
//below bounds change as 0 check it on full screen
                                    let update = GMSCameraUpdate.fit(bounds, with: UIEdgeInsetsMake(0, 0, 0, 0))
                                    self.vwMap!.moveCamera(update)
                                }
                            }
                            else {
                                DispatchQueue.main.async {
                                    AppManager.dissmissHud()
                                }
                            }
                        }
                    }
                    catch {
                        print("error in JSONSerialization")
                        DispatchQueue.main.async {
                            AppManager.dissmissHud()
                        }
                    }
                }
            }
        })
        task.resume()
    }

答案 1 :(得分:0)

我使用此代码做了同样的事情。

   {let url = URL(string: "https://maps.googleapis.com/maps/api/directions/json?origin=\(self.currentLocation.coordinate.latitude),\(self.currentLocation.coordinate.longitude)&destination=\(33.6165),\(73.0962)&key=yourKey")
    let request = URLRequest(url: url!)
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)

    let task = session.dataTask(with: request, completionHandler: {(data, response, error) in

        // notice that I can omit the types of data, response and error
        do{
             let json = JSON(data!)
            let errornum = json["error"]


            if (errornum == true){

            }else{
                let routes = json["routes"].array

                    if routes != nil && (routes?.count)! > 0{

                        let overViewPolyLine = routes![0]["overview_polyline"]["points"].string
                        let dict = routes![0].dictionaryValue
                        let distance = dict["legs"]?[0]["distance"]
                        _ = distance?["text"].stringValue
                        let duaration = dict["legs"]?[0]["duration"]
                        _ = duaration?["text"].stringValue
                        //dict["legs"]?["distance"]["text"].stringValue
                        print(overViewPolyLine!)
            if overViewPolyLine != nil{

                DispatchQueue.main.async() {

            self.addPolyLineWithEncodedStringInMap(encodedString: overViewPolyLine!)

                }
           }
        }
}

然后

  {
      func addPolyLineWithEncodedStringInMap(encodedString: String) {


    let path = GMSPath(fromEncodedPath: encodedString)!
    let polyLine = GMSPolyline(path: path)
    polyLine.strokeWidth = 5
    polyLine.strokeColor = UIColor.yellow
    polyLine.map = self.googleMapsView
    let center = CLLocationCoordinate2D(latitude: 33.6165, longitude: 73.0962)
    let marker = GMSMarker(position: center)
    marker.map = self.googleMapsView
}


func decodePolyline(encodedString: String){
    let polyline = Polyline(encodedPolyline: encodedString)
    let decodedCoordinates: [CLLocationCoordinate2D]? = polyline.coordinates
    for coordinate in decodedCoordinates! {
        let marker = GMSMarker(position: coordinate)
        marker.icon = UIImage(named: "mapPin")

         marker.map = self.googleMapsView
    }
}