/// <summary> /// XYZ to DMS /// </summary> /// <param name="datum"></param> /// <param name="tokyo"></param> /// <returns></returns> private LLA XYZ_to_dms(int datum, XYZ_Tokyo tokyo) { LLA lla; double b_dash, P, theta, E_square; double E_square_dash, neu, f, adms; f = adms = 0.0; switch (datum) { case 1: // WGS-84 adms = a84; f = f84; break; case 2: // Tokyo datum adms = a; f = f_tokyo; break; } b_dash = adms * (1.0 - f); P = Math.Sqrt(Math.Pow(tokyo.X_Tokyo, 2.0) + Math.Pow(tokyo.Y_Tokyo, 2.0)); theta = Math.Atan((tokyo.Z_Tokyo * adms) / (P * b_dash)); E_square = (adms * adms - b_dash * b_dash) / (adms * adms); E_square_dash = (adms * adms - b_dash * b_dash) / (b_dash * b_dash); lla.latitude = Math.Atan((tokyo.Z_Tokyo + E_square_dash * b_dash * Math.Pow(Math.Sin(theta), 3.0)) / (P - E_square * adms * Math.Pow(Math.Cos(theta), 3.0))); lla.longitude = Math.Atan(tokyo.Y_Tokyo / tokyo.X_Tokyo) + Math.PI; neu = adms / Math.Sqrt(1.0 - E_square * Math.Pow(Math.Sin(lla.latitude), 2.0)); lla.altitude = P / Math.Cos(lla.latitude) - neu; return(lla); }
/// <summary> /// WGS-84 to Cartesian coordinates /// </summary> /// <param name="lat84"></param> /// <param name="lon84"></param> /// <param name="alt84"></param> public void w84toxyh(double lat84, double lon84, double alt84) { int datum = 0; // STEP 1 : WGS-84 to XYZ double lat = this.deg2rad(lat84); double lon = this.deg2rad(lon84); double alt = this.deg2rad(alt84); datum = 1; XYZ84 xyz84 = this.dms_to_XYZ(datum, lat, lon, alt); // STEP 2 : WGS-84 to TOKYO XYZ_Tokyo tokyo = this.WGS84_to_Tokyo(this.param, xyz84); // STEP 3 : XYZ to LAT_LON_ALT datum = 2; LLA lla = this.XYZ_to_dms(datum, tokyo); result = this.bl2xy(lla, this.zone); }
/// <summary> /// XYZ to DMS /// </summary> /// <param name="datum"></param> /// <param name="tokyo"></param> /// <returns></returns> private LLA XYZ_to_dms(int datum, XYZ_Tokyo tokyo) { LLA lla; double b_dash, P, theta, E_square; double E_square_dash, neu, f, adms; f = adms = 0.0; switch (datum) { case 1: // WGS-84 adms = a84; f = f84; break; case 2: // Tokyo datum adms = a; f = f_tokyo; break; } b_dash = adms * (1.0 - f); P = Math.Sqrt(Math.Pow(tokyo.X_Tokyo, 2.0) + Math.Pow(tokyo.Y_Tokyo, 2.0)); theta = Math.Atan((tokyo.Z_Tokyo * adms) / (P * b_dash)); E_square = (adms * adms - b_dash * b_dash) / (adms * adms); E_square_dash = (adms * adms - b_dash * b_dash) / (b_dash * b_dash); lla.latitude = Math.Atan((tokyo.Z_Tokyo + E_square_dash * b_dash * Math.Pow(Math.Sin(theta), 3.0)) / (P - E_square * adms * Math.Pow(Math.Cos(theta), 3.0))); lla.longitude = Math.Atan(tokyo.Y_Tokyo / tokyo.X_Tokyo) + Math.PI; neu = adms / Math.Sqrt(1.0 - E_square * Math.Pow(Math.Sin(lla.latitude), 2.0)); lla.altitude = P / Math.Cos(lla.latitude) - neu; return lla; }