PHP/VB2005 - Transformieren von Koordinaten unterschiedlich

Fragen zu allen anderen Programmiersprachen.
Rico
Beiträge: 24
Registriert: 06.09.2005 13:58

PHP/VB2005 - Transformieren von Koordinaten unterschiedlich

Beitrag von Rico »

Hallo,

ich habe in PHP eine Funktion, welche die Koordinaten eines Punktes in Länge und Breite transformiert.
Nun versuche ich in VB2005 genau diese Funktion abzubilden aber VB rechnet ab einer bestimmten Stelle im Code nicht so wie das PHP rechnet.
Der Wert in Variable 'Laenge' und demzufolge auch in Variable 'Laenge_Return' werden nicht wie in PHP berechnet.

Warum ist das so? Verwende ich falsche Datentypen?

Hier der PHP-Code:

Code: Alles auswählen

<?
//gegeben
$rechtswert_gegeben = 4404994;
$hochwert_gegeben = 5667943;

//Konstanten
$n = 0.00167922;
$a = 6378137;
$e = 0.00669438;
$L0= 0.20943951;



// Berechnungen

$rechts = -160.8228 + 0.9999996802134 * ($rechtswert_gegeben + 0.000010079883 * $hochwert_gegeben);
$hoch = 489.0613 + 0.9999996802134 * (-0.000010079883 * $rechtswert_gegeben + $hochwert_gegeben);
$Bf0 = $hoch * (1 + $n) / $a / (1 + (pow($n,2))/4 + (pow($n,4))/64);
$Bf  = $Bf0 + 3/2 * ($n - 9/16 * pow($n,3)) * sin(2*$Bf0) + 21/16 * pow($n,2) * sin(4*$Bf0) + 151/96 * pow($n,3) * sin(6*$Bf0);
$t = tan($Bf);
$nu = $e/(1-$e) * pow(cos($Bf),2); // = nü^2
$NN = $a / sqrt(1 - $e * pow(sin($Bf),2));
$y   = $rechts - 4500000;

$Breite = $Bf - $t/2 * (1+$nu) * pow($y,2)/pow($NN,2) + $t/24*(5 + 3 * pow($t,2) + 6 * $nu - 6 * pow($t,2) * $nu)* pow($y,4)/pow($NN,4) + $t/720 * (61 + 90 * pow($t,2) + 45 * pow($t,4)) * pow($y,6) / pow($NN,6);
$Breite_Return = $Breite * 180 / pi();

$Laenge = $L0 + 1/cos($Breite) * $y/$NN - 1/(6*cos($Breite))*(1-pow($t,2)+$nu)*pow($y,3)/pow($NN,3)+1/120/cos($Breite)*(5+28*pow($t,2)+24*pow($t,4))*pow($y,5)/pow($NN,5)-1/240/cos($Breite)*(61+662*pow($t,2)+1320*pow($t,4)+720*pow($t,6))*pow($y,7)/pow($NN,7);
$Laenge_Return = $Laenge * 180 / pi();


echo "rechtswert gegeben=> $rechtswert_gegeben<br>";
echo "hochwert gegeben=> $hochwert_gegeben<br>";
echo "rechts=> $rechts<br>";
echo "hoch=> $hoch<br>";
echo "Bf0=> $Bf0<br>";
echo "Bf=> $Bf<br>";
echo "t=> $t<br>";
echo "nu=> $nu<br>";
echo "NN=> $NN<br>";
echo "n=> $n<br>";
echo "y=> $y<br>";
echo "Breite=> $Breite<br>";
echo "Breite_Return=> $Breite_Return<br>";
echo "Laenge=> $Laenge<br>";
echo "Laenge_Return=> $Laenge_Return<br>";
?>
Hier der VB-Code:

Code: Alles auswählen

Public Class Umrechnung1
    Const rechtswert_gegeben As Double = 4404994
    Const hochwert_gegeben As Double = 5667943

    Const n As Double = 0.00167922
    Const a As Double = 6378137
    Const e As Double = 0.00669438
    Const L0 As Double = 0.20943951

    Dim Bf0, Bf, t, nu, NN, y, rechts, hoch, Breite, Breite_Return, Laenge, Laenge_Return As Double


    Public Sub New()
        rechts = -160.8228 + 0.9999996802134 * (rechtswert_gegeben + 0.000010079883 * hochwert_gegeben)
        hoch = 489.0613 + 0.9999996802134 * (-0.000010079883 * rechtswert_gegeben + hochwert_gegeben)

        Bf0 = hoch * (1 + n) / a / (1 + (Math.Pow(n, 2)) / 4 + (Math.Pow(n, 4)) / 64)
        Bf = Bf0 + 3 / 2 * (n - 9 / 16 * Math.Pow(n, 3)) * Math.Sin(2 * Bf0) + 21 / 16 * Math.Pow(n, 2) * Math.Sin(4 * Bf0) + 151 / 96 * Math.Pow(n, 3) * Math.Sin(6 * Bf0)
        t = Math.Tan(Bf)
        nu = e / (1 - e) * Math.Pow(Math.Cos(Bf), 2)
        NN = a / Math.Sqrt(1 - e * Math.Pow(Math.Sin(Bf), 2))
        y = rechts - 4500000


        Breite = Bf - t / 2 * (1 + nu) * Math.Pow(y, 2) / Math.Pow(NN, 2) + t / 24 * (5 + 3 * Math.Pow(t, 2) + 6 * nu - 6 * Math.Pow(t, 2) * nu) * Math.Pow(y, 4) / Math.Pow(NN, 4) + t / 720 * (61 + 90 * Math.Pow(t, 2) + 45 * Math.Pow(t, 4)) * Math.Pow(y, 6) / Math.Pow(NN, 6)
        Breite_Return = Breite * 180 / Math.PI


        Laenge = L0 + 1 / Math.Cos(Breite_Return) * y / NN - 1 / (6 * Math.Cos(Breite_Return)) * (1 - Math.Pow(t, 2) + nu) * Math.Pow(y, 3) / Math.Pow(NN, 3) + 1 / 120 / Math.Cos(Breite_Return) * (5 + 28 * Math.Pow(t, 2) + 24 * Math.Pow(t, 4)) * Math.Pow(y, 5) / Math.Pow(NN, 5) - 1 / 240 / Math.Cos(Breite_Return) * (61 + 662 * Math.Pow(t, 2) + 1320 * Math.Pow(t, 4) + 720 * Math.Pow(t, 6)) * Math.Pow(y, 7) / Math.Pow(NN, 7)
        Laenge_Return = Laenge * 180 / Math.PI

        Debug.Print("rechtswert_gegeben ==> " & rechtswert_gegeben.ToString)
        Debug.Print("hochwert_gegeben ==> " & hochwert_gegeben.ToString)

        Debug.Print("rechts ==> " & rechts.ToString)
        Debug.Print("hoch ==> " & hoch.ToString)

        Debug.Print("Bf0 ==> " & Bf0.ToString)

        Debug.Print("Bf ==> " & Bf.ToString)
        Debug.Print("t ==> " & t.ToString)
        Debug.Print("nu ==> " & nu.ToString)
        Debug.Print("NN ==> " & NN.ToString)
        Debug.Print("n ==> " & n.ToString)
        Debug.Print("y ==> " & y.ToString)

        Debug.Print("Breite ==> " & Breite.ToString)
        Debug.Print("Breite_Return ==> " & Breite_Return.ToString)
        Debug.Print("Laenge ==> " & Laenge.ToString)
        Debug.Print("Laenge_Return ==> " & Laenge_Return.ToString)
    End Sub
End Class
Wäre prima, wenn mir jemand erklären kann ...


MfG Rico
Rico
Beiträge: 24
Registriert: 06.09.2005 13:58

Beitrag von Rico »

Hab das gleiche jetzt mit PureBasic versucht ... und ... Ergebnis wie in PHP richtig. Warum macht das VB anders?

Code: Alles auswählen

;gegeben
rechtswert_gegeben.d = 4404994
hochwert_gegeben.d = 5667943

;Konstanten
n.d = 0.00167922
A.d = 6378137
e.d = 0.00669438
L0.d = 0.20943951



;Berechnungen

rechts.d = -160.8228 + 0.9999996802134 * (rechtswert_gegeben + 0.000010079883 * hochwert_gegeben)
hoch.d = 489.0613 + 0.9999996802134 * (-0.000010079883 * rechtswert_gegeben + hochwert_gegeben)
BF0.d = hoch * (1 + n) / A / (1 + (Pow(n,2))/4 + (Pow(n,4))/64)
BF.d  = BF0 + 3/2 * (n - 9/16 * Pow(n,3)) * Sin(2*BF0) + 21/16 * Pow(n,2) * Sin(4*BF0) + 151/96 * Pow(n,3) * Sin(6*BF0)
t.d = Tan(BF)
nu.d = e/(1-e) * Pow(Cos(BF),2)
NN.d = A / Sqr(1 - e * Pow(Sin(BF),2))
y.d   = rechts - 4500000

Breite.d = BF - t/2 * (1+nu) * Pow(y,2)/Pow(NN,2) + t/24*(5 + 3 * Pow(t,2) + 6 * nu - 6 * Pow(t,2) * nu)* Pow(y,4)/Pow(NN,4) + t/720 * (61 + 90 * Pow(t,2) + 45 * Pow(t,4)) * Pow(y,6) / Pow(NN,6)
Breite_Return.d = Breite * 180 / #PI

Laenge.d = L0 + 1/Cos(Breite) * y/NN - 1/(6*Cos(Breite))*(1-Pow(t,2)+nu)*Pow(y,3)/Pow(NN,3)+1/120/Cos(Breite)*(5+28*Pow(t,2)+24*Pow(t,4))*Pow(y,5)/Pow(NN,5)-1/240/Cos(Breite)*(61+662*Pow(t,2)+1320*Pow(t,4)+720*Pow(t,6))*Pow(y,7)/Pow(NN,7)
Laenge_Return.d = Laenge * 180 / #PI


Debug "rechtswert gegeben=>" + StrD(rechtswert_gegeben)
Debug "hochwert gegeben=>" + StrD(hochwert_gegeben)
Debug "rechts=>" + StrD(rechts)
Debug "hoch=>" + StrD(hoch)
Debug "Bf0=>" + StrD(BF0)
Debug "Bf=>" + StrD(BF)
Debug "t=>" + StrD(t)
Debug "nu=>" + StrD(nu)
Debug "NN=>" + StrD(NN)
Debug "n=>" + StrD(n)
Debug "y=>" + StrD(y)
Debug "Breite=>" + StrD(Breite)
Debug "Breite_Return=>" + StrD(Breite_Return)
Debug "Laenge=>" + StrD(Laenge)
Debug "Laenge_Return=>" + StrD(Laenge_Return)

Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ich tippe auf irgendein type-conversion-problem.

irgendwo nimmst du in deinem VB code vielleicht ne integer, wo ne float hingehört, irgendsowas.

... hab jetzt aber keinen trieb, deine formeln durchzuackern, um das problem zu finden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Vielleicht rechnet VB auch mit Grad und nicht im Bogenmaß.
Antworten