ব্যবহারকারীর বর্তমান শহরের নাম কীভাবে পুনরুদ্ধার করবেন?


উত্তর:


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
একটি দ্রষ্টব্য: আপনাকে আইভরে লোকেশন ম্যানেজারকে স্ট্যাশ করতে হবে (এবং সম্ভবত কোনও অবস্থানের পরে আপনি এটি আবার থামিয়ে দিতে পারেন), তা না হলে তাৎক্ষণিকভাবে স্বতঃপ্রকাশ হবে এবং আপনি কোনও প্রতিনিধি কলব্যাক পাবেন না। এছাড়াও, বিপরীত জিওকোডারটির কাজ করার জন্য একটি ইন্টারনেট সংযোগ প্রয়োজন।
uliwitness

আপনি কী বলতে পারবেন কীভাবে বর্তমান শহর বা অবস্থানের শিরোনাম এবং পিনে সাবটাইটেল প্রিন্ট করবেন?
রাজু

4
@ ফ্রেড # আইম্পোর্ট <ঠিকানাবুক / ঠিকানাবুক.h>
জনাথন

18
MKReversGeoCoder ios 5.0 থেকে অবহিত করা হয়েছে
adhg

ফ্রেড, আমি আশা করি আপনি যা খুঁজে পেয়েছেন তা বলতে পারতেন ... দীর্ঘশ্বাস ফেলুন
ডেভিড

122

আইওএস 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আপনি কেন জানেন?
ম্যাক্সিম্মে

সিএলজিও কোডারকে আমার কী করতে হবে তা অঘোষিত so তাই এটি কী আমদানি করতে হবে এবং কী যুক্ত করতে পারে তা কার্যকর করতে পারে
iOS বিকাশকারী

17

যদি কেউ এম কেআরসিভারসিজোডার থেকে সিএলজিওডারের দিকে যাওয়ার চেষ্টা করে থাকে তবে আমি একটি ব্লগ পোস্ট লিখেছি যা হয়ত সহায়তার হতে পারে http://jonathanfield.me/jons-blog/clgeocoder-example.html

মূলত একটি উদাহরণ হ'ল, আপনি লোকেশন ম্যানেজার এবং সিএলজিওডার কোডগুলি তৈরি করার পরে এই কোডটি আপনার ভিউডিডলড () এ যুক্ত করুন এবং তারপরে ডেটা দেখানোর জন্য কিছু লেবেল বা পাঠ্য অঞ্চল তৈরি করুন।

  [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;



     }];

@macayer হ্যাঁ, হবে যদি খালি বিপর্যস্ত, কিন্তু খালি হবে না যদি আমি সঠিকভাবে বুঝতে। হয় 1 বা একাধিক উপাদান থাকতে পারে বা হতে পারে nil, এবং বার্তাগুলির nilফলাফল nilহিসাবে প্রেরণ করা হয় , পাশাপাশি ডট নোটেশনের মাধ্যমে সম্পত্তি অ্যাক্সেসের মাধ্যমে nil। যা বলা হচ্ছে, সর্বদা চেক করা উচিত যে errorএটি অ- কিনা nil
ভিক্টর জামামানিয়ান

4

আপনি CLLocationManager সেট আপ করার পরে আপনি অক্ষাংশ / দ্রাঘিমাংশের জুটি হিসাবে অবস্থান আপডেট পাবেন। তারপরে আপনি স্থানাঙ্কটিকে কোনও ব্যবহারকারী বান্ধব জায়গার নামতে রূপান্তর করতে সিএলজিওডার ব্যবহার করতে পারেন।

সুইফট 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()
                }
            }
        }
    }
}

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

2

আপনার ব্যবহারকারীর বর্তমান অবস্থান পেতে হবে এবং তারপরে শহরটি সনাক্ত করতে MKReversGeocoder ব্যবহার করতে হবে।

আইফোন অ্যাপ্লিকেশন প্রোগ্রামিং গাইড , অধ্যায় 8 এর দুর্দান্ত উদাহরণ রয়েছে Once MKReversGeocodeDelegate এর জন্য ডকুমেন্টেশন পড়ুন এবং পদ্ধতিগুলি তৈরি করুন:

  • রিভার্সসিওকোডার: ডিফাইন্ডপ্লেসমার্ক:
  • রিভার্সসিওকোডার: ডেইলফেইল উইথআরআর:

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

1

আপনি বর্তমান শহর পাওয়ার জন্য এই কোডটি ব্যবহার করতে পারেন: -

আপনার কন্ট্রোলারটি প্রসারিত করুন: CLLocationManagerDelegate {func লোকেশন ম্যানেজার (ম্যানেজার: CLLocationManager, doUpdateLocations অবস্থানগুলি: [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
    }
}

1

এখানে আমার ছোট সুইফট শ্রেণি যা বর্তমান অবস্থান সম্পর্কে বিপরীত জিওকোডযুক্ত তথ্য পেতে আমাকে সহায়তা করে। সম্পর্কে ভুলবেন না 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)")
    }

}

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

                   }];
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.