Seite 1 von 1

PHP/VB2005 - Transformieren von Koordinaten unterschiedlich

Verfasst: 25.10.2008 01:13
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

Verfasst: 25.10.2008 01:44
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)


Verfasst: 25.10.2008 01:48
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.

Verfasst: 26.10.2008 21:32
von NicTheQuick
Vielleicht rechnet VB auch mit Grad und nicht im Bogenmaß.