public static double [ ] ECFtoLLA ( double x , double y , double z , double a , double b ) { double longitude = Math . atan2 ( y , x ) ; double ePrimeSquared = ( a * a - b * b ) / ( b * b ) ; double p = Math . sqrt ( x * x + y * y ) ; double theta = Math . atan ( ( z * a ) / ( p * b ) ) ; double sineTheta = Math . sin ( theta ) ; double cosTheta = Math . cos ( theta ) ; double f = 1 / 298.257223563 ; double e2 = 2 * f - f * f ; double top = z + ePrimeSquared * b * sineTheta * sineTheta * sineTheta ; double bottom = p - e2 * a * cosTheta * cosTheta * cosTheta ; double geodeticLat = Math . atan ( top / bottom ) ; double sineLat = Math . sin ( geodeticLat ) ; double N = a / Math . sqrt ( 1 - e2 * sineLat * sineLat ) ; double altitude = ( p / Math . cos ( geodeticLat ) ) - N ; // maintain longitude btw -PI and PI if ( longitude > Math . PI ) { longitude -= 2 * Math . PI ; } else if ( longitude < - Math . PI ) { longitude += 2 * Math . PI ; } return new double [ ] { geodeticLat , longitude , altitude } ; }
comparing api to others