/// <summary>
        /// create the transformation parameters
        /// </summary>
        /// <param name="values">The parameters appears in order by Tx, Ty, Tz, S, Rx, Ry, Rz, Px, Py, Pz. Usually, translation parameter unit is meter, sacle factor is ppm, rotation parameter unit is second.</param>
        public TransParameters(CoordinateDatum from, CoordinateDatum to, params double[] values)
        {
            From = from;
            To   = to;

            _values = new Dictionary <string, double>();
            #region Three pamaters
            if (values.Length > 0)
            {
                _values.Add("Tx", values[0]);
            }
            if (values.Length > 1)
            {
                _values.Add("Ty", values[1]);
            }
            if (values.Length > 2)
            {
                _values.Add("Tz", values[2]);
            }
            #endregion

            #region Four parameters
            if (values.Length > 3)
            {
                _values.Add("S", values[3]);
            }
            #endregion

            #region Seven parameters
            if (values.Length > 4)
            {
                _values.Add("Rx", values[4]);
            }
            if (values.Length > 5)
            {
                _values.Add("Ry", values[5]);
            }
            if (values.Length > 6)
            {
                _values.Add("Rz", values[6]);
            }
            #endregion

            #region Ten parameters (Molodensky-Badekas transform)
            if (values.Length > 7)
            {
                _values.Add("Px", values[7]);
            }
            if (values.Length > 8)
            {
                _values.Add("Py", values[8]);
            }
            if (values.Length > 9)
            {
                _values.Add("Pz", values[9]);
            }
            #endregion
        }
        /// <summary>
        /// invert the transformation parameters
        /// </summary>
        public void Invert()
        {
            foreach (string key in _values.Keys)
            {
                _values[key] *= -1;
            }

            CoordinateDatum datum = To;

            To   = From;
            From = datum;
        }
 /// <summary>
 /// create the transformation parameters
 /// </summary>
 /// <param name="values">parameters. Usually, translation parameter unit is meter, rotation parameter unit is second, sacle factor is ppm.</param>
 /// <param name="from">source datum</param>
 /// <param name="to">target datum</param>
 /// <param name="code">code of transformation</param>
 /// <param name="location">region of use</param>
 public TransParameters(CoordinateDatum from, CoordinateDatum to, string code = "", string location = "", params double[] values)
     : this(from, to, values)
 {
     Code     = code;
     Location = location;
 }