获取当前用户位置的地址

时间:2011-10-21 13:15:24

标签: iphone objective-c xcode android-mapview userlocation

我遵循一些教程并混合我可怕的代码。现在我可以获得我当前的位置。当我点击一个按钮时,它会触发一个位于我当前位置的引脚。如果我点击该引脚,该消息会显示我当前的地址。

我有两个问题:

  1. 为什么我无法获得更精确的地址?现在我收到了国家,城市和地区的地址,但没有道路名称。

  2. 如何获取当前位置地址的“文本”?我想在其他地方的UILabel中显示地址,但不知道该怎么做。

  3. 非常感谢!

    这是.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
    

    这是.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
    

3 个答案:

答案 0 :(得分:6)

你不应该真的使用MKReverseGeocoder,因为在iOS5中苹果已经折旧了,你应该真的使用CLGeocoder。以下示例将返回基于NSArray *地标的一整吨信息,然后您可以遍历它们并调用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

答案 1 :(得分:3)

只需放置此委托方法,我希望这对您有帮助。

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

}

答案 2 :(得分:1)

我遇到了同样的问题,MKReverseGeocoder并不总是返回完整的地址,因为有时坐标不够准确,服务无法生成近似地址。 为了获得最佳效果,我已经针对雅虎实施了其他反向地理编码。所以基本上如果MKReverseGeocoder(google)没有返回完整的地址,我会查询可以生成近似地址的雅虎。

另一方面,对于MKReverseGeocoder,它已经在IOS 5中被弃用,他们建议改用CLGeocoder