Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift iOS google Map, path to coordinate

I am trying to create a function in my app that will guide the user to a marker I have created. This is the code I am using, it works great, It gets the users current location and show it on the map. But how can I get a directions to a marker?

Any awnser will be helpful

class Karta: UIViewController, CLLocationManagerDelegate {
    @IBOutlet var mapView: GMSMapView!

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        //allow app to track user
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()

        //set out a marker on the map
        var marker = GMSMarker()
        marker.position = CLLocationCoordinate2DMake(56.675907, 12.858798)
        marker.appearAnimation = kGMSMarkerAnimationPop
        marker.icon = UIImage(named: "flag_icon")
        marker.map = mapView
     }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "Types Segue" {
            let navigationController = segue.destinationViewController as UINavigationController
        }
    }

    func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {

        //If map is being used
        if status == .AuthorizedWhenInUse {
            var myLocation = mapView
            locationManager.startUpdatingLocation()
            mapView.myLocationEnabled = true
            mapView.settings.myLocationButton = true
        }
    }

    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
        if let location = locations.first as? CLLocation {
            mapView.camera = GMSCameraPosition(target: location.coordinate, zoom: 15, bearing: 0, viewingAngle: 0)
          locationManager.stopUpdatingLocation()
        }
    }
}
like image 562
Dolleno Avatar asked Feb 28 '15 16:02

Dolleno


3 Answers

So i recently just solved this issue, here is my Swift 3 implementation using the latest version of Alamofire (4.3)

 func fetchMapData() { 

    let directionURL = "https://maps.googleapis.com/maps/api/directions/json?" +
        "origin=\(originAddressLat),\(originAddressLng)&destination=\(destinationAddressLat),\(destinationAddressLong)&" +
    "key=YOUROWNSERVERKEY"



    Alamofire.request(directionURL).responseJSON
        { response in

            if let JSON = response.result.value {

                let mapResponse: [String: AnyObject] = JSON as! [String : AnyObject]

                let routesArray = (mapResponse["routes"] as? Array) ?? []

                let routes = (routesArray.first as? Dictionary<String, AnyObject>) ?? [:]

                let overviewPolyline = (routes["overview_polyline"] as? Dictionary<String,AnyObject>) ?? [:]
                let polypoints = (overviewPolyline["points"] as? String) ?? ""
                let line  = polypoints

                self.addPolyLine(encodedString: line)
        }
    }

}

func addPolyLine(encodedString: String) {

    let path = GMSMutablePath(fromEncodedPath: encodedString)
    let polyline = GMSPolyline(path: path)
    polyline.strokeWidth = 5
    polyline.strokeColor = .blue
    polyline.map = whateverYourMapViewObjectIsCalled

}
like image 194
CharlieNorris Avatar answered Oct 23 '22 14:10

CharlieNorris


Disclaimer:Swift 2

 func addOverlayToMapView(){

        let directionURL = "https://maps.googleapis.com/maps/api/directions/json?origin=\(srcLocation.coordinate.latitude),\(srcLocation.coordinate.longitude)&destination=\(destLocation.coordinate.latitude),\(destLocation.coordinate.longitude)&key=Your Server Key"

        Alamofire.request(.GET, directionURL, parameters: nil).responseJSON { response in

            switch response.result {

            case .Success(let data):

                let json = JSON(data)
                print(json)

                let errornum = json["error"]


                if (errornum == true){



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

                    if routes != nil{

                        let overViewPolyLine = routes![0]["overview_polyline"]["points"].string
                        print(overViewPolyLine)
                        if overViewPolyLine != nil{

                         self.addPolyLineWithEncodedStringInMap(overViewPolyLine!)

                        }

                    }


                }

            case .Failure(let error):

                print("Request failed with error: \(error)")

            }
        }

    }

Using the points, we now create the Path from two points using fromEncodedPath

  func addPolyLineWithEncodedStringInMap(encodedString: String) {

        let path = GMSMutablePath(fromEncodedPath: encodedString)
        let polyLine = GMSPolyline(path: path)
        polyLine.strokeWidth = 5
        polyLine.strokeColor = UIColor.yellowColor()
        polyLine.map = mapView

    }
like image 8
Anish Parajuli 웃 Avatar answered Oct 23 '22 14:10

Anish Parajuli 웃


Unlike Apple's MapKit, the Google Maps SDK for iOS does not natively include a way to perform route calculations.

Instead, you need to use the Google Directions API: https://developers.google.com/maps/documentation/directions/. It is an HTTP-only API, and Google does not provide any SDK as of today, but you can easily write your own wrapper yourself, or choose one of the many options available on Github:

  • https://github.com/sudeepjaiswal/GoogleDirections
  • https://github.com/sebk/GoogleDirections
  • https://github.com/iamamused/iOS-DirectionKit
  • https://github.com/marciniwanicki/OCGoogleDirectionsAPI
  • and many others...
like image 5
Romain Avatar answered Oct 23 '22 14:10

Romain