Pertanyaan Menggunakan GMSAddress dan GMSGeocoder untuk mengembalikan Koordinat dari Alamat di Swift


Apakah ada cara untuk mendapatkan Koordinat dari string Alamat yang dimasukkan menggunakan GMS di iOS Swift? Saya dapat menemukan contoh mengembalikan Alamat dari Koordinat (geocoding terbalik?), Tetapi tidak sebaliknya. Apakah google menawarkan layanan ini? Untuk pertama-tama menguraikan string alamat yang dimasukkan, mengembalikan alamat aktual yang paling sesuai, dan akhirnya koordinat. Berikan contoh sederhana, atau tunjuk saya ke arah yang benar. Salam, Chris


4
2018-02-17 08:40


asal


Jawaban:


Pada Juni 2015, SDK iOS GMS tidak mengekspos fungsi ini secara langsung. Namun, ada dua cara untuk mendapatkannya. Yang pertama menggunakan 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)
    }
}

Anda dapat menemukan deskripsi lengkap tentang metode ini di sini: http://www.appcoda.com/google-maps-api-tutorial/

Cara kedua adalah dengan menggunakan framework 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
    }
})
}

5
2018-06-14 16:56