我是个学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];
}
}