读书频道 > 网站 > 网页设计 > iOS 5编程入门经典(第3版)——开发iPhone与iPad应用
20.2.6 逆地理编码
12-11-08    奋斗的小年轻
收藏    我要投稿   
本书面向iPhone和iPad开发初学者,涵盖了iOS开发的各个主题。本书的编写方式是渐进式的,这样读者就不会由于细节过多而疲于奔命。我认为最好的学习方式就是去实践,因此全书大量的试一试首先会介绍如何构建某个应...立即去当当网订购

知道自己的位置坐标很有用,在Google Maps上显示自己的位置也很酷,但是知道自己当前所在的地址会更棒!从一对经纬度坐标找到地址的过程叫做“逆地理编码”。下面的“试一试”演示了如何在知道位置的经纬度的情况下获知其地址。这可以通过Core Location框架提供的API来实现。

 试一试       从经纬度获知地址

(1) 继续使用LBS项目,在LBSViewController.h文件中添加如下粗体语句:
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>

#import "MyAnnotation.h"

@interface LBSViewController : UIViewController
<CLLocationManagerDelegate, MKMapViewDelegate> {
    IBOutlet UITextField *accuracyTextField;
    IBOutlet UITextField *latitudeTextField;
    IBOutlet UITextField *longitudeTextField;
    CLLocationManager *lm;
    MKMapView *mapView;
   
    IBOutlet UIImageView *compass;
    IBOutlet UILabel *heading;
    IBOutlet UIView *viewForMap;
   
    MyAnnotation *annotation;
    NSString *location;
   
    CLGeocoder *geocoder;
}

@property (retain, nonatomic) UITextField *accuracyTextField;
@property (retain, nonatomic) UITextField *latitudeTextField;
@property (retain, nonatomic) UITextField *longitudeTextField;

@property (nonatomic, retain) UIImageView *compass;
@property (nonatomic, retain) UILabel *heading;
@property (nonatomic, retain) UIView *viewForMap;

@end

(2) 在LBSViewController.m文件中添加如下粗体语句:
- (void) locationManager:(CLLocationManager *) manager
      didUpdateToLocation :(CLLocation *) newLocation
              fromLocation :(CLLocation *) oldLocation {
   
    //---display latitude---
    NSString *lat = [[NSString alloc] initWithFormat:@"%f",
                         newLocation.coordinate.latitude];
    latitudeTextField.text = lat;
   
    //---display longitude---
    NSString *lng = [[NSString alloc] initWithFormat:@"%f",
                         newLocation.coordinate.longitude];
    longitudeTextField.text = lng;
   
    //---display accuracy---
    NSString *acc = [[NSString alloc] initWithFormat:@"%f",
                         newLocation.horizontalAccuracy];
    accuracyTextField.text = acc;
   
    [acc release];
    [lat release];
    [lng release];
   
    //---update the map---   
    MKCoordinateSpan span;   
    span.latitudeDelta = .001;   
    span.longitudeDelta = .001;   
   
    MKCoordinateRegion region;
    region.center = newLocation.coordinate;
    region.span = span;
    [mapView setRegion:region animated:TRUE];   
   
    //---display an annotation here---
    if (!annotation) {       
        //---perform reverse geocoding---
        [geocoder reverseGeocodeLocation:newLocation
                    completionHandler:^(NSArray *placemark, NSError *error){
            for (int i=0; i<=[placemark count] - 1; i++) {
                location =
                    [NSString stringWithFormat:@"%@, %@",
                        ((CLPlacemark *) [placemark
objectAtIndex:i]).locality,
                        ((CLPlacemark *) [placemark
objectAtIndex:i]).country];
                UIAlertView *alert = [[UIAlertView alloc]
                    InitWithTitle:@"Your location"
                            message:location
                          delegate:self
                 cancelButtonTitle:@"OK"
therButtonTitles:nil];
                [alert show];
                [alert release];
            }
        }];

        annotation = [[MyAnnotation alloc]
                         initWithCoordinate:newLocation.coordinate
                         title:@"You are here"
                         subtitle:[NSString
                                    stringWithFormat:@"Lat: %f. Lng: %f",
                                    newLocation.coordinate.latitude,
                                    newLocation.coordinate.longitude]];
       
        [mapView addAnnotation:annotation];
    }
}

- (void)dealloc {
    [annotation release];
    [viewForMap release];
    [compass release];   
    [heading release];       
    [mapView release];
    [lm stopUpdatingLocation];
    [lm release];
    [latitudeTextField release];
    [longitudeTextField release];
    [accuracyTextField release];
    [super dealloc];
}

(3) 按Command+R组合键,在iPhone Simulator中测试应用程序。注意当找到位置的地址后,会显示一个警告,如图20-23所示。


 

示例说明

为了进行逆地理编码,需要使用CLGeocoder类:

    CLGeocoder *geocoder;

CLGeocoder类是在iOS 5中新增的,它位于Core Location框架中,替代了原来使用、但现在已被弃用的MKReverseGeocoder类(包含在Map Kit框架中)。

在通过“locationManager:didUpdateToLocation:fromLocation:”事件获取地址之后,可以实例化CLGeocoder类,通过“reverseGeocodeLocation:completionHandler:”方法为它设置一个位置坐标:
    //---display an annotation here---
    if (!annotation) {       
        //---perform reverse geocoding---
        [geocoder reverseGeocodeLocation:newLocation
                    completionHandler:^(NSArray *placemark, NSError *error){
            for (int i=0; i<=[placemark count] - 1; i++) {
                location =
                    [NSString stringWithFormat:@"%@, %@",
                       ((CLPlacemark *) [placemarkobjectAtIndex:i]).locality,
                       ((CLPlacemark*) [placemarkobjectAtIndex:i]).country];
                UIAlertView *alert = [[UIAlertView alloc]
                    initWithTitle:@"Your location"
                            message :location
                         delegate :self
                cancelButtonTitle:@"OK"
               otherButtonTitles:nil];
                [alert show];
                [alert release];
            }
        }];

CLGeocoder类以异步方式工作,在找到一个地址后会触发“CLGeocode- CompletionHandler”代码块。找到的地址封装在placemark数组中,本例中只是使用警告视图简单地打印出了所有的地址。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站