百度地图坐标-GPS坐标互换

gps转百度坐标时,需包含的头文件

#import<BaiduMapAPI_Utils/BMKUtilsComponent.h>

GPS转换到百度地图 (百度官方api)

// gps转换为百度坐标
+(CLLocationCoordinate2D)GPSLocationCoordinateToBaiduMapCoordinate:(CLLocationCoordinate2D)gpscoor
{
    NSDictionary *coordit = BMKConvertBaiduCoorFrom(gpscoor, BMK_COORDTYPE_GPS);
    CLLocationCoordinate2D baiduCoor = BMKCoorDictionaryDecode(coordit);
    return baiduCoor;
}

百度地图转GPS-GPS转百度

// 定义一些常量
static double x_PI = 3.14159265358979324 * 3000.0 / 180.0;      // 圆周率转换量
static double PI = 3.1415926535897932384626;                    // 圆周率
static double a = 6378245.0;                                    // 卫星椭球坐标投影到平面地图坐标系的投影因子
static double ee = 0.00669342162296594323;                      // 椭球的偏心率

- (CLLocationCoordinate2D)wgs2gcj:(CLLocationCoordinate2D)wgsll
{
    CLLocationCoordinate2D coor = wgsll;

    if ([self outOfChina:wgsll.latitude lon:wgsll.longitude]) {
        return wgsll;
    }

    double dLat = [self transformLat:wgsll.longitude - 105.0 y:wgsll.latitude - 35.0];
    double dLon = [self transformLon:wgsll.longitude - 105.0 y: wgsll.latitude - 35.0];
    double radLat = wgsll.latitude / 180.0 * PI;
    double magic = sin(radLat);
    magic = 1 - ee * magic * magic;
    double sqrtMagic = sqrt(magic);
    dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI);
    dLon = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * PI);
    coor.latitude = wgsll.latitude + dLat;
    coor.longitude = wgsll.longitude + dLon;
    return coor;
}

- (CLLocationCoordinate2D)wgs2gcj:(double)lat lon:(double)lon{
    return [self wgs2gcj:CLLocationCoordinate2DMake(lat, lon)];
}

- (CLLocationCoordinate2D)gcj2wgs:(CLLocationCoordinate2D)gcjll
{
    if ([self outOfChina:gcjll.latitude lon:gcjll.longitude]) {
        return gcjll;
    }
    double dlat = [self transformLat:gcjll.longitude - 105.0 y:gcjll.latitude - 35.0];
    double dlng = [self transformLon:gcjll.longitude - 105.0 y:gcjll.latitude - 35.0];
    double radlat = gcjll.latitude / 180.0 * PI;
    double magic = sin(radlat);
    magic = 1 - ee * magic * magic;
    double sqrtmagic = sqrt(magic);
    dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
    dlng = (dlng * 180.0) / (a / sqrtmagic * cos(radlat) * PI);
    double mglat = gcjll.latitude + dlat;
    double mglng = gcjll.longitude + dlng;
    return CLLocationCoordinate2DMake(gcjll.latitude * 2 - mglat, gcjll.longitude * 2 - mglng);
}

- (CLLocationCoordinate2D)gcj2wgs:(double)lat lon:(double)lon{
    return [self gcj2wgs:CLLocationCoordinate2DMake(lat, lon)];
}

- (CLLocationCoordinate2D)gcj2bd:(CLLocationCoordinate2D)gcjll
{
    double x = gcjll.longitude, y = gcjll.latitude;
    double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_PI);
    double theta = atan2(y, x) + 0.000003 * cos(x * x_PI);
    double bd_lon = z * cos(theta) + 0.0065;
    double bd_lat = z * sin(theta) + 0.006;
    return CLLocationCoordinate2DMake(bd_lat, bd_lon);
}

- (CLLocationCoordinate2D)gcj2bd:(double)lat lon:(double)lon{
    return [self gcj2bd:CLLocationCoordinate2DMake(lat, lon)];
}

- (CLLocationCoordinate2D)bd2gcj:(CLLocationCoordinate2D)bdll
{
    double x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    double x = bdll.longitude - 0.0065, y = bdll.latitude - 0.006;
    double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);
    double theta = atan2(y, x) - 0.000003 * cos(x * x_pi);
    double gg_lon = z * cos(theta);
    double gg_lat = z * sin(theta);
    return CLLocationCoordinate2DMake(gg_lat, gg_lon);
}

- (CLLocationCoordinate2D)bd2gcj:(double)lat lon:(double)lon{
    return [self bd2gcj:CLLocationCoordinate2DMake(lat, lon)];
}
- (CLLocationCoordinate2D)bd2wgs:(CLLocationCoordinate2D)bdll
{
    CLLocationCoordinate2D gcj02 = [self bd2gcj:bdll];
    return [self gcj2wgs:gcj02];
}
- (CLLocationCoordinate2D)bd2wgs:(double)lat lon:(double)lon{
    return [self bd2gcj:CLLocationCoordinate2DMake(lat, lon)];
}
- (CLLocationCoordinate2D)wgs2bd:(CLLocationCoordinate2D)bdll
{
    CLLocationCoordinate2D gcj02 = [self wgs2gcj:bdll];
    return [self gcj2bd:gcj02];
}

- (CLLocationCoordinate2D)wgs2bd:(double)lat lon:(double)lon{
    return [self wgs2bd:CLLocationCoordinate2DMake(lat, lon)];
}

- (BOOL)outOfChina:(double)lat lon:(double)lon
{
    if (lon < 72.004 || lon > 137.8347)
        return true;
    if (lat < 0.8293 || lat > 55.8271)
        return true;
    return false;
}
- (double)transformLat:(double)x y:(double)y
{
    double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(fabs(x));
    ret += (20.0 * sin(6.0 * x * PI) + 20.0 * sin(2.0 * x * PI)) * 2.0 / 3.0;
    ret += (20.0 * sin(y * PI) + 40.0 * sin(y / 3.0 * PI)) * 2.0 / 3.0;
    ret += (160.0 * sin(y / 12.0 * PI) + 320 * sin(y * PI / 30.0)) * 2.0 / 3.0;
    return ret;
}
- (double)transformLon:(double)x y:(double)y
{
    double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(fabs(x));
    ret += (20.0 * sin(6.0 * x * PI) + 20.0 * sin(2.0 * x * PI)) * 2.0 / 3.0;
    ret += (20.0 * sin(x * PI) + 40.0 * sin(x / 3.0 * PI)) * 2.0 / 3.0;
    ret += (150.0 * sin(x / 12.0 * PI) + 300.0 * sin(x / 30.0 * PI)) * 2.0 / 3.0;
    return ret;
}

使用时
先实例化本类,然后使用以下两个方法互相转换

// 百度转GPS
- (CLLocationCoordinate2D)bd2wgs:(double)lat lon:(double)lon;
// GPS转百度
- (CLLocationCoordinate2D)wgs2bd:(double)lat lon:(double)lon;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容