Как получить адрес из координаты

Я хочу получить адрес из координаты. Я прикрепил свой код ниже..

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let lastLocation = locations.last!
    let latvalue     = lastLocation.coordinate.latitude
    let lngvalue     = lastLocation.coordinate.longitude
    self.db_latvalue = latvalue
    self.db_lngvalue = lngvalue
    let location = CLLocation(latitude: latvalue, longitude:lngvalue)
    let address = CLGeocoder.init()
    address.reverseGeocodeLocation(CLLocation.init(latitude: latvalue, longitude:lngvalue)) { (places, error) in
        if error == nil{
            if let place = places{
                   print("addressshowingssq \(place)")
                self.db_address = "\(place)"

            }
        }
    }

Вывод:

[L-30 2nd A Main Road, L-30 2nd A Main Road, HSR Layout, Бангалор, Карнатака 560102, Индия @ ‹+12.91597974, +77.62879254> +/- 100,00 м, регион CLCircularRegion (идентификатор: '+12.91597974, +77.62879254> радиус 70,94 ', центр:‹+12.91597974,+77.62879254>, радиус: 70,94 м)]

Мне нужен только адрес, указанный ниже

L-30 2nd A Main Road, L-30 2nd A Main Road, HSR Layout, Бангалор, Карнатака 560102

Я исследовал Google, у меня было другое решение, поэтому я запутался.


person Gowthaman M    schedule 12.10.2018    source источник
comment
Пожалуйста, покажите решения, которые вы пытались получить, чтобы получить адресную часть. Вы читали документацию для CLPlacemark? Первым делом всегда следует обращаться к документации Apple.   -  person Ashley Mills    schedule 12.10.2018
comment
см. это для справки: stackoverflow.com/questions/41358423/   -  person Anbu.Karthik    schedule 12.10.2018
comment
place — это объект CLPlacemark, вы можете посмотреть на его свойство, а не использовать его полностью. Нравится place.address?   -  person Larme    schedule 12.10.2018


Ответы (4)


Обновлять

Я внес несколько изменений в решение iVarun's. Это проще. и работает.

Сначала добавьте эту функцию:

func geocode(latitude: Double, longitude: Double, completion: @escaping (CLPlacemark?, Error?) -> ())  {
    CLGeocoder().reverseGeocodeLocation(CLLocation(latitude: latitude, longitude: longitude)) { completion($0?.first, $1) }
}

После этого получите адрес:

geocode(latitude: latvalue, longitude: lngvalue) { placemark, error in
    guard let placemark = placemark, error == nil else { return }
    // you should always update your UI in the main thread
    DispatchQueue.main.async {
        //  update UI here
        print("address1:", placemark.thoroughfare ?? "")
        print("address2:", placemark.subThoroughfare ?? "")
        print("city:",     placemark.locality ?? "")
        print("state:",    placemark.administrativeArea ?? "")
        print("zip code:", placemark.postalCode ?? "")
        print("country:",  placemark.country ?? "")
    }
}

Результат:

address1: Rua Casuarina
address2: 443
city: Rio de Janeiro
state: RJ
zip code: 20975
country: Brazil

Как указал @iOSer, CLPlacemark может дать вам эту часть строки, однако.

Вы можете разделить строку:

let output:String = "[L-30 2nd A Main Road, L-30 2nd A Main Road, HSR Layout, Bengaluru, Karnataka 560102, India @ <+12.91597974,+77.62879254> +/- 100.00m, region CLCircularRegion (identifier:'<+12.91597974,+77.62879254> radius 70.94', center:<+12.91597974,+77.62879254>, radius:70.94m)]"
let items = output.components(separatedBy: "@")
print(items[0])

Поскольку @ будет всегда включаться, остальное можно пропустить.

Результат: R

person excitedmicrobe    schedule 12.10.2018
comment
@ по состоянию на At обязательно будет включен всегда, если вы используете это в качестве вывода. попробуйте другие места и посмотрите, есть ли у него @ или нет - person excitedmicrobe; 12.10.2018
comment
Что означает L-30? Зачем тебе дважды L-30 A Main Road? Также использование description объекта (это то, что делает "\(place)") НЕ рекомендуется, поскольку Apple может изменить его в следующей версии iOS. - person Larme; 12.10.2018
comment
@Larme, на данный момент; это путь; также я предоставил два варианта - person excitedmicrobe; 12.10.2018
comment
Я не согласен с этим методом. Я совсем не уверен в этом, поскольку @ всегда будет включен, остальное можно пропустить. слишком. Кроме того, завтра Apple может изменить порядок. - person Larme; 12.10.2018
comment
@ Ларме. Я обновлю свой код, если «Apple отменит» свой код завтра - person excitedmicrobe; 12.10.2018

Надеюсь, что это поможет вам:

address.reverseGeocodeLocation(CLLocation.init(latitude: latvalue, longitude:lngvalue)) { (places, error) in
            if error == nil{
                let placeMark = places! as [CLPlacemark]

                if placeMark.count > 0 {
                    let placeMark = places![0]
                    var addressString : String = ""

                    if placeMark.subThoroughfare != nil {
                        addressString = addressString + placeMark.subThoroughfare! + ", "
                    }
                    if placeMark.thoroughfare != nil {
                        addressString = addressString + placeMark.thoroughfare! + ", "
                    }
                    if placeMark.subLocality != nil {
                        addressString = addressString + placeMark.subLocality! + ", "
                    }

                    if placeMark.locality != nil {
                        addressString = addressString + placeMark.locality! + ", "
                    }
                    if placeMark.administrativeArea != nil {
                        addressString = addressString + placeMark.administrativeArea! + ", "
                    }
                    if placeMark.country != nil {
                        addressString = addressString + placeMark.country! + ", "
                    }
                    if placeMark.postalCode != nil {
                        addressString = addressString + placeMark.postalCode! + " "
                    }

                    print(addressString)
                }
            }
        }

Вывод:

L-30, 2nd A Main Road, HSR Layout, Бангалор, Карнатака, Индия, 560102

person iVarun    schedule 12.10.2018
comment
Спасибо, сэр ... я устал от вашего ответа, это тоже работает нормально ... в будущем, я думаю, мне придется использовать ваш ответ ... - person Gowthaman M; 12.10.2018
comment
@GowthamanM Отлично, это сработало для вас. Почему тогда вы приняли другой ответ? как вы сказали, вы собираетесь использовать мой ответ в будущем. - person iVarun; 12.10.2018
comment
@GowthamanM Вы должны принять код для проверки на будущее, а не простой, поскольку вы сказали, что собираетесь использовать мой код в будущем. В любом случае оба ответа верны. - person iVarun; 12.10.2018

Свифт 3

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let locValue:CLLocationCoordinate2D = manager.location!.coordinate
    let objLocation = CLLocation(latitude: locValue.latitude, longitude: locValue.longitude)
    CLGeocoder().reverseGeocodeLocation(objLocation) { (placemarksArray, error) in
        if error != nil {
            print("Reverse geocoder failed with error" + (error?.localizedDescription)!)
            return
        }
        if (placemarksArray?.count)! > 0 {
            let objPlacemark = placemarksArray?[0]
            self.generateAddress(objPlacemark: objPlacemark!)
            self.locationManager?.stopUpdatingLocation()
            self.locationManager = nil
        }
        else {
            print("Problem with the data received from geocoder")
        }
    }
}

Функция Разбор метки в строку...

func generateAddress(objPlacemark : CLPlacemark) -> String {

    print("objPlacemark : \(objPlacemark.description)")
    var completeAddress = ""

    if objPlacemark.name != nil {
        completeAddress = String(describing: objPlacemark.name!)
    }

    if objPlacemark.thoroughfare != nil && (objPlacemark.name != objPlacemark.thoroughfare) {
        completeAddress = completeAddress + ", " + String(describing: objPlacemark.thoroughfare!)
    }

    if objPlacemark.subThoroughfare != nil {
        completeAddress = completeAddress + ", " + String(describing: objPlacemark.subThoroughfare!)
    }

    if objPlacemark.subLocality != nil {
        completeAddress = completeAddress + "," + String(describing: objPlacemark.subLocality!)
    }

    if objPlacemark.locality != nil {
        completeAddress = String(describing: objPlacemark.locality!)
    }

    if objPlacemark.postalCode != nil {
        completeAddress = completeAddress + "," + String(describing: objPlacemark.postalCode!)
    }

    if objPlacemark.administrativeArea != nil {
        completeAddress = completeAddress + "," +  String(describing: objPlacemark.administrativeArea!)
    }

    if objPlacemark.isoCountryCode != nil {
        completeAddress = completeAddress + "," + String(describing: objPlacemark.isoCountryCode!)
    }

    print("completeAddress : \(completeAddress)")
    return completeAddress
}
person Vinaykrishnan    schedule 12.10.2018
comment
Пожалуйста, попробуйте добавить свои комментарии для понижения, так как это сайт вопросов и ответов, у каждого есть возможность улучшить. Спасибо - person Vinaykrishnan; 12.10.2018
comment
@GowthamanM, комментарий предназначен для человека, который проголосовал против без каких-либо объяснений. - person Vinaykrishnan; 12.10.2018

CLGeocodeCompletionHandler содержит массив CLPlacemark. Вы можете получить доступ к его свойствам, таким как name, locality, isoCountryCode и т. д., чтобы сформировать полный адрес!!

person iOSer    schedule 12.10.2018