java 地心坐标系(ECEF)和WGS-84坐标系(WGS84)互转

WGS-84坐标系(World Geodetic System):是一种国际上采用的地心坐标系。坐标原点为地球质心,其地心空间直角坐标系的Z轴指向国际时间局(BIH)1984.0定义的协议地极(CTP)方向,X轴指向BIH1984.0的协议子午面和CTP赤道的交点,Y轴与Z轴、X轴垂直构成右手坐标系,称为1984年世界大地坐标系。这是一个国际协议地球参考系统(ITRS),是目前国际上统一采用的大地坐标系。GPS广播星历是以WGS-84坐标系为根据的。

WGS84坐标系,长轴6378137.000m,短轴6356752.314,扁率1/298.257223563。由于采用的椭球基准不一样,并且由于投影的局限性,使的全国各地并不存在一至的转换参数。对于这种转换由于量较大,有条件的话,一般都采用GPS联测已知点,应用GPS软件自动完成坐标的转换。当然若条件不许可,且有足够的重合点,也可以进行人工解算。

ECEF(Earth-Centered, Earth-Fixed):地球为中心,符合地区,是一个笛卡尔坐标系,也称为“普通地表”系统, X,Y,Z表示坐标位置,(0,0,0)点表示地球质心。它的坐标轴International Reference Pole 和 International Reference Meridian为准,国际参考极点和国际参考子午线,遵照地表所确定,(earth-fixed)

Z轴指向指向北,但不完全精确地与地球转动轴重合。转动轴有微小“摆动”,称之为“极运动(polar motion)”。X轴在球面上与格林威治线和赤道的交点(经纬度都为0的点)相交。这意味着ECEF依照地球一起旋转,点坐标和地表却依然重合。从WGS84基准转换为ECEF,可以作为把veloceities转换到North East Down坐标系的一个中间步骤。

具体代码转换:

 public static String WGS84toECEF(double latitude, double longitude, double height)
    {
        double X;
        double Y;
        double Z;
        double a = 6378137.0;
        double b = 6356752.31424518;
        double E = (a * a - b * b) / (a * a);
        double COSLAT = Math.cos(latitude * Math.PI / 180);
        double SINLAT = Math.sin(latitude * Math.PI / 180);
        double COSLONG = Math.cos(longitude * Math.PI / 180);
        double SINLONG = Math.sin(longitude * Math.PI / 180);
        double N = a / (Math.sqrt(1 - E * SINLAT * SINLAT));
        double NH = N + height;
        X = NH * COSLAT * COSLONG;
        Y = NH * COSLAT * SINLONG;
        Z = (b * b * N / (a * a) + height) * SINLAT;
        return X + "," + Y + "," + Z;
    }


    public static String ECEFtoWGS84(double x, double y, double z)

    {
        double a, b, c, d;
        double Longitude;//经度
        double Latitude;//纬度
        double Altitude;//海拔高度
        double p, q;
        double N;
        a =  6378137.0;
        b =  6356752.31424518;
        c = Math.sqrt(((a * a) - (b * b)) / (a * a));
        d = Math.sqrt(((a * a) - (b * b)) / (b * b));
        p = Math.sqrt((x * x) + (y * y));
        q = Math.atan2((z * a), (p * b));
        Longitude = Math.atan2(y, x);
        Latitude = Math.atan2((z + (d * d) * b * Math.pow(Math.sin(q), 3)), (p - (c * c) * a * Math.pow(Math.cos(q), 3)));
        N = a / Math.sqrt(1 - ((c * c) * Math.pow(Math.sin(Latitude), 2)));
        Altitude = (p / Math.cos(Latitude)) - N;
        Longitude = Longitude * 180.0 / Math.PI;
        Latitude = Latitude * 180.0 / Math.PI;
        return Longitude + "," + Latitude + "," + Altitude;
    }
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值