Sonnenpositionsberechnung

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Sonnenpositionsberechnung

    Hallo,
    ich bin hier neu im Forum und benötige eure Hilfe. Für meine Datenbankprogrammierung benötige ich noch eine Formel zur Berechnung der Sonnenhöhe in Winkel °, da ich diese Daten offline haben möchte. Derzeit hole ich sie mir aus dem Netz, wandle diese für die Datenbank.



    Gegeben sind Längen- und Breitengrad -> 53.31554440960771, 8.478625842690969 (Brake), sowie Datum und Uhrzeit. Ich wäre für eine komplette Formel bzw. VB-Code, wo ich die gegebenen Daten nur eintragen muss, sehr dankbar.
    Vielleicht kann mir hier jemand helfen?

    Gruß
    Michael
    Willkommen im Forum.

    Nach ein wenig Recherche komm ich über volker-quaschning bei den Begriffen NREL SOLPOS, DIN 5034 und SUNAE an
    Bei ersterem gibt's sogar ne C-Quellcodedatei
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,
    auf diesen Seite war ich bereits. Die Formeln sind leider zu hoch für mich. Habe diese versucht im VB zu verarbeiten, bekomme aber immer falsche Ergebnisse heraus.


    VB.NET-Quellcode

    1. 'Quelle: http://www.geoastro.de/SME/tk/index.htm
    2. 'Quelle: https://de.sci.astronomie.narkive.com/EXoOeuaU/sonnenposition-berechnen-und-werte-parallel-ausgeben
    3. Private Sub FormelAnwenden()
    4. Dim w As Integer = 1 'unbekannte Varable und Typ
    5. deklin = -23.45 * Math.Cos(K * 360 * (Tageszahl + 10) / 365)
    6. zeitgleichung = 60 * (-0.171 * Math.Sin(0.0337 * Tageszahl + 0.465) - 0.1299 * Math.Sin(0.01787 * Tageszahl - 0.168))
    7. stundenwinkel = 15 * (Now.ToString("HH") + Now.ToString("MM") / 60 - (15.0 - Laengengrad) / 15.0 - 12 + zeitgleichung / 60)
    8. x = Math.Sin(K * Breitengrad) * Math.Sin(K * deklin) + Math.Cos(K * Breitengrad) * Math.Cos(K * deklin) * Math.Cos(K * stundenwinkel) 'Höhe
    9. y = -(Math.Sin(K * Breitengrad) * Math.Sin(K * w) - Math.Sin(K * deklin)) / (Math.Cos(K * Breitengrad) * Math.Sin(Math.Acos(Math.Sin(K * w))))
    10. lblhoehe.Text = Math.Asin(x) / K
    11. lblazimut.Text = Math.Acos(y) / K
    12. End Sub
    13. Private Sub CalcJD()
    14. Dim y, m, d As Integer, h As Double
    15. If Now.ToString("MM") > 2 Then
    16. y = Now.ToString("yyyy")
    17. m = Now.ToString("MM")
    18. Else
    19. y = Now.ToString("yyyy") - 1
    20. m = Now.ToString("MM") + 12
    21. End If
    22. d = Now.ToString("d")
    23. h = Now.ToString("HH") / 24 + Now.ToString("mm") / 1440 + Now.ToString("ss") / 86400
    24. Dim a As Integer = y \ 100
    25. Dim b As Integer = 2 - a + a \ 4
    26. Dim JD As Double = Int(365.25 * (y + 4716)) + Int(30.6001 * (m + 1)) + d + h + b - 1524.5
    27. lblJD.Text = JD.ToString("#,0.0000000")
    28. Tageszahl = JD.ToString("#,0.0000000")
    29. Rest(JD)
    30. FormelAnwenden()
    31. End Sub
    32. Private Sub Rest(ByVal JD As Double)
    33. Dim n As Double = JD - 2451545
    34. Dim L As Double = 280.46 + 0.9856474 * n
    35. L = L - Int(L / 360) * 360
    36. Dim g As Double = 357.528 + 0.9856003 * n
    37. g = g - Int(g / 360) * 360
    38. Dim g_ As Double = g * Math.PI / 180
    39. Dim A As Double = L + 1.915 * Math.Sin(g_) + 0.02 * Math.Sin(2 * g_)
    40. Dim A_ As Double = A * Math.PI / 180
    41. Dim E As Double = 23.439 - 0.0000004 * n
    42. Dim E_ As Double = E * Math.PI / 180
    43. Dim Rekt_ As Double = Math.Atan(Math.Cos(E_) * Math.Sin(A_) / Math.Cos(A_))
    44. Dim Rekt As Double = Rekt_ * 180 / Math.PI
    45. If Math.Cos(A_) < 0 Then Rekt += 180
    46. Dim Dekl_ As Double = Math.Asin(Math.Sin(E_) * Math.Sin(A_))
    47. Dim Dekl As Double = Dekl_ * 180 / Math.PI
    48. lblRekt.Text = Rekt.ToString("0.0000°")
    49. lblDekl.Text = Dekl.ToString("0.0000°")
    50. End Sub
    51. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles cmdBerechnen.Click
    52. lblZeitstempel.Text = Now.ToString
    53. CalcJD()
    54. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Michael Strom“ ()

    Ebenfalls: Willkommen im Forum. :thumbup:

    Michael Strom schrieb:

    Ich wäre für eine komplette Formel bzw. VB-Code, wo ich die gegebenen Daten nur eintragen muss, sehr dankbar.
    Herkommen, abgreifen und weg?
    Solche Foren-Mitglieder lieben wir.

    Michael Strom schrieb:

    Die Formeln sind leider zu hoch für mich.
    Glaubst Du, dieselben Formeln sind in einer anderen Programmiersprache einfacher?
    Die beschriebene Mathematik sieht in allen neueren höheren Programmiersprachen praktisch identisch aus.
    Über welche Programmierkenntnisse verfügst Du?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Der C-Code ist sehr ordentlich geschrieben.
    Eine direkte Übersetzung von C nach VB.NET ist nicht empfehlenswert!
    Ich empfehle Dir, diesen zunächst wegen der Nähe der Sprache C zu C# nach C# zu übersetzen.
    Den C#-Code kannst Du dann mit einem Automaten nach VB.NET übersetzen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Michael Strom schrieb:

    VB.NET-Quellcode

    1. Dim w As Integer = 1 'unbekannte Varable und Typ
    Was hat diese Zeile mit dem Sonnenstand zu tun?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    In der angegebenen Quelle ist Dein "unbekanntes w" sehr genau definiert und hat da auch einen viel aussagekräftigeren Namen …
    Da ist ja sogar ne Exceltabelle mit den Formeln drin. Also einfacher ist ja fast nur ne Komplettlösung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Der C-Code mit einer weiteren (verfügbaren) Headerdatei ist in einer halben Stunde nach C# übersetzt, weil gut geschrieben und streng linear. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!