আপনি কীভাবে ব্যবহারকারীর বর্তমান শহরের নাম পুনরুদ্ধার করবেন?
আপনি কীভাবে ব্যবহারকারীর বর্তমান শহরের নাম পুনরুদ্ধার করবেন?
উত্তর:
আপনাকে যা করতে হবে তা হল একটি সেটআপ 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);
}
আইওএস 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";
এটি আমার পক্ষে ভাল কাজ করছে:
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);
}];
kCLErrorDomain error 8
আপনি কেন জানেন?
যদি কেউ এম কেআরসিভারসিজোডার থেকে সিএলজিওডারের দিকে যাওয়ার চেষ্টা করে থাকে তবে আমি একটি ব্লগ পোস্ট লিখেছি যা হয়ত সহায়তার হতে পারে 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;
}];
nil
, এবং বার্তাগুলির nil
ফলাফল nil
হিসাবে প্রেরণ করা হয় , পাশাপাশি ডট নোটেশনের মাধ্যমে সম্পত্তি অ্যাক্সেসের মাধ্যমে nil
। যা বলা হচ্ছে, সর্বদা চেক করা উচিত যে error
এটি অ- কিনা nil
।
আপনি 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 এ এটির প্রয়োজন হয় , আমি এটি এটি করেছিলাম:
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!)"
}
}
}
আপনার ব্যবহারকারীর বর্তমান অবস্থান পেতে হবে এবং তারপরে শহরটি সনাক্ত করতে MKReversGeocoder ব্যবহার করতে হবে।
আইফোন অ্যাপ্লিকেশন প্রোগ্রামিং গাইড , অধ্যায় 8 এর দুর্দান্ত উদাহরণ রয়েছে Once MKReversGeocodeDelegate এর জন্য ডকুমেন্টেশন পড়ুন এবং পদ্ধতিগুলি তৈরি করুন:
রিভার্সসিওকোডার: ডেইলফেইল উইথআরআর:
MKReverseGeocoder *geocoder = [[MKReverseGeocoder alloc] initWithCoordinate:newLocation.coordinate];
geocoder.delegate = self;
[geocoder start];
আপনি বর্তমান শহর পাওয়ার জন্য এই কোডটি ব্যবহার করতে পারেন: -
আপনার কন্ট্রোলারটি প্রসারিত করুন: 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
}
}
এখানে আমার ছোট সুইফট শ্রেণি যা বর্তমান অবস্থান সম্পর্কে বিপরীত জিওকোডযুক্ত তথ্য পেতে আমাকে সহায়তা করে। সম্পর্কে ভুলবেন না 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)")
}
}
// 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);
}];
}
MKReversGeocoder এর জন্য ডকুমেন্টেশন পড়ুন - ডকুমেন্টেশন, গাইড এবং নমুনা অ্যাপ্লিকেশন কোনও কারণে অ্যাপল সরবরাহ করেছে।