उपयोगकर्ता के वर्तमान शहर का नाम कैसे पुनः प्राप्त करें?


जवाबों:


107

आपको जो करना है वह सेटअप करना है CLLocationManagerजिससे आपके वर्तमान निर्देशांक मिलेंगे। वर्तमान निर्देशांक के साथ आपको MKReverseGeoCoderअपना स्थान खोजने के लिए उपयोग करने की आवश्यकता है ।

- (void)viewDidLoad 
{  
    // this creates the CCLocationManager that will find your current location
    CLLocationManager *locationManager = [[[CLLocationManager alloc] init] autorelease];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
    [locationManager startUpdatingLocation];
}

// this delegate is called when the app successfully finds your current location
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{
    // this creates a MKReverseGeocoder to find a placemark using the found coordinates
    MKReverseGeocoder *geoCoder = [[MKReverseGeocoder alloc] initWithCoordinate:newLocation.coordinate];
    geoCoder.delegate = self;
    [geoCoder start];
}

// this delegate method is called if an error occurs in locating your current location
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 
{
 NSLog(@"locationManager:%@ didFailWithError:%@", manager, error);
}

// this delegate is called when the reverseGeocoder finds a placemark
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark
{
    MKPlacemark * myPlacemark = placemark;
    // with the placemark you can now retrieve the city name
    NSString *city = [myPlacemark.addressDictionary objectForKey:(NSString*) kABPersonAddressCityKey];
}

// this delegate is called when the reversegeocoder fails to find a placemark
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error
{
    NSLog(@"reverseGeocoder:%@ didFailWithError:%@", geocoder, error);
}

9
एक नोट: आपको एक आइवर में स्थान प्रबंधक को रोकना होगा (और शायद एक बार स्थान प्राप्त करने के बाद इसे फिर से रोक दें), अन्यथा यह तुरंत ऑटोरिल्ड हो जाएगा और आपको कोई प्रतिनिधि कॉलबैक प्राप्त नहीं होगा। इसके अलावा, रिवर्स जियोकोडर को काम करने के लिए इंटरनेट कनेक्शन की आवश्यकता होती है।
19

क्या आप मुझसे कह सकते हैं कि कैसे पिन पर शीर्षक और उपशीर्षक में करंट सिटी या लोकेशन प्रिंट करें ???
राजू

1
@ फ्रेड #import <एड्रेसबुक / एड्रेसबुक.एच>
जोनाथन

18
MKReverseGeoCoder ios 5.0 के बाद से हटा दिया गया है
adhg

फ्रैड, काश आप कह सकते हैं कि आपको क्या पता चला ... आह
डेविड

122

जैसा कि iOS 5 MKReverseGeoCoderडिप्रेस्ड है!

आप उपयोग करना चाहते तो CLGeocoderसाथ CLLocationManager, बहुत ही सरल और ब्लॉक के साथ काम करता है।

उदाहरण:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
   [self.locationManager stopUpdatingLocation];

   CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
    [geoCoder reverseGeocodeLocation:newLocation
                   completionHandler:^(NSArray *placemarks, NSError *error) {
                       for (CLPlacemark *placemark in placemarks) {
                           .... = [placemark locality];
                       }
                   }];
}

संपादित करें: एक for inलूप के बजाय आप यह भी कर सकते हैं:

NSString *locString = placemarks.count ? [placemarks.firstObject locality] : @"Not Found";

28

यह मेरे लिए ठीक काम कर रहा है:

CLGeocoder *geocoder = [[CLGeocoder alloc] init] ;
[geocoder reverseGeocodeLocation:self.locationManager.location
               completionHandler:^(NSArray *placemarks, NSError *error) {
                   NSLog(@"reverseGeocodeLocation:completionHandler: Completion Handler called!");

                   if (error){
                       NSLog(@"Geocode failed with error: %@", error);
                       return;

                   }


                   CLPlacemark *placemark = [placemarks objectAtIndex:0];

                   NSLog(@"placemark.ISOcountryCode %@",placemark.ISOcountryCode);
                   NSLog(@"placemark.country %@",placemark.country);
                   NSLog(@"placemark.postalCode %@",placemark.postalCode);
                   NSLog(@"placemark.administrativeArea %@",placemark.administrativeArea);
                   NSLog(@"placemark.locality %@",placemark.locality);
                   NSLog(@"placemark.subLocality %@",placemark.subLocality);
                   NSLog(@"placemark.subThoroughfare %@",placemark.subThoroughfare);

               }];

यह एक सरणी क्यों लौटाता है? अजीब। फिर भी धन्यवाद।
एडम वेट

यह स्लीक है, लव ब्लॉक्स है। मुझे यकीन है कि ऑब्जेक्टटाइंडेक्स बनाने के लिए स्थान-चिह्न सरणी पर एक सशर्त रखा जाएगा: 0 वास्तव में मौजूद है।
कैपिकॉ

4
नमस्कार मुझे एक त्रुटि kCLErrorDomain error 8हो रही है क्या आप जानते हैं कि क्यों?
मैक्सिमम

CLGeoCoder अघोषित है कि मुझे क्या करना है इसलिए यह काम कर सकता है कि क्या आयात करना है और क्या जोड़ना है
iOS डेवलपर

16

अगर कोई MKReverseGeocoder से CLGeocoder पर जाने की कोशिश कर रहा है, तो मैंने एक ब्लॉग पोस्ट लिखी है जो http://jonathanfield.me/jons-blog/clgeocoder-example.html की मदद से हो सकती है

मूल रूप से एक उदाहरण होगा, जब आपने स्थान प्रबंधक और CLGeocoder ऑब्जेक्ट बनाए हैं, तो इस कोड को अपने viewDidLoad () में जोड़ें और फिर डेटा दिखाने के लिए कुछ लेबल या टेक्स्ट क्षेत्र बनाएं।

  [super viewDidLoad];
    locationManager.delegate = self;
    [locationManager startUpdatingLocation];

    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
    [self.CLGeocoder reverseGeocodeLocation: locationManager.location completionHandler: 
     ^(NSArray *placemarks, NSError *error) {


         CLPlacemark *placemark = [placemarks objectAtIndex:0];


             isoCountryCode.text = placemark.ISOcountryCode;
             country.text = placemark.country;
             postalCode.text= placemark.postalCode;
             adminArea.text=placemark.administrativeArea;
             subAdminArea.text=placemark.subAdministrativeArea;
             locality.text=placemark.locality;
             subLocality.text=placemark.subLocality;
             thoroughfare.text=placemark.thoroughfare;
             subThoroughfare.text=placemark.subThoroughfare;
             //region.text=placemark.region;



     }];

@ मिसेयर हां, अगर खाली होगा तो दुर्घटनाग्रस्त हो जाएगा, लेकिन अगर मैं सही तरीके से समझूं तो कभी खाली नहीं होगा। इसमें या तो 1 या अधिक तत्व होंगे nil, या nilपरिणाम के लिए भेजे गए संदेश, और nilसाथ ही डॉट नोटेशन के माध्यम से संपत्ति का उपयोग होगा nil। यही कारण है कि किया जा रहा है ने कहा, हमेशा की जाँच करनी चाहिए अगर errorगैर है nil
विक्टर ज़ामेनिया

3

अगर किसी को स्विफ्ट 3 में इसकी आवश्यकता है , तो मैंने इसे कैसे किया:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    let location = locations.first!
    let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, 500, 500)

    self.location = location
    self.locationManager?.stopUpdatingLocation()

    // Drop a pin at user's Current Location
    let myAnnotation: MKPointAnnotation = CustomPointAnnotation()
    myAnnotation.coordinate = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
    myAnnotation.title = "Localização"
    self.mapViewMK.addAnnotation(myAnnotation)

    self.mapViewMK.setRegion(coordinateRegion, animated: true)
    self.locationManager?.stopUpdatingLocation()
    self.locationManager = nil

    // Get user's current location name
    let geocoder = CLGeocoder()
    geocoder.reverseGeocodeLocation(self.location!) { (placemarksArray, error) in

        if (placemarksArray?.count)! > 0 {

            let placemark = placemarksArray?.first
            let number = placemark!.subThoroughfare
            let bairro = placemark!.subLocality
            let street = placemark!.thoroughfare

            self.addressLabel.text = "\(street!), \(number!) - \(bairro!)"
        }
    }
}

3

CLLocationManager सेटअप करने के बाद आपको अक्षांश / देशांतर जोड़ी के रूप में स्थान अपडेट मिलेगा। फिर आप निर्देशांक को उपयोगकर्ता के अनुकूल स्थान के नाम में परिवर्तित करने के लिए CLGeocoder का उपयोग कर सकते हैं।

यहां स्विफ्ट 4 में नमूना कोड है ।

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let lastLocation = locations.last {
        let geocoder = CLGeocoder()

        geocoder.reverseGeocodeLocation(lastLocation) { [weak self] (placemarks, error) in
            if error == nil {
                if let firstLocation = placemarks?[0],
                    let cityName = firstLocation.locality { // get the city name
                    self?.locationManager.stopUpdatingLocation()
                }
            }
        }
    }
}

2

आपको उपयोगकर्ता का वर्तमान स्थान प्राप्त करना होगा और फिर शहर को पहचानने के लिए MKReverseGeocoder का उपयोग करना होगा।

IPhone ऐप प्रोग्रामिंग गाइड , अध्याय 8 में बहुत अच्छा उदाहरण है । एक बार जब आपको लोकेशन जियोकोडर मिल जाए, तो प्रतिनिधि को सेट करें और देश को स्थान-चिह्न से पढ़ें। MKReverseGeocodeDelegate के लिए प्रलेखन पढ़ें और तरीके बनाएँ:

  • reverseGeocoder: didFindPlacemark:
  • reverseGeocoder: didFailWithError:

    MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:newLocation.coordinate];
    geocoder.delegate = self;
    [geocoder start];

1

आप वर्तमान शहर प्राप्त करने के लिए इस कोड का उपयोग कर सकते हैं: -

विस्तार YourController: CLLocationManagerDelegate {func locationManager (प्रबंधक: CLLocationManager, didUpdateLocations स्थान: [CLLocation]) {

    CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in

        if (error != nil)
        {
            manager.stopUpdatingLocation()
            return
        }
        else
        {
            if placemarks!.count > 0
            {
                let placeMarksArrray: NSArray = placemarks!
                let pm = placeMarksArrray[0] as! CLPlacemark
                self.displayLocationInfo(pm)
                manager.stopUpdatingLocation()
            } else
            {
                print("Problem with the data received from geocoder")
            }
        }
    })
}

func displayLocationInfo(placemark: CLPlacemark!) {
    if (placemark != nil) {
        //stop updating location to save battery life
        locationLocation.stopUpdatingLocation()
        var tempString : String = ""
        if(placemark.locality != nil){
            tempString = tempString +  placemark.locality! + " "
            print(placemark.locality)
        }
        if(placemark.postalCode != nil){
            tempString = tempString +  placemark.postalCode! + " "
            print(placemark.postalCode)
        }
        if(placemark.administrativeArea != nil){
            tempString = tempString +  placemark.administrativeArea! + " "
            print(placemark.administrativeArea)
        }
        if(placemark.country != nil){
            tempString = tempString +  placemark.country! + " "



        }
        let dictForaddress = placemark.addressDictionary as! NSDictionary


        if let city = dictForaddress["City"] {
            print(city)



        }
        strLocation = tempString
    }
}

0
// place the function code below in desire location in program.

// [self getCurrentLocation];



-(void)getCurrentLocation
{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init] ;
    [geocoder reverseGeocodeLocation:self->locationManager.location
                   completionHandler:^(NSArray *placemarks, NSError *error) {
                       NSLog(@"reverseGeocodeLocation:completionHandler: Completion Handler called!");

                       if (error){
                           NSLog(@"Geocode failed with error: %@", error);
                           return;

                       }


                       CLPlacemark *placemark = [placemarks objectAtIndex:0];

                       NSLog(@"placemark.ISOcountryCode %@",placemark.ISOcountryCode);
                       NSLog(@"placemark.country %@",placemark.country);
                        NSLog(@"placemark.locality %@",placemark.locality );
                       NSLog(@"placemark.postalCode %@",placemark.postalCode);
                       NSLog(@"placemark.administrativeArea %@",placemark.administrativeArea);
                       NSLog(@"placemark.locality %@",placemark.locality);
                       NSLog(@"placemark.subLocality %@",placemark.subLocality);
                       NSLog(@"placemark.subThoroughfare %@",placemark.subThoroughfare);

                   }];
}

0

यहां मेरी छोटी स्विफ्ट क्लास है जो मुझे वर्तमान स्थान के बारे में रिवर्स जियोकोडेड जानकारी प्राप्त करने में मदद करती है। NSLocationWhenInUseUsageDescriptionक्षेत्र के बारे में मत भूलना Info.plist

class CurrentPlacemarkUpdater: NSObject, CLLocationManagerDelegate {

    private let locationManager = CLLocationManager()
    private let geocoder = CLGeocoder()

    private(set) var latestPlacemark: CLPlacemark?
    var onLatestPlacemarkUpdate: (() -> ())?
    var shouldStopOnUpdate: Bool = true

    func start() {
        locationManager.requestWhenInUseAuthorization()
        locationManager.desiredAccuracy = kCLLocationAccuracyKilometer
        locationManager.delegate = self
        locationManager.startUpdatingLocation()
    }

    func stop() {
        locationManager.stopUpdatingLocation()
    }

    fileprivate func updatePlacemark(for location: CLLocation) {
        geocoder.reverseGeocodeLocation(location) { [weak self] placemarks, error in
            if let placemark = placemarks?.first {
                self?.latestPlacemark = placemark
                self?.onLatestPlacemarkUpdate?()
                if self?.shouldStopOnUpdate ?? false {
                    self?.stop()
                }
            }
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = locations.last {
            updatePlacemark(for: location)
        }
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("CurrentPlacemarkUpdater: \(error)")
    }

}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.