Convert coordinates to City name?

后端 未结 9 1156
Happy的楠姐
Happy的楠姐 2020-12-02 07:41

How to get an address from coordinates using MapKit?

I have this code when long press on the map it gets the coordinates:

func didLongPressMap(sender         


        
相关标签:
9条回答
  • 2020-12-02 08:17

    Update Swift 4

    addressDictionary was deprecated in iOS 11.0

    let geoCoder = CLGeocoder()
    let location = CLLocation(latitude: 37.769193, longitude: -122.426512)
    geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in
    
    // Place details
    var placeMark: CLPlacemark!
    placeMark = placemarks?[0]
    
    // Complete address as PostalAddress
    print(placeMark.postalAddress as Any)  //  Import Contacts
    
    // Location name
    if let locationName = placeMark.name  {
        print(locationName)
    }
    
    // Street address
    if let street = placeMark.thoroughfare {
       print(street)
    }
    
    // Country
    if let country = placeMark.country {
       print(country)
    }
    })
    

    More Data can be retrieved

    name, thoroughfare, subThoroughfare, locality, subLocality, administrativeArea, subAdministrativeArea, postalcode, isoCountryCode, country, inlandWater, areaOfInterest

    0 讨论(0)
  • 2020-12-02 08:18

    Update:

    import Foundation
    import CoreLocation
    import PlaygroundSupport
    PlaygroundPage.current.needsIndefiniteExecution = true
    
    let location = CLLocation(latitude: 37.3321, longitude: -122.0318)
    CLGeocoder().reverseGeocodeLocation(location) { placemarks, error in
    
        guard let placemark = placemarks?.first else {
            let errorString = error?.localizedDescription ?? "Unexpected Error"
            print("Unable to reverse geocode the given location. Error: \(errorString)")
            return
        }
    
        let reversedGeoLocation = ReversedGeoLocation(with: placemark)
        print(reversedGeoLocation.formattedAddress)
        // Apple Inc.,
        // 1 Infinite Loop,
        // Cupertino, CA 95014
        // United States
    }
    
    struct ReversedGeoLocation {
        let name: String            // eg. Apple Inc.
        let streetName: String      // eg. Infinite Loop
        let streetNumber: String    // eg. 1
        let city: String            // eg. Cupertino
        let state: String           // eg. CA
        let zipCode: String         // eg. 95014
        let country: String         // eg. United States
        let isoCountryCode: String  // eg. US
    
        var formattedAddress: String {
            return """
            \(name),
            \(streetNumber) \(streetName),
            \(city), \(state) \(zipCode)
            \(country)
            """
        }
    
        // Handle optionals as needed
        init(with placemark: CLPlacemark) {
            self.name           = placemark.name ?? ""
            self.streetName     = placemark.thoroughfare ?? ""
            self.streetNumber   = placemark.subThoroughfare ?? ""
            self.city           = placemark.locality ?? ""
            self.state          = placemark.administrativeArea ?? ""
            self.zipCode        = placemark.postalCode ?? ""
            self.country        = placemark.country ?? ""
            self.isoCountryCode = placemark.isoCountryCode ?? ""
        }
    }
    

    Old/Deprecated answer:

    Thanks to @Kampai's answer, here's a Swift 3 compatible and safer way (no forcing !):

    let geoCoder = CLGeocoder()
    let location = CLLocation(latitude: touchCoordinate.latitude, longitude: touchCoordinate.longitude)
    
    geoCoder.reverseGeocodeLocation(location, completionHandler: { placemarks, error in
        guard let addressDict = placemarks?[0].addressDictionary else {
            return
        }
    
        // Print each key-value pair in a new row
        addressDict.forEach { print($0) }
    
        // Print fully formatted address
        if let formattedAddress = addressDict["FormattedAddressLines"] as? [String] {
            print(formattedAddress.joined(separator: ", "))
        }
    
        // Access each element manually
        if let locationName = addressDict["Name"] as? String {
            print(locationName)
        }
        if let street = addressDict["Thoroughfare"] as? String {
            print(street)
        }
        if let city = addressDict["City"] as? String {
            print(city)
        }
        if let zip = addressDict["ZIP"] as? String {
            print(zip)
        }
        if let country = addressDict["Country"] as? String {
            print(country)
        }
    })
    

    Don't forget NSLocationWhenInUseUsageDescription and NSLocationAlwaysUsageDescription keys in Swift 3

    0 讨论(0)
  • 2020-12-02 08:23

    In didUpdateToLocation method:

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:
        (CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
        CLLocation *location = [locationManager location];
    
    
        CLLocationCoordinate2D coordinate = [location coordinate];
    
    
        latitude = [NSString stringWithFormat:@"%.12f", coordinate.latitude];
        longitude = [NSString stringWithFormat:@"%.12f", coordinate.longitude];
    
        CLLocation *location1 = [[CLLocation alloc]
                                 initWithLatitude:latitude.floatValue
                                 longitude:longitude.floatValue];
    
        self.myGeocoder = [[CLGeocoder alloc] init];
    
        [self.myGeocoder
         reverseGeocodeLocation:location1
         completionHandler:^(NSArray *placemarks, NSError *error) {
            if (error == nil &&
                 [placemarks count] > 0){
                placemark = [placemarks lastObject];
                NSString*    vendorLocation=[NSString stringWithFormat:@"%@ %@",
                                              placemark.locality,
                                              placemark.subLocality];
                NSLog(@"%@",vendorLocation);
            }
        }];
    }
    
    0 讨论(0)
提交回复
热议问题