Using GMSAddress and GMSGeocoder to return coordinates from an address in Swift

Is there a way to get the coordinates from the entered address bar using GMS in iOS Swift? I can find examples of returning an address from coordinates (reverse geocoding?), But not vice versa. Does Google offer this service? To analyze the entered address string first, return the most appropriate actual address and, ultimately, the coordinates. Please provide a simple example or point me in the right direction. Regards, Chris

+4
source share
1 answer

As of June 2015, the iOS GMS SDK does not directly disclose this feature. However, there are two ways to get it. The first uses the Google Maps 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)
    }
}

Here you can find a full description of this method: http://www.appcoda.com/google-maps-api-tutorial/

The second way is to use CoreLocation's core kernel environment for Apple

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
    }
})
}
+5
source

All Articles