使用GMSAddress和GMSGeocoder从Swift中的Address返回坐标

时间:2015-02-17 08:40:43

标签: ios swift geocoding reverse-geocoding

有没有办法在iOS Swift中使用GMS从输入的地址字符串中获取坐标?我可以找到从坐标返回地址的示例(反向地理编码?),但不是相反。谷歌提供这项服务吗?要首先解析输入的地址字符串,返回最合适的实际地址,最后返回坐标。请提供一个简单的例子,或指出我正确的方向。此致,克里斯

1 个答案:

答案 0 :(得分:6)

截至2015年6月,GMS iOS SDK不直接公开此功能。但是,有两种方法可以实现它。第一个是使用谷歌地图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)
    }
}

您可以在此处找到此方法的完整说明:http://www.appcoda.com/google-maps-api-tutorial/

第二种方法是使用apple native CoreLocation框架

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
    }
})
}

编辑: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)")
            }

    }
}