广

IOS开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    iOS中定位当前位置坐标及转换为火星坐标的方法

    2018-04-06 10:40:29 次阅读 稿源:互联网
    广告

    定位和位置信息获取
    定位和反查位置信息要加载两个动态库 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

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告