1. 程式人生 > >iOS地圖上WGS84、GCJ-02、BD-09互轉解決方案

iOS地圖上WGS84、GCJ-02、BD-09互轉解決方案

這是在網上找的解決方法。。

//
//  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