Problem bei Umrechnung von Pulkovo 1942 in WGS84 (Geodäsie/Vermessung)

Chris88 @, Friday, 24.03.2017, 11:00 (vor 2589 Tagen)

Hallo,

ich habe ein Problem bei einer Koordinatentransformation.
Ich habe Koordinaten im GaussKrüger Format (Rechtswert/Hochwert) im Quellkoordinatensystem Pulkovo 1942 (Krassovsky). Ich würde diese gerne ins WGS84 transformieren.

Zum Vorgehen:
1.) Umwandeln von GaussKrüger Koordinaten in Geo Koordinaten
2.) Umwandeln von Geographischen Koordinaten in Geozentrische Koordinaten
3.) Speziallfall Molodensky-Badekas Tranformation
4.) Umwandeln von Geozentrischen Koordinaten in Geographische Koordinaten

Ich nehme als Referenz folgende Online-Transformation:
https://epsg.io/transform#s_srs=2399-1675&t_srs=4326&x=5389306.9210650&y=5823166.2710200

Meine Daten:
Rechtswert: 5389306.921065
Hochwert: 5823166.27102

Was ich erhalten möchte:
Längengrad: 13.3672138°
Breitengrad: 52.5249447°

1.)

        a = 6378245;
        f = 1/293.3;
        c = a / (1 - f);

        // Quadrat der zweiten numerischen Exzentrizität
        ex2 = (2 * f - f * f) / ((1 - f) * (1 - f));
        ex4 = ex2 * ex2;
        ex6 = ex4 * ex2;
        ex8 = ex4 * ex4;

        // Koeffizienten zur Berechnung der geographischen Breite aus gegebener
        // Meridianbogenlänge
        e0 = c * (pi / 180) * (1 - 3 * ex2 / 4 + 45 * ex4 / 64 - 175 * ex6 / 256 + 11025 * ex8 / 16384);
        f2 =            (180 / pi) * (3 * ex2 / 8 - 3 * ex4 / 16 + 213 * ex6 / 2048 - 255 * ex8 / 4096);
        f4 =                          (180 / pi) * (21 * ex4 / 256 - 21 * ex6 / 256 + 533 * ex8 / 8192);
        f6 =                                        (180 / pi) * (151 * ex6 / 6144 - 453 * ex8 / 12288);

        // Geographische Breite bf zur Meridianbogenlänge gf = hw
        sigma = (northing) / e0;
        sigmr = sigma * pi / 180;
        bf = sigma + f2 * Math.sin(2 * sigmr) + f4 * Math.sin(4 * sigmr) + f6 * Math.sin(6 * sigmr);

        // Breite bf in Radianten
        br = bf * pi / 180;
        tan1 = Math.tan(br);
        tan2 = tan1 * tan1;
        tan4 = tan2 * tan2;

        cos1 = Math.cos(br);
        cos2 = cos1 * cos1;

        etasq = ex2 * cos2;

        // Querkrümmungshalbmesser nd
        nd = c / Math.sqrt(1 + etasq);
        nd2 = nd * nd;
        nd4 = nd2 * nd2;
        nd6 = nd4 * nd2;
        nd3 = nd2 * nd;
        nd5 = nd4 * nd;

        // Längendifferenz dl zum Bezugsmeridian lh
        kz = (int)(easting / 1e6);
        lh = kz * 3;
        dy = (easting - (kz * 1e6 + 500000));
        dy2 = dy * dy;
        dy4 = dy2 * dy2;
        dy3 = dy2 * dy;
        dy5 = dy4 * dy;
        dy6 = dy3 * dy3;

        b2 = -tan1 * (1 + etasq) / (2 * nd2);
        b4 = tan1 * (5 + 3 * tan2 + 6 * etasq * (1 - tan2)) / (24 * nd4);
        b6 = -tan1 * (61 + 90 * tan2 + 45 * tan4) / (720 * nd6);

        l1 = 1 / (nd * cos1);
        l3 = -(1 + 2 * tan2 + etasq) / (6 * nd3 * cos1);
        l5 = (5 + 28 * tan2 + 24 * tan4) / (120 * nd5 * cos1);

        // Geographischer Breite bp und Länge lp als Funktion von Rechts- und
        // Hochwert
        latitude = bf + (180 / pi) * (b2 * dy2 + b4 * dy4 + b6 * dy6);
        longitude = lh + (180 / pi) * (l1 * dy + l3 * dy3 + l5 * dy5)

Nach 1.) erhalte ich folgende Werte:

Längengrad: 13.369036382735441
Breitengrad: 52.525467788632824

2.) Umrechnung in geozentrische Koordinaten:

        pi = Math.PI;
        a = 6378245;
        f = 1/293.3;
        e2 = (2 * f - f * f);

        longitudeRAD = longitude * (pi / 180);
        latitudeRAD = latitude * (pi / 180);

        // Querkrümmungshalbmesser
        double nd = a /sqrt(1 - e2 * sin(latitudeRAD)²);
       
        // Umrechnung in geozentrische Koordinaten
        xp = (nd) * cos(latitudeRAD) * cos(longitudeRAD);
        yp = (nd) * cos(latitudeRAD) * sin(longitudeRAD);
        zp = ((1 - e2wgs84) * nd) * sin(latitudeRAD);

Nach 2.) erhalte ich folgende geozentrische Koordinaten:

xp: 3783403.403351258
yp: 899173.4481951335
zp: 5038677.955342111

3.) Transformation von Pulkovo 1942 zu WGS84


Transformationsparameter:
        dx = 24.0;
        dy = -123.0;
        dz = -94.0;
        rx = -0.02 * (pi / 180);
        ry = 0.25 * (pi / 180);
        rz = 0.13 * (pi / 180);
        scale = 1.1;

        M = 1 + scale*10e-6;

        // 7-Parameter Transformation
        x = xp + (M * (dx - (rz * dy) + (ry * dz)));
        y = yp + (M * ((rz * dx) + dy - (rx * dz)));
        z = zp + (M * ((-ry * dx) + (rx * dy) + dz));

4.) Umrechnung geozentrische Koordinaten in geographische Koordinaten


        rb = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
       
        latitutdeWGS84 = (180 / pi) * Math.atan((z / rb) / (1 - e2wgs84));
        longitudeWGS84 = (180 / pi) * Math.atan(y / x);

Hier meine Frage:
Laut https://epsg.io/1032-method multipliziere ich die Quellkoordinaten mit den Rotationen und M und verschiebe dann um dx,dy,dz.
Mache ich es so, erhalte ich die folgenden Werte:

52.27755746434763°, 13.447067545543165°

Wenn ich wie oben in 3.) beschrieben dx,dy und dz rotiere und mit M multiplizieren und dann auf xp,yp,zp addiere erhalte ich folgende Werte:

52.52501509125434°, 13.367192233116334°

Ersteres macht mehr Sinn und ist ja auch so definiert. Die Werte sehen umgedreht allerdings besser aus.

Die unteren Werte haben eine Distanz von 8m zum erwarteten Punkt. Ich hätte es gerne noch genauer und vermute ich habe irgendwo einen Denkfehler.

Ich wäre über jegliche Anregung dankbar!


gesamter Thread:

 RSS-Feed dieser Diskussion