Is there a way to get the Coordinates from an entered Address string using GMS in iOS Swift? I can find examples of returning an Address from Coordinates (reverse geocoding?), but not the other way around. Does google offer this service? To first parse the entered address string, return the most suitable actual address, and ultimately the coordinates. Please provide a simple example, or point me in the right direction. Regards, Chris
As of June 2015, GMS iOS SDK does not expose this functionality directly. However, there are two ways to get it. First one is using Google Maps Web API.
let baseURLGeocode = "https://maps.googleapis.com/maps/api/geocode/json?"
func geocodeAddress(address: String!, withCompletionHandler completionHandler: ((status: String, success: Bool) -> Void)) {
    if let lookupAddress = address {
        var geocodeURLString = baseURLGeocode + "address=" + lookupAddress
        geocodeURLString = geocodeURLString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
        let geocodeURL = NSURL(string: geocodeURLString)
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            let geocodingResultsData = NSData(contentsOfURL: geocodeURL!)
            var error: NSError?
            let dictionary: Dictionary<NSObject, AnyObject> = NSJSONSerialization.JSONObjectWithData(geocodingResultsData!, options: NSJSONReadingOptions.MutableContainers, error: &error) as Dictionary<NSObject, AnyObject>
            if (error != nil) {
                println(error)
                completionHandler(status: "", success: false)
            }
            else {
                // Get the response status.
                let status = dictionary["status"] as String
                if status == "OK" {
                    let allResults = dictionary["results"] as Array<Dictionary<NSObject, AnyObject>>
                    self.lookupAddressResults = allResults[0]
                    // Keep the most important values.
                    self.fetchedFormattedAddress = self.lookupAddressResults["formatted_address"] as String
                    let geometry = self.lookupAddressResults["geometry"] as Dictionary<NSObject, AnyObject>
                    self.fetchedAddressLongitude = ((geometry["location"] as Dictionary<NSObject, AnyObject>)["lng"] as NSNumber).doubleValue
                    self.fetchedAddressLatitude = ((geometry["location"] as Dictionary<NSObject, AnyObject>)["lat"] as NSNumber).doubleValue
                    completionHandler(status: status, success: true)
                }
                else {
                    completionHandler(status: status, success: false)
                }
            }
        })
    }
    else {
        completionHandler(status: "No valid address.", success: false)
    }
}
You can find the complete description of this method here: http://www.appcoda.com/google-maps-api-tutorial/
Second way is to use apple native CoreLocation framework
func geoLocate(address:String!){
let gc:CLGeocoder = CLGeocoder()
gc.geocodeAddressString(address, completionHandler: { (placemarks: [AnyObject]!, error: NSError!) -> Void in
    let pm = placemarks as! [CLPlacemark]
    if (placemarks.count > 0){
        let p = pm[0]
        var myLatitude = p.location.coordinate.latitude
        var myLongtitude = p.location.coordinate.longitude
        //do your stuff
    }
})
}
EDIT: Swift 4.2
func geoLocate(address:String!){
        let gc:CLGeocoder = CLGeocoder()
        gc.geocodeAddressString(address) { (placemarks, error) in
            if ((placemarks?.count)! > 0){
                let p = placemarks![0]
                print("Lat: \(p.location?.coordinate.latitude) Lon: \(p.location?.coordinate.longitude)")
            }
    }
} 
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With