源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-07-05 12:51 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:iOS中定位当前位置坐标及转换为火星坐标的方法
[b]定位和位置信息获取 [/b]定位和反查位置信息要加载两个动态库 CoreLocation.framework 和 MapKit.framework 一个获取坐标一个提供反查
[u]复制代码[/u] 代码如下:
// 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
 
[u]复制代码[/u] 代码如下:
#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
[b]转换为火星坐标 [/b]这个写的公共类叫做:GPScombineClass类主要展示GPS位置的定位,GPS坐标的获取,然后从手机坐标转换成火星坐标,继而在需要的情况下,由火星转百度 ,百度转火星的详细算法; 在GPScombineClass.h中
[u]复制代码[/u] 代码如下:
#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
[u]复制代码[/u] 代码如下:
@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中
[u]复制代码[/u] 代码如下:
#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
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部