ios - हाल ही में बदले गए शहरों के नाम




निर्देशांक को शहर के नाम में बदलें? (6)

MapKit का उपयोग करके निर्देशांक से एक पता कैसे प्राप्त करें?

मेरे पास यह कोड है जब मानचित्र पर लंबे समय तक इसे निर्देशांक मिलता है:

func didLongPressMap(sender: UILongPressGestureRecognizer) {

    if sender.state == UIGestureRecognizerState.Began {
        let touchPoint = sender.locationInView(self.mapView)
        let touchCoordinate = self.mapView.convertPoint(touchPoint, toCoordinateFromView: self.mapView)
        var annotation = MKPointAnnotation()
        annotation.coordinate = touchCoordinate
        annotation.title = "Your position"
        self.mapView.addAnnotation(annotation) //drops the pin
        println("lat:  \(touchCoordinate.latitude)")
        var num = (touchCoordinate.latitude as NSNumber).floatValue
        var formatter = NSNumberFormatter()
        formatter.maximumFractionDigits = 4
        formatter.minimumFractionDigits = 4
        var str = formatter.stringFromNumber(num)
        println("long: \(touchCoordinate.longitude)")
        var num1 = (touchCoordinate.longitude as NSNumber).floatValue
        var formatter1 = NSNumberFormatter()
        formatter1.maximumFractionDigits = 4
        formatter1.minimumFractionDigits = 4
        var str1 = formatter1.stringFromNumber(num1)
        self.adressLoLa.text = "\(num),\(num1)"
                }
}

और मैं annotation.title में प्रिंट करना चाहता हूं। पूरा पता (सड़क, शहर, ज़िप, देश)।


स्विफ्ट 4.2: EDIT

MapKit फ्रेमवर्क निर्देशांक से पता विवरण प्राप्त करने का एक तरीका प्रदान करता है।

आपको मानचित्र किट के रिवर्स जियोकोडिंग का उपयोग करने की आवश्यकता है। CLGeocoder वर्ग का उपयोग स्थान और पते से स्थान (निर्देशांक) प्राप्त करने के लिए किया जाता है। विधि reverseGeocodeLocation निर्देशांक से पता विवरण लौटाएगा।

यह विधि CLLocation को एक पैरामीटर के रूप में स्वीकार करती है और CLPlacemark , जिसमें पता शब्दकोश होता है।

तो अब उपरोक्त विधि इस प्रकार अपडेट की जाएगी:

@objc func didLongPressMap(sender: UILongPressGestureRecognizer) {

    if sender.state == UIGestureRecognizer.State.began {
        let touchPoint = sender.location(in: mapView)
        let touchCoordinate = mapView.convert(touchPoint, toCoordinateFrom: self.mapView)
        let annotation = MKPointAnnotation()
        annotation.coordinate = touchCoordinate
        annotation.title = "Your position"
        mapView.addAnnotation(annotation) //drops the pin
        print("lat:  \(touchCoordinate.latitude)")
        let num = touchCoordinate.latitude as NSNumber
        let formatter = NumberFormatter()
        formatter.maximumFractionDigits = 4
        formatter.minimumFractionDigits = 4
        _ = formatter.string(from: num)
        print("long: \(touchCoordinate.longitude)")
        let num1 = touchCoordinate.longitude as NSNumber
        let formatter1 = NumberFormatter()
        formatter1.maximumFractionDigits = 4
        formatter1.minimumFractionDigits = 4
        _ = formatter1.string(from: num1)
        self.adressLoLa.text = "\(num),\(num1)"

        // Add below code to get address for touch coordinates.
        let geoCoder = CLGeocoder()
        let location = CLLocation(latitude: touchCoordinate.latitude, longitude: touchCoordinate.longitude)
        geoCoder.reverseGeocodeLocation(location, completionHandler:
            {
                placemarks, error -> Void in

                // Place details
                guard let placeMark = placemarks?.first else { return }

                // Location name
                if let locationName = placeMark.location {
                    print(locationName)
                }
                // Street address
                if let street = placeMark.thoroughfare {
                    print(street)
                }
                // City
                if let city = placeMark.subAdministrativeArea {
                    print(city)
                }
                // Zip code
                if let zip = placeMark.isoCountryCode {
                    print(zip)
                }
                // Country
                if let country = placeMark.country {
                    print(country)
                }
        })
    }
}

अद्यतन स्विफ्ट 4

पताका को iOS 11.0 में deprecated दिया गया था

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

अधिक डेटा पुनर्प्राप्त किया जा सकता है

नाम, पुस्‍तक, सबटूरॉफ़फ़ेयर, इलाका, उप-समुदाय, प्रशासनिक क्षेत्र, उप-सहयोगी, डाक, कोड, isoCountryCode, देश, अंतर्देशीय, क्षेत्र


धन्यवाद @Kampai उनके जवाब के लिए, मैंने थोड़ा संशोधित किया तो यह Swift 1.2 साथ काम करता है:

        var geocoder = CLGeocoder()
        var location = CLLocation(latitude: IC.coordinate!.latitude, longitude: IC.coordinate!.longitude)
        geocoder.reverseGeocodeLocation(location) {
            (placemarks, error) -> Void in
            if let placemarks = placemarks as? [CLPlacemark] where placemarks.count > 0 {
                var placemark = placemarks[0]
                println(placemark.addressDictionary)
        }

परिणाम:

[उपमंडल: सिडनी, स्ट्रीट: 141 हैरिंगटन स्ट्रीट, राज्य: NSW, सबट्रूफ़फ़ाइट: 141, कंट्रीकोड: AU, ज़िप: 2000, थ्रॉफ़फ़ाइट: हैरिंगटन स्ट्रीट, नाम: 141 हैरिंगटन स्ट्रीट, देश: ऑस्ट्रेलिया, FormattedAddressLines: ("141 हैरिंगटन स्ट्रीट" , "द रॉक्स एनएसडब्ल्यू 2000", ऑस्ट्रेलिया), सिटी: द रॉक्स]


में किया था:

- (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);
        }
    }];
}

स्विफ्ट 3 के लिए: और स्विफ्ट 4

पहले आपको info.plist में उपयोगकर्ता के जीपीएस प्राप्त करने के लिए भत्ता निर्धारित करने की आवश्यकता है।

सेट करें: एक यादृच्छिक स्ट्रिंग के साथ NSLocationWhenInUseUsageDescription । और / या: एक यादृच्छिक स्ट्रिंग के साथ NSLocationAlwaysUsageDescription

फिर मैंने ज़िप, शहर, देश जैसे वांछित डेटा प्राप्त करने के लिए एक वर्ग स्थापित किया है ...:

import Foundation
import MapKit

typealias JSONDictionary = [String:Any]

class LocationServices {

    let shared = LocationServices()
    let locManager = CLLocationManager()
    var currentLocation: CLLocation!

    let authStatus = CLLocationManager.authorizationStatus()
    let inUse = CLAuthorizationStatus.authorizedWhenInUse
    let always = CLAuthorizationStatus.authorizedAlways

    func getAdress(completion: @escaping (_ address: JSONDictionary?, _ error: Error?) -> ()) {

        self.locManager.requestWhenInUseAuthorization()

        if self.authStatus == inUse || self.authStatus == always {

            self.currentLocation = locManager.location

            let geoCoder = CLGeocoder()

            geoCoder.reverseGeocodeLocation(self.currentLocation) { placemarks, error in

                if let e = error {

                    completion(nil, e)

                } else {

                    let placeArray = placemarks as? [CLPlacemark]

                    var placeMark: CLPlacemark!

                    placeMark = placeArray?[0]

                    guard let address = placeMark.addressDictionary as? JSONDictionary else {
                        return
                    }

                    completion(address, nil)

                }

            }

        }

    }

}

के द्वारा बुलाया गया:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        LocationServices.shared.getAdress { address, error in

            if let a = address, let city = a["City"] as? String {
               //
            }

        }

    }

}

किया हुआ


स्विफ्ट 4.2 इसे जितना संभव हो सके उतना सरल रखें, Apple doc और इसे आवश्यकतानुसार संशोधित करें:

func retreiveCityName(lattitude: Double, longitude: Double, completionHandler: @escaping (String?) -> Void)
{
    let geocoder = CLGeocoder()
    geocoder.reverseGeocodeLocation(CLLocation(latitude: latitude, longitude: longitude), completionHandler:
    {
        placeMarks, error in

        completionHandler(placeMarks?.first?.locality)
     })
}






clplacemark