我是个学ios开发才3个月的小菜鸟。在做项目的过程中遇到一些问题,翻书上网找解决办法。现在现学现卖,也形成总结的好习惯。如有不对的地方,欢迎拍砖。

今天说下GPS定位和反向解析地址的问题。

刚开始习惯性用CoreLocation.framework框架中的CLLocationManagerDelegate,获取当前的经纬度,再用经纬度反向解析出当前位置。代码如下:

.h文件


#import<UIKit/UIKit.h>
#import<CoreLocation/CoreLocation.h>
#import<MapKit/MapKit.h>
@interface FirstViewController :UIViewController <CLLocationManagerDelegate,MKMapViewDelegate>{
   CLLocationManager *lm;
}
@property (retain,nonatomic) IBOutletUILabel *locationLabel;
@property (retain,nonatomic) IBOutletMKMapView *map;
 

 
.m文件
#import"FirstViewController.h"
@implementation
@synthesize
@synthesize map;

- (void)viewDidLoad
{
    [superviewDidLoad];
    lm = [[CLLocationManageralloc]init];
lm.delegate =self;
    lm.desiredAccuracy =kCLLocationAccuracyBest;//设置最高精度
    lm.distanceFilter =kCLDistanceFilterNone;
    [lmstartUpdatingHeading];//方向
    [lmstartUpdatingLocation];//位置
map.delegate =self;
 }
 
void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError
 {
NSLog(@"定位出错");
 }
void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation
CLLocation
 {
NSLog(@"%f,%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude);
    //    //解析并获取当前坐标对应得地址信息
    if ([[[UIDevicecurrentDevice] systemVersion]floatValue] >= 5.0) {
       // NSLog(@"iphone :%f",[[[UIDevice currentDevice] systemVersion] floatValue]);
CLGeocoder *clGeoCoder = [[CLGeocoderalloc] init];
CLGeocodeCompletionHandler handle = ^(NSArray *placemarks,NSError
         {
for (CLPlacemark * placeMarkin
self.locationLabel.text = placeMark.name;
             }
         };
reverseGeocodeLocation:newLocationcompletionHandler:handle];
release];
        [manager stopUpdatingLocation];
         
else
        //[self startedReverseGeoderWithLatitude:newLocation.coordinate.latitude longitude:newLocation.coordinate.longitude];
        NSLog(@"iphone :%f",[[[UIDevicecurrentDevice] systemVersion]floatValue]);
     }
 }


CLGeocoder 反向解析的问题。但拿获取到的经纬度在google地图中搜索时,发现定位到的位置也是不准确的。后来在苹果官方文档中找到GeocoderDemo这个例子,在网上也看了一些关于“火星坐标系”的帖子,基本确定不是反向解析的问题。详细可参考火星坐标。


CLLocationManagerDelegate ?果然,人家直接用的MapKit.framework框架。改了实现方法后,果然管用,定位基本上在100M的误差范围了。代码如下:


.h文件基本一致


.m文件 

 
void)viewDidLoad
{
    [superviewDidLoad];
 
mapsetHidden:YES];
   map.showsUserLocation =YES;
 map.delegate =  self;
}
MKMapViewDelegate委托里的方法,需实例化一个mapview,如果在实际项目过程中不想显示地图,可以设置位Hidden。
map.showsUserLocation设置为YES,才能开启定位获取到用户当前地理位置的信息。获取后再设置为NO即可停止定位。
MKMapViewDelegate委托里的方法,而不是CLLocationManagerDelegate委托里的方法。反向解析的代码基本一致。
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation
   //CLLocationCoordinate2D coords = userLocation.location.coordinate;
 CLLocation * newLocation = userLocation.location;
  // NSLog(@"2::::::%f,%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude);
    //    //解析并获取当前坐标对应得地址信息
   if ([[[UIDevicecurrentDevice] systemVersion]floatValue] >= 5.0) {
 CLGeocoder *clGeoCoder = [[CLGeocoder  alloc] init];
 CLGeocodeCompletionHandler handle = ^(NSArray *placemarks,NSError
        {
 for (CLPlacemark * placeMark  in
            {
 self.locationLabel.text = placeMark.name;
 map.showsUserLocation =  NO;
            }
        };
reverseGeocodeLocation:newLocation completionHandler:handle];
release];
    }
}