搜索

首页  >  问答  >  正文

ios - 如何将百度地图的坐标经纬度转换成GPS坐标

如题 请教大神 如何将百度地图的经纬度转成真实经纬度。百度API只提供其他经纬度转换成百度经纬度。

天蓬老师天蓬老师2773 天前800

全部回复(4)我来回复

  • PHPz

    PHPz2017-04-17 17:30:05

    我之前在Android上用的java版的,给你转成swift了,跑了一下应该没啥问题。
    先用第一个函数,将百度坐标转成火星坐标,再用第二个,将火星坐标转成WGS84坐标,也就是真实坐标了。

    let PI = 3.1415926535897932384626;
    let A = 6378245.0;
    let EE = 0.00669342162296594323;
    
    //: Change BD-09 to Gcj-02
    func bd09_to_gcj02(latitude lat:Double, longitude lon:Double) -> (lat:Double, lon:Double)
    {
        let x: Double = lon - 0.0065;
        let y: Double = lat - 0.006;
        let z: Double = sqrt(x * x + y * y) - 0.00002 * sin(y * PI);
        let theta: Double = atan2(y, x) - 0.000003 * cos(x * PI);
        return (z * sin(theta), z * cos(theta));
    }
    
    //: Change Gcj-02 to WGS-84
    func gcj02_to_wgs84(latitude lat:Double, longitude lon:Double) -> (lat:Double, lon:Double)
    {
        let wgs84_pos: (lat: Double, lon: Double) = tran(latitude: lat, longitude: lon);
        let gcj02_lon: Double = lon * 2 - wgs84_pos.lon;
        let gcj02_lat: Double = lat * 2 - wgs84_pos.lat;
        return (gcj02_lat, gcj02_lon);
    }
    
    //: Private func
    private func tran(latitude lat:Double, longitude lon:Double) -> (lat:Double, lon:Double)
    {
        var dLat: Double = transformLat(lon - 105.0, y: lat - 35.0);
        var dLon: Double = transformLon(lon - 105.0, y: lat - 35.0);
        let radLat: Double = lat / 180.0 * PI;
        var magic: Double = sin(radLat);
        magic = 1 - EE * magic * magic;
        let sqrtMagic: Double = sqrt(magic);
        dLat = (dLat * 180.0) / ((A * (1 - EE)) / (magic * sqrtMagic) * PI);
        dLon = (dLon * 180.0) / (A / sqrtMagic * cos(radLat) * PI);
        let mgLat: Double = lat + dLat;
        let mgLon: Double = lon + dLon;
        return (mgLat, mgLon);
    }
    
    private func transformLat(x: Double, y: Double) -> Double
    {
        var ret: Double = -100.0 + 2.0 * x + 3.0 * y;
        ret += 0.2 * y * y + 0.1 * x * y;
        ret += 0.2 * sqrt(abs(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;
    }
    
    
    private func transformLon(x: Double, y: Double) -> Double
    {
        var ret: Double = 300.0 + x + 2.0 * y;
        ret += 0.1 * x * x + 0.1 * x * y;
        ret += 0.1 * sqrt(abs(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;
    }

    回复
    0
  • 黄舟

    黄舟2017-04-17 17:30:05

    前端时间写了一个js版本的常用互联网坐标转换,正好对应你的这个问题,另外GPS坐标是WGS84坐标,http://wandergis.github.io/coordtransform/ github今天挂了,只能给你这个了,你可以使用npm下载使用,还提供了一个python版本的 你可以去看看,刚刚发现你是在ios下提问的,源码是开源的 你可以参照修改成objectivec的代码或者swift的

    回复
    0
  • PHPz

    PHPz2017-04-17 17:30:05

    百度坐标貌似是火星坐标再修正了一次,有百度坐标转火星坐标的,也有火星坐标转地球坐标的,这类你可以去github上 或者百度下就有的。
    话说 你都用了百度地图了,为啥还要知道真正的地球坐标。

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:30:05

    百度地图有接口可以转换的,你可以查一下百度地图的API

    回复
    0
  • 取消回复