Example #1
0
        /// <summary><para>Die Funktion wandelt geographische Koordinaten (Länge/Breite) eines <see cref="GeoSystem.Geographic"/>-Objektes
        /// in ein <see cref="GeoUtility.GeoSystem.GaussKrueger">GaussKrueger</see>-Objekt um.
        /// <para>Die Funktion ist nur für interne Berechnungen bestimmt.</para></para></summary>
        /// <remarks><para>
        /// Hintergründe zum Problem der Koordinatentransformationen sowie entsprechende mathematische
        /// Formeln können den einschlägigen Fachbüchern oder dem Internet entnommen werden.<p />
        /// Quellen:
        /// Bundesamt für Kartographie und Geodäsie<br />
        /// <a href="http://www.bkg.bund.de" target="_blank">http://www.bkg.bund.de</a><br />
        /// <a href="http://crs.bkg.bund.de" target="_blank">http://crs.bkg.bund.de</a><br />
        /// </para></remarks>
        ///
        /// <param name="geo"><see cref="GeoSystem.Geographic"/>-Objekt (<see cref="GeoUtility.GeoSystem.Helper.GeoDatum.Potsdam">Potsdam-Datum</see>)</param>
        /// <returns>Ein <see cref="GeoUtility.GeoSystem.GaussKrueger "/>-Objekt.</returns>
        public static GaussKrueger WGSGK(Geographic geo)
        {
            double laenge = geo.Longitude;
            double breite = geo.Latitude;

            if (breite < MIN_NORD || breite > MAX_NORD || laenge < MIN_OST || laenge > MAX_OST)
            {
                throw new ArgumentException("ERROR_GK_OUT_OF_RANGE");
            }

            // Datum muss eventuell erst nach Potsdam transformiert werden.
            if (geo.Datum == GeoDatum.WGS84)
            {
                geo.SetDatum(GeoDatum.Potsdam);
            }

            // Koeffizienten für Länge Meridianbogen
            double koeff0 = POL * (Math.PI / 180) * (1 - 3 * EXZENT2 / 4 + 45 * EXZENT4 / 64 - 175 * EXZENT6 / 256 + 11025 * EXZENT8 / 16384);
            double koeff2 = POL * (-3 * EXZENT2 / 8 + 15 * EXZENT4 / 32 - 525 * EXZENT6 / 1024 + 2205 * EXZENT8 / 4096);
            double koeff4 = POL * (15 * EXZENT4 / 256 - 105 * EXZENT6 / 1024 + 2205 * EXZENT8 / 16384);
            double koeff6 = POL * (-35 * EXZENT6 / 3072 + 315 * EXZENT8 / 12288);

            // Breite (Rad)
            double breiteRad = breite * Math.PI / 180;

            double tangens1 = Math.Tan(breiteRad);
            double tangens2 = Math.Pow(tangens1, 2);
            double tangens4 = Math.Pow(tangens1, 4);
            double cosinus1 = Math.Cos(breiteRad);
            double cosinus2 = Math.Pow(cosinus1, 2);
            double cosinus3 = Math.Pow(cosinus1, 3);
            double cosinus4 = Math.Pow(cosinus1, 4);
            double cosinus5 = Math.Pow(cosinus1, 5);

            double eta = EXZENT2 * cosinus2;

            // Querkrümmung
            double qkhm = POL / Math.Sqrt(1 + eta);

            // Länge des Meridianbogens
            double lmbog = koeff0 * breite + koeff2 * Math.Sin(2 * breiteRad) + koeff4 * Math.Sin(4 * breiteRad) + koeff6 * Math.Sin(6 * breiteRad);

            // Differenz zum Bezugsmeridian
            int    kfakt    = (int)((laenge + 1.5) / 3);
            int    merid    = kfakt * 3;
            double dlaenge1 = (laenge - merid) * Math.PI / 180;
            double dlaenge2 = Math.Pow(dlaenge1, 2);
            double dlaenge3 = Math.Pow(dlaenge1, 3);
            double dlaenge4 = Math.Pow(dlaenge1, 4);
            double dlaenge5 = Math.Pow(dlaenge1, 5);

            // Hochwert, Rechtswert
            double hoch   = (lmbog + qkhm * cosinus2 * tangens1 * dlaenge2 / 2 + qkhm * cosinus4 * tangens1 * (5 - tangens2 + 9 * eta) * dlaenge4 / 24);
            double rechts = (qkhm * cosinus1 * dlaenge1 + qkhm * cosinus3 * (1 - tangens2 + eta) * dlaenge3 / 6 + qkhm * cosinus5 * (5 - 18 * tangens2 + tangens4) * dlaenge5 / 120 + kfakt * 1e6 + 500000);

            return(new GaussKrueger(rechts, hoch));;
        }
Example #2
0
        /// <summary><para>Die Funktion wandelt geographische Koordinaten (Länge/Breite) eines <see cref="GeoSystem.Geographic"/>-Objektes 
        /// in ein <see cref="GeoUtility.GeoSystem.GaussKrueger">GaussKrueger</see>-Objekt um.
        /// <para>Die Funktion ist nur für interne Berechnungen bestimmt.</para></para></summary>
        /// <remarks><para>
        /// Hintergründe zum Problem der Koordinatentransformationen sowie entsprechende mathematische 
        /// Formeln können den einschlägigen Fachbüchern oder dem Internet entnommen werden.<p />
        /// Quellen: 
        /// Bundesamt für Kartographie und Geodäsie<br />
        /// <a href="http://www.bkg.bund.de" target="_blank">http://www.bkg.bund.de</a><br />
        /// <a href="http://crs.bkg.bund.de" target="_blank">http://crs.bkg.bund.de</a><br />
        /// </para></remarks>
        /// 
        /// <param name="geo"><see cref="GeoSystem.Geographic"/>-Objekt (<see cref="GeoUtility.GeoSystem.Helper.GeoDatum.Potsdam">Potsdam-Datum</see>)</param>
        /// <returns>Ein <see cref="GeoUtility.GeoSystem.GaussKrueger "/>-Objekt.</returns>
        internal GaussKrueger WGSGK(Geographic geo)
        {

            double laenge = geo.Longitude;
            double breite = geo.Latitude;

            if (breite < MIN_NORD || breite > MAX_NORD || laenge < MIN_OST || laenge > MAX_OST)
            {
                throw new ErrorProvider.GeoException(new ErrorProvider.ErrorMessage("ERROR_GK_OUT_OF_RANGE"));
            }

            // Datum muss eventuell erst nach Potsdam transformiert werden.
            if (geo.Datum == GeoDatum.WGS84) geo.SetDatum(GeoDatum.Potsdam);

            // Koeffizienten für Länge Meridianbogen
            double koeff0 = POL * (Math.PI / 180) * (1 - 3 * EXZENT2 / 4 + 45 * EXZENT4 / 64 - 175 * EXZENT6 / 256 + 11025 * EXZENT8 / 16384);
            double koeff2 = POL * (-3 * EXZENT2 / 8 + 15 * EXZENT4 / 32 - 525 * EXZENT6 / 1024 + 2205 * EXZENT8 / 4096);
            double koeff4 = POL * (15 * EXZENT4 / 256 - 105 * EXZENT6 / 1024 + 2205 * EXZENT8 / 16384);
            double koeff6 = POL * (-35 * EXZENT6 / 3072 + 315 * EXZENT8 / 12288);

            // Breite (Rad)
            double breiteRad = breite * Math.PI / 180;

            double tangens1 = Math.Tan(breiteRad);
            double tangens2 = Math.Pow(tangens1, 2);
            double tangens4 = Math.Pow(tangens1, 4);
            double cosinus1 = Math.Cos(breiteRad);
            double cosinus2 = Math.Pow(cosinus1, 2);
            double cosinus3 = Math.Pow(cosinus1, 3);
            double cosinus4 = Math.Pow(cosinus1, 4);
            double cosinus5 = Math.Pow(cosinus1, 5);

            double eta = EXZENT2 * cosinus2;

            // Querkrümmung
            double qkhm = POL / Math.Sqrt(1 + eta);

            // Länge des Meridianbogens
            double lmbog = koeff0 * breite + koeff2 * Math.Sin(2 * breiteRad) + koeff4 * Math.Sin(4 * breiteRad) + koeff6 * Math.Sin(6 * breiteRad);

            // Differenz zum Bezugsmeridian
            int kfakt = (int)((laenge + 1.5) / 3);
            int merid = kfakt * 3;
            double dlaenge1 = (laenge - merid) * Math.PI / 180;
            double dlaenge2 = Math.Pow(dlaenge1, 2);
            double dlaenge3 = Math.Pow(dlaenge1, 3);
            double dlaenge4 = Math.Pow(dlaenge1, 4);
            double dlaenge5 = Math.Pow(dlaenge1, 5);

            // Hochwert, Rechtswert
            double hoch = (lmbog + qkhm * cosinus2 * tangens1 * dlaenge2 / 2 + qkhm * cosinus4 * tangens1 * (5 - tangens2 + 9 * eta) * dlaenge4 / 24);
            double rechts = (qkhm * cosinus1 * dlaenge1 + qkhm * cosinus3 * (1 - tangens2 + eta) * dlaenge3 / 6 + qkhm * cosinus5 * (5 - 18 * tangens2 + tangens4) * dlaenge5 / 120 + kfakt * 1e6 + 500000);

            return new GaussKrueger(rechts, hoch); ;
        }