iOS地圖上WGS84、GCJ-02、BD-09互轉解決方案
阿新 • • 發佈:2019-02-02
這是在網上找的解決方法。。
// // JZLocationConverter.h // Run // // Created by Nick on 15/6/3. // Copyright (c) 2015年 com.zywl.running. All rights reserved. // #import <Foundation/Foundation.h> #import <Foundation/Foundation.h> #import <CoreLocation/CoreLocation.h> @interface JZLocationConverter : NSObject /** * @brief 世界標準地理座標(WGS-84) 轉換成 中國國測局地理座標(GCJ-02)<火星座標> * * ####只在中國大陸的範圍的座標有效,以外直接返回世界標準座標 * * @param location 世界標準地理座標(WGS-84) * * @return 中國國測局地理座標(GCJ-02)<火星座標> */ + (CLLocationCoordinate2D)wgs84ToGcj02:(CLLocationCoordinate2D)location; /** * @brief 中國國測局地理座標(GCJ-02) 轉換成 世界標準地理座標(WGS-84) * * ####此介面有1-2米左右的誤差,需要精確定位情景慎用 * * @param location 中國國測局地理座標(GCJ-02) * * @return 世界標準地理座標(WGS-84) */ + (CLLocationCoordinate2D)gcj02ToWgs84:(CLLocationCoordinate2D)location; /** * @brief 世界標準地理座標(WGS-84) 轉換成 百度地理座標(BD-09) * * @param location 世界標準地理座標(WGS-84) * * @return 百度地理座標(BD-09) */ +(CLLocationCoordinate2D)wgs84ToBd09:(CLLocationCoordinate2D)location; /** * @brief 中國國測局地理座標(GCJ-02)<火星座標> 轉換成 百度地理座標(BD-09) * * @param location 中國國測局地理座標(GCJ-02)<火星座標> * * @return 百度地理座標(BD-09) */ +(CLLocationCoordinate2D)gcj02ToBd09:(CLLocationCoordinate2D)location; /** * @brief 百度地理座標(BD-09) 轉換成 中國國測局地理座標(GCJ-02)<火星座標> * * @param location 百度地理座標(BD-09) * * @return 中國國測局地理座標(GCJ-02)<火星座標> */ +(CLLocationCoordinate2D)bd09ToGcj02:(CLLocationCoordinate2D)location; /** * @brief 百度地理座標(BD-09) 轉換成 世界標準地理座標(WGS-84) * * ####此介面有1-2米左右的誤差,需要精確定位情景慎用 * * @param location 百度地理座標(BD-09) * * @return 世界標準地理座標(WGS-84) */ +(CLLocationCoordinate2D)bd09ToWgs84:(CLLocationCoordinate2D)location; @end
// // Location.m // Run // // Created by Nick on 15/5/28. // Copyright (c) 2015年 com.zywl.running. All rights reserved. // #import "Location.h" #import "JZLocationConverter.h" static Location * shared = nil; @implementation Location +(id) shareManager { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (shared == nil) { shared = [[super allocWithZone:NULL] init]; } }); return shared; } +(id)allocWithZone:(struct _NSZone *)zone { return [self shareManager]; } -(id)copy { return self; } -(void)starManager { self.locationManager = [[CLLocationManager alloc] init];//建立位置管理器 //設定代理 self.locationManager.delegate = self; double version = [[UIDevice currentDevice].systemVersion doubleValue];//判定系統版本。 if(version>=8.0f){ [self.locationManager requestWhenInUseAuthorization];//新增這句 } //設定定位精度 self.locationManager.desiredAccuracy=kCLLocationAccuracyBest; //定位頻率,每隔多少米定位一次 CLLocationDistance distance=10.0;//十米定位一次 self.locationManager.distanceFilter=distance; //啟動跟蹤定位 [self.locationManager startUpdatingLocation]; } ///新增運動記錄 -(NSMutableDictionary *)addHistory { NSMutableDictionary * par= [[NSMutableDictionary alloc]init]; [par setObject:[self setTime:[NSDate date]] forKey:@"start_time"]; [par setObject:@"0" forKey:@"distance"]; [par setObject:@"0" forKey:@"duration"]; return par; } ///更新運動記錄 -(NSMutableDictionary *)updateHistory { NSMutableDictionary * par= [[NSMutableDictionary alloc]init]; [par setObject:self.history_id forKey:@"history_id"]; [par setObject:[NSString stringWithFormat:@"%.2f",self.distance] forKey:@"distance"]; [par setObject:[NSString stringWithFormat:@"%d",self.duration] forKey:@"duration"]; return par; } ///新增運動軌跡 -(NSMutableDictionary *)addTrace:(NSMutableArray *)array { NSMutableArray * arr = [self setPar:array]; NSMutableDictionary * par= [[NSMutableDictionary alloc]init]; [par setObject:self.history_id forKey:@"history_id"]; [par setObject:[arr objectAtIndex:3] forKey:@"trace_time"]; [par setObject:[arr objectAtIndex:0] forKey:@"latitude"]; [par setObject:[arr objectAtIndex:1] forKey:@"longitude"]; [par setObject:[arr objectAtIndex:2] forKey:@"altitude"]; return par; } -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { //此處locations儲存了持續更新的位置座標值,取最後一個值為最新位置,如果不想讓其持續更新位置,則在此方法中獲取到一個值之後讓locationManager stopUpdatingLocation CLLocation *currentLocation = [locations lastObject]; CLLocationCoordinate2D coor = currentLocation.coordinate; // coor = [self zzTransGPS:coor];///火星GPS // NSLog(@"%f",coor.latitude); // NSLog(@"%f",coor.longitude); coor = [JZLocationConverter wgs84ToGcj02:coor]; self.latitude = coor.latitude; self.longitude = coor.longitude; // NSLog(@"%f",self.latitude); // NSLog(@"%f",self.longitude); //[self.locationManager stopUpdatingLocation]; } -(CLLocationCoordinate2D)zzTransGPS:(CLLocationCoordinate2D)yGps { int TenLat=0; int TenLog=0; TenLat = (int)(yGps.latitude*10); TenLog = (int)(yGps.longitude*10); int offLat=0; int offLog=0; yGps.latitude = yGps.latitude+offLat*0.0001; yGps.longitude = yGps.longitude + offLog*0.0001; return yGps; } //調整時間格式 -(NSString * )setTime:(NSDate *)time { NSDateFormatter * outputFormatter = [[NSDateFormatter alloc]init]; [outputFormatter setLocale:[NSLocale currentLocale]]; [outputFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString * timeStr = [outputFormatter stringFromDate:time]; timeStr=[NSString stringWithFormat:@"%@%%20%@",[timeStr substringToIndex:10],[timeStr substringFromIndex:11]]; return timeStr; } ///設定引數形式 -(NSMutableArray *)setPar:(NSMutableArray *)array { NSMutableArray * parArray = [[NSMutableArray alloc]init]; int n = (int)[array count]; for (int i = 0; i < n; i++) { NSArray * array1 = [NSArray arrayWithArray:[array objectAtIndex:i]]; NSString * temp1 = @""; for (NSString * str in array1) { // if (i == 3) // { // NSString * str1 = [NSString stringWithFormat:@"%@%%20%@",[str substringToIndex:10],[str substringFromIndex:11]]; // temp1 = [temp1 stringByAppendingFormat:@",%@",str1]; // // }else temp1 = [temp1 stringByAppendingFormat:@",%@",str]; } [parArray addObject:temp1]; } return parArray; } //根據經緯度算距離 -(double)GetDistance:(NSString*)lat1 :(NSString *)lon1 :(NSString*)lat2 :(NSString*)lon2 { CLLocation *sanFrancisco = [[CLLocation alloc] initWithLatitude:[lat1 doubleValue] longitude:[lon1 doubleValue]]; CLLocation *portland = [[CLLocation alloc] initWithLatitude:[lat2 doubleValue]longitude:[lon2 doubleValue]]; CLLocationDistance distance = [portland distanceFromLocation:sanFrancisco]; //MKDistanceFormatter *formatter = [[MKDistanceFormatter alloc] init]; //formatter.units = MKDistanceFormatterUnitsMetric; // NSLog(@"%0.0f m",[[NSString stringWithFormat:@"%0.0f",distance] doubleValue]); return [[NSString stringWithFormat:@"%.2f",distance] doubleValue]; //return dist; } ///將時間轉化成秒 -(int)changeSecond:(NSString *)time { int i = 0; NSArray * temp = [time componentsSeparatedByString:@":" ]; int m = [[temp objectAtIndex:0] intValue]; int s = [[temp objectAtIndex:1] intValue]; i = m * 60 + s; return i; } @end