xcode 获取当前用户所在位置的地址
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7849912/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Get the address of current user location
提问by lavitanien
I follow some tutorial and mix my awful code. Now I can get my current location. And when I tap on a button it will trigger a pin which locates on my current location. If I tap on the pin, the message shows address of my current.
我遵循一些教程并混合了我糟糕的代码。现在我可以得到我当前的位置。当我点击一个按钮时,它会触发一个位于我当前位置的图钉。如果我点击图钉,消息会显示我当前的地址。
I have two question:
我有两个问题:
Why I can not get a more precise address? Now I receive address with country, city and district, but without name of the road.
How can I get the "text" of the address of current location? I want to display the address in a UILabel elsewhere but don't know how to do that.
为什么我无法获得更准确的地址?现在我收到带有国家、城市和地区的地址,但没有道路名称。
如何获取当前位置地址的“文本”?我想在其他地方的 UILabel 中显示地址,但不知道该怎么做。
Thank you very much!
非常感谢!
here's the .h
这是.h
#import <UIKit/UIKit.h>
#import "MapKit/MapKit.h"
#import "CoreLocation/CoreLocation.h"
@interface UserLocationAddressViewController : UIViewController <MKMapViewDelegate,MKReverseGeocoderDelegate>
{
MKMapView *userLocationAddMapView;
CLLocationManager *locationManager;
}
@property (nonatomic, retain) MKMapView *userLocationAddMapView;
-(IBAction)getUserLocationAddress:(id)sender;
@end
And Here's .m
这是 .m
#import "UserLocationAddressViewController.h"
@implementation UserLocationAddressViewController
@synthesize userLocationAddMapView;
-(IBAction)getUserLocationAddress:(id)sender
{
MKReverseGeocoder *geoCoder = [[MKReverseGeocoder alloc] initWithCoordinate:locationManager.location.coordinate];
geoCoder.delegate = self;
[geoCoder start];
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
-(void)dealloc
{
[userLocationAddMapView release];
[super dealloc];
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
self.userLocationAddMapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
userLocationAddMapView.showsUserLocation = YES;
userLocationAddMapView.delegate = self;
self.userLocationAddMapView.mapType = MKMapTypeStandard;
locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];
CLLocationCoordinate2D coordinate = locationManager.location.coordinate;
MKCoordinateRegion mapRegion;
mapRegion.center = coordinate;
MKCoordinateSpan mapSpan;
mapSpan.latitudeDelta = 0.006;
mapSpan.longitudeDelta = 0.006;
mapRegion.span = mapSpan;
[userLocationAddMapView setRegion:mapRegion animated:YES];
self.userLocationAddMapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:self.userLocationAddMapView];
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Get Add" style:UIBarButtonItemStylePlain target:self action:@selector(getUserLocationAddress:)] autorelease];
}
-(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark
{
NSLog(@"placemark %f %f", placemark.coordinate.latitude, placemark.coordinate.longitude);
NSLog(@"addressDictionary %@", placemark.addressDictionary);
[userLocationAddMapView addAnnotations:[NSArray arrayWithObjects:placemark, nil]];
[geocoder release];
}
-(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error
{
NSLog(@"reverseGeocoder fail");
[geocoder release];
}
- (void)viewDidUnload
{
[super viewDidUnload];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
回答by bagwaa
You shouldn't really use MKReverseGeocoder as it has been depreciated by apple in iOS5, you should really use CLGeocoder. The following example will return a whole tonne of information which is based in the NSArray *placemarks, you can then iterate through them and call the keys in the assoc array.
你真的不应该使用 MKReverseGeocoder,因为它在 iOS5 中已经被苹果贬值了,你应该真的使用 CLGeocoder。以下示例将返回基于 NSArray *placemarks 的大量信息,然后您可以遍历它们并调用 assoc 数组中的键。
#import "MapPoint.h"
@implementation MapPoint
@synthesize coordinate, title, dateAdded, subtitle, city, reverseGeo;
-(id)initWithCoordinates:(CLLocationCoordinate2D)c
title:(NSString *)t {
self = [super init];
if (self) {
coordinate = c;
[self setTitle: t];
[self setCurrentCity: [[CLLocation alloc] initWithLatitude:c.latitude longitude:c.longitude]];
[self setDateAdded: [[NSDate alloc] init]];
}
return self;
}
-(void)setCurrentCity: (CLLocation *)loc {
if (!self.reverseGeo) {
self.reverseGeo = [[CLGeocoder alloc] init];
}
[self.reverseGeo reverseGeocodeLocation: loc completionHandler:
^(NSArray *placemarks, NSError *error) {
for (CLPlacemark *placemark in placemarks) {
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setTimeStyle:NSDateFormatterNoStyle];
[formatter setDateStyle:NSDateFormatterLongStyle];
NSString *dateString = [formatter stringFromDate: [self dateAdded]];
[self setSubtitle: [dateString stringByAppendingString: [placemark locality] ] ];
}
}];
}
@end
回答by Nilesh Kikani
Just place this delegate methods, I hope this may help you.
只需放置此委托方法,我希望这可以帮助您。
-- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
NSLog(@"MKReverseGeocoder has failed.");
}
-- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
currentLocation = [placemark.locality stringByAppendingFormat:@", "];
currentLocation = [currentLocation stringByAppendingString:placemark.country];
[indicator stopAnimating];
txtLocation.text = currentLocation;
}
回答by M to the K
I have got the same issue, MKReverseGeocoder doesn't always return the full address, beacause sometimes the coordinates is not accurate enough and the service can't generate an approximative address. In order to get best results i have implemented an other reverse geocoding against yahoo. So basically if MKReverseGeocoder (google) doesn't return a full address, i query yahoo who can generate an approximative one.
我遇到了同样的问题,MKReverseGeocoder 并不总是返回完整地址,因为有时坐标不够准确并且服务无法生成近似地址。为了获得最佳结果,我针对雅虎实施了其他反向地理编码。所以基本上如果 MKReverseGeocoder (google) 没有返回完整地址,我会查询 yahoo 谁能生成一个近似地址。
On the other hand be carreful with MKReverseGeocoder it has been deprecated in IOS 5, they recommand to use CLGeocoder instead
另一方面要小心使用 MKReverseGeocoder 它已在 IOS 5 中被弃用,他们建议改用 CLGeocoder