/// <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);
        }
Esempio n. 3
0
        /// <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;
        }