dbkoren - 1 year ago 267
Java Question

# ECEF to lla (lat,lon,alt) in java

Ive looked through the posts in the site and haven't found my problem ...
as the head line says im trying to convert from ecef to lla .

I'm using this document : Conversion article
in the direct formula , not the iterate formula
and this site for result comparison : ECEF2LLA

Im developing in java so my code is as follows :

``````public static final double a = 6378137;
public static final double f = 1/298.257223563;
public static final double b = a*(1-f);
public static final double e = Math.sqrt((Math.pow(a, 2)-Math.pow(b, 2))/Math.pow(a, 2));
public static final double e2 = Math.sqrt((Math.pow(a, 2)-Math.pow(b, 2))/Math.pow(b, 2));
public static double[] ecef2lla(double x , double y , double z){
double[] lla = {0,0,0};
double lon,lat,height,N;
double p = Math.sqrt(Math.pow(x, 2)+Math.pow(y, 2));
double theta = Math.atan((z*a)/(p*b));
lon = Math.atan(y/x);
lon = lon*180/Math.PI;

lat = Math.atan(((z+Math.pow(e2, 2)*b*Math.pow(Math.sin(theta), 3))/((p-Math.pow(e,2)*a*Math.pow(Math.cos(theta), 3)))));
lat = (lat*180)/Math.PI;

N= a/(Math.sqrt(1-Math.pow(e*Math.sin(lat), 2)));
height = (p/Math.cos(theta)) - N;
lla[0] = lon;
lla[1] = lat;
lla[2] = height;
return lla;

}
``````

I'm getting wrong height data.
I've tried to move to radians and degrees and what not .

OK so i got this working.

The problem was a misplaced variable, so for the sake of our future here's the working JAVA implementation :

``````public static final double a = 6378137;
public static final double f = 0.0034;
public static final double b = 6.3568e6;
public static final double e = Math.sqrt((Math.pow(a, 2) - Math.pow(b, 2)) / Math.pow(a, 2));
public static final double e2 = Math.sqrt((Math.pow(a, 2) - Math.pow(b, 2)) / Math.pow(b, 2));

public static double[] ecef2lla(double x, double y, double z) {

double[] lla = { 0, 0, 0 };
double lan, lon, height, N , theta, p;

p = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));

theta = Math.atan((z * a) / (p * b));

lon = Math.atan(y / x);

lat = Math.atan(((z + Math.pow(e2, 2) * b * Math.pow(Math.sin(theta), 3)) / ((p - Math.pow(e, 2) * a * Math.pow(Math.cos(theta), 3)))));
N = a / (Math.sqrt(1 - (Math.pow(e, 2) * Math.pow(Math.sin(lat), 2))));

double m = (p / Math.cos(lat));
height = m - N;

lon = lon * 180 / Math.PI;
lat = lat * 180 / Math.PI;
lla[0] = lat;
lla[1] = lon;
lla[2] = height;
return lla;
}
``````

Note : The units for the ECEF X Y Z are in Meters !