Welcome

首页 / 移动开发 / IOS / iOS中定位当前位置坐标及转换为火星坐标的方法

定位和位置信息获取
定位和反查位置信息要加载两个动态库 CoreLocation.framework 和 MapKit.framework 一个获取坐标一个提供反查
复制代码 代码如下:
// appDelgate.h
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <MapKit/MapKit.h>
 
@interface AppDelegate : UIResponder <UIApplicationDelegate,CLLocationManagerDelegate,MKReverseGeocoderDelegate>
 
@property (strong, nonatomic) UIWindow *window;
 
@end

 复制代码 代码如下:
#import "AppDelegate.h"
 
 
@implementation AppDelegate
 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd];
    button.frame = CGRectMake(0, 100, 100, 30);
    [button setTitle:@"定位" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 150, 320, 30)];
    label.tag = 101;
    label.text = @"等待定位中....";
    [self.window addSubview:label];
    [label release];
    [self.window addSubview:button];
    return YES;
 
}
 
-(void) test {
    
    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    // 设置定位精度,十米,百米,最好
    [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
    locationManager.delegate = self;
    
    // 开始时时定位
    [locationManager startUpdatingLocation];
}
 
// 错误信息
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSLog(@"error");
}
 
// 6.0 以上调用这个函数
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    
    NSLog(@"%d", [locations count]);
    
    CLLocation *newLocation = locations[0];
    CLLocationCoordinate2D oldCoordinate = newLocation.coordinate;
    NSLog(@"旧的经度:%f,旧的纬度:%f",oldCoordinate.longitude,oldCoordinate.latitude);
    
//    CLLocation *newLocation = locations[1];
//    CLLocationCoordinate2D newCoordinate = newLocation.coordinate;
//    NSLog(@"经度:%f,纬度:%f",newCoordinate.longitude,newCoordinate.latitude);
    
    // 计算两个坐标距离
    //    float distance = [newLocation distanceFromLocation:oldLocation];
    //    NSLog(@"%f",distance);
    
    [manager stopUpdatingLocation];
    
    //------------------位置反编码---5.0之后使用-----------------
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation:newLocation
                   completionHandler:^(NSArray *placemarks, NSError *error){
                       
                       for (CLPlacemark *place in placemarks) {
                           UILabel *label = (UILabel *)[self.window viewWithTag:101];
                           label.text = place.name;
                           NSLog(@"name,%@",place.name);                       // 位置名
//                           NSLog(@"thoroughfare,%@",place.thoroughfare);       // 街道
//                           NSLog(@"subThoroughfare,%@",place.subThoroughfare); // 子街道
//                           NSLog(@"locality,%@",place.locality);               // 市
//                           NSLog(@"subLocality,%@",place.subLocality);         // 区
//                           NSLog(@"country,%@",place.country);                 // 国家
                       }
                       
                   }];
    
}
 
// 6.0 调用此函数
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    NSLog(@"%@", @"ok");
}
 
 
@end

转换为火星坐标
这个写的公共类叫做:GPScombineClass类主要展示GPS位置的定位,GPS坐标的获取,然后从手机坐标转换成火星坐标,继而在需要的情况下,由火星转百度 ,百度转火星的详细算法;
在GPScombineClass.h中
复制代码 代码如下:
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
#import "CSqlite.h"
#import <MapKit/MapKit.h>
@interface GPScombineClass : NSObject<MKMapViewDelegate>{
    CLLocationManager *locationManager;
    CSqlite *m_sqlite;
   
    UILabel *m_locationName;
    MKMapView *mainMapView;
@public CLLocationCoordinate2D baidulocation;
    CLLocationCoordinate2D deleeverLocation;
}
-(void)OpenGPSmapView;
//在地图上放上自己的位置--外接接口
-(void)setMyMapPonitByMKMapView:(MKMapView *)MyMap;
@end

复制代码 代码如下:
@interface POI : NSObject <MKAnnotation> {
   
    CLLocationCoordinate2D coordinate;
    NSString *subtitle;
    NSString *title;
}
 
@property (nonatomic,readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic,retain) NSString *subtitle;
@property (nonatomic,retain) NSString *title;
 
-(id) initWithCoords:(CLLocationCoordinate2D) coords;
 
@end

 
在GPScombineClass.m中
复制代码 代码如下:
#import "GPScombineClass.h"
const double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
@implementation GPScombineClass
-(void)OpenGPSmapView{
    m_sqlite = [[CSqlite alloc]init];
    [m_sqlite openSqlite];
    if ([CLLocationManager locationServicesEnabled]) { // 检查定位服务是否可用
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        locationManager.distanceFilter=0.5;
        locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        [locationManager startUpdatingLocation]; // 开始定位
    }
   
    NSLog(@"GPS 启动");
}
 
// 定位成功时调用
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
    CLLocationCoordinate2D mylocation = newLocation.coordinate;//手机GPS
   
    mylocation = [self zzTransGPS:mylocation];///转换成火星GPS
    deleeverLocation=mylocation;
    baidulocation=[self hhTrans_bdGPS:mylocation];//转换成百度地图
     /*
    //显示火星坐标
    [self SetMapPoint:mylocation MKMapView:mainMapView];
  
    /////////获取位置信息
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray* placemarks,NSError *error)
     {
         if (placemarks.count >0   )
         {
             CLPlacemark * plmark = [placemarks objectAtIndex:0];
            
             NSString * country = plmark.country;
             NSString * city    = plmark.locality;
            
            
             NSLog(@"%@-%@-%@",country,city,plmark.name);
             self->m_locationName.text =plmark.name;
             NSLog(@"%@",self->m_locationName);
         }
        
         NSLog(@"%@",placemarks);
        
     }];
   
    //[geocoder release];
    */
}
// 定位失败时调用
- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error {
    NSLog(@"定位失败");
}
 
//把手机GPS坐标转换成火星坐标 (google坐标)
-(CLLocationCoordinate2D)zzTransGPS:(CLLocationCoordinate2D)yGps
{
    int TenLat=0;
    int TenLog=0;
    TenLat = (int)(yGps.latitude*10);
    TenLog = (int)(yGps.longitude*10);
    NSString *sql = [[NSString alloc]initWithFormat:@"select offLat,offLog from gpsT where lat=%d and log = %d",TenLat,TenLog];
    NSLog(sql);
    sqlite3_stmt* stmtL = [m_sqlite NSRunSql:sql];
    int offLat=0;
    int offLog=0;
    while (sqlite3_step(stmtL)==SQLITE_ROW)
    {
        offLat = sqlite3_column_int(stmtL, 0);
        offLog = sqlite3_column_int(stmtL, 1);
       
    }
   
    yGps.latitude = yGps.latitude+offLat*0.0001;
    yGps.longitude = yGps.longitude + offLog*0.0001;
    return yGps;
   
   
}
//在地图上放上自己的位置--外接接口
-(void)setMyMapPonitByMKMapView:(MKMapView *)MyMap{
 //显示火星坐标
    [self SetMapPoint:deleeverLocation MKMapView:MyMap];
    MyMap=mainMapView;
}
//在地图上放上自己的位置
-(void)SetMapPoint:(CLLocationCoordinate2D)myLocation MKMapView:(MKMapView *)mapView
{
//    POI* m_poi = [[POI alloc]initWithCoords:myLocation];
//   
//    [mapView addAnnotation:m_poi];
   
    MKCoordinateRegion theRegion = { {0.0, 0.0 }, { 0.0, 0.0 } };
    theRegion.center=myLocation;
    [mapView setZoomEnabled:YES];
    [mapView setScrollEnabled:YES];
    theRegion.span.longitudeDelta = 0.01f;
    theRegion.span.latitudeDelta = 0.01f;
    [mapView setRegion:theRegion animated:YES];
   
}
 
//把火星坐标转换成百度坐标
-(CLLocationCoordinate2D)hhTrans_bdGPS:(CLLocationCoordinate2D)fireGps
{
    CLLocationCoordinate2D bdGps;
    double huo_x=fireGps.longitude;
    double huo_y=fireGps.latitude;
    double z = sqrt(huo_x * huo_x + huo_y * huo_y) + 0.00002 * sin(huo_y * x_pi);
    double theta = atan2(huo_y, huo_x) + 0.000003 * cos(huo_x * x_pi);
    bdGps.longitude = z * cos(theta) + 0.0065;
    bdGps.latitude = z * sin(theta) + 0.006;
    return bdGps;
}
#pragma mark 显示商品信息
#pragma mark
-(void)showPurchaseOnMapByLocation:(CLLocationCoordinate2D)baiduGPS MKMapView:(MKMapView*)myMapView{
    CLLocationCoordinate2D googleGPS;
    googleGPS=[self hhTrans_GCGPS:baiduGPS];//转换为百度
    [self SetPurchaseMapPoint:googleGPS MKMapView:myMapView];
}
//把百度地图转换成谷歌地图--火星坐标
-(CLLocationCoordinate2D)hhTrans_GCGPS:(CLLocationCoordinate2D)baiduGps
{
    CLLocationCoordinate2D googleGps;
    double bd_x=baiduGps.longitude - 0.0065;
    double bd_y=baiduGps.latitude - 0.006;
    double z = sqrt(bd_x * bd_x + bd_y * bd_y) - 0.00002 * sin(bd_y * x_pi);
    double theta = atan2(bd_y, bd_x) - 0.000003 * cos(bd_x * x_pi);
    googleGps.longitude = z * cos(theta);
    googleGps.latitude = z * sin(theta);
    return googleGps;
}
 
-(void)SetPurchaseMapPoint:(CLLocationCoordinate2D)myLocation MKMapView:(MKMapView *)mapView
{
    POI* m_poi = [[POI alloc]initWithCoords:myLocation];
  
    [mapView addAnnotation:m_poi];
 
    MKCoordinateRegion theRegion = { {0.0, 0.0 }, { 0.0, 0.0 } };
    theRegion.center=myLocation;
    [mapView setZoomEnabled:YES];
    [mapView setScrollEnabled:YES];
    theRegion.span.longitudeDelta = 0.01f;
    theRegion.span.latitudeDelta = 0.01f;
    [mapView setRegion:theRegion animated:YES];}
@end