Entfernung zwischen Postleitzahlen berechnen

  • VB.NET

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

    Entfernung zwischen Postleitzahlen berechnen

    Hallo,

    ich bin gerade dabei ein kleines Tool zu schreiben mit der man die Entfernung zweier Postleitzahlen berechnen kann.

    Die Daten wie Längengrad und Breitengrad hab ich für jede Postleitzahl in einer Datenbank abgespeichert.

    Das Problem liegt jetzt nun darin, dass ich immer ein falsches Ergebnis bekomme und ich habe keine Ahnung wieso :D.



    VB.NET-Quellcode

    1. Dim ergebnis As Double
    2. Dim Breitegrad1 As String
    3. Dim breitengrad2 As String
    4. Dim Langengrad1 As String
    5. Dim langengrad2 As String
    6. 'Hier zieh ich mir die Daten aus der Datenbank und schreibe sie in die jeweilige Variable. Die Daten kommen in folgendem Format aus der Datenbank:
    7. '...........
    8. 'PLZ1
    9. Breitegrad1 = "50.3413"
    10. Langengrad1 ="7.7145"
    11. 'PLZ2
    12. breitengrad2 = "46.6272"
    13. langengrad2 = "13.3672222"
    14. 'Hier tausche ich den Punkt mit dem Komma, da wenn ich die variablen als Double initialisere solche Werte aus der Datenbank bekomme Breitegrad1 = 503413.0 oder Langengrad1 = 77145.0
    15. 'Deshalb initialisiere ich sie zuerst als String und caste die werte später in ein Double.
    16. Breitegrad1 = Breitegrad1.Replace(".", ",")
    17. breitengrad2 = breitengrad2.Replace(".", ",")
    18. Langengrad1 = Langengrad1.Replace(".", ",")
    19. langengrad2 = langengrad2.Replace(".", ",")
    20. Breitegrad1 = CDbl(Breitegrad1) / 180 * PI
    21. breitengrad2 = CDbl(breitengrad2) / 180 * PI
    22. Langengrad1 = CDbl(Langengrad1) / 180 * PI
    23. langengrad2 = CDbl(langengrad2) / 180 * PI
    24. ergebnis = Sin(Breitegrad1) * Sin(breitengrad2) + Cos(Breitegrad1) * Cos(breitengrad2) * Cos(langengrad2 - Langengrad1)
    25. ergebnis = Acos(ergebnis)
    26. ergebnis = ergebnis * 6378.388



    Bekomme immer etwas mit 580 raus. es sollten aber um die 72 rauskommen.

    Vielleicht findet ja jemand den Fehler :)
    Hi
    woher stammen Sin, Cos und PI? Aus Math?
    Außerdem sollte man wohl CDbl mit Double.Parse ersetzen. Da kannst du dann auch die Kultur mit angeben, mit der konvertiert werden soll: Dim v As Double = Double.Parse(str, System.Globalization.CultureInfo.InvariantCulture)

    Die Erde ist übrigens annähernd ein Ellipsoid, keine Kugel, d.h. du erhältst schon dort ein falsches Ergebnis. Woher hast du die Formel acos(sin(b1) * sin(b2) + cos(b1) * cos(b2) * cos(l2 - l1))?

    Viele Grüße
    ~blaze~
    Ja die stammen aus Math...

    Die Formel habe ich von dieser Seite : kompf.de/gps/distcalc.html
    Die Kugelform bzw. Ellipsoid Form kann außer acht gelassen werden. Weil ich nur Postleitzahlen im deutschen Raum berücksichtigen muss. Da dürfte die Erdkrümmung doch keine so große Rolle spielen?

    Danke für die schnelle Antwort:)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kevin12345“ ()

    zur Entfernungsberechnung habe ich diese Seite gefunden: kompf.de/gps/distcalc.html
    Dort findet sich auch die verwendete Formel wieder.

    Warum das Ergebnis nicht stimmt, kann ich zunächst nicht erkennen, könnte aber vermuten, dass bei der Umwandlung der Wert von String in Double etwas schiefläuft. Hast du per Debugger kontrolliert, ob die Zahlenwerte auch wirklich korrekt in Grad konvertiert wurden, bevor du sie in Radiant umrechnest?

    Ich würde z.B. NIE mit CDbl arbeiten, sondern mit Double.TryParse und InvariantCulture als Schema angeben, dann hast du nicht das Problem mit Punkt und Komma, das du hier erst noch zwingend wechselst.

    Edit: Ach guck, das war ja schon alles thematisiert. Sorry, da ist mein Beitrag doch etwas überflüssig...

    Edit 2 (Nachtrag):
    Ich sehe gerade, dass du die aus dem String "konvertierte" Zahl direkt wieder der Stringvariablen zuweist. Vermutlich liegt da das Problem, weil du jetzt wieder einen String mit Dezimalzeichen hast und diese Strings an die Math-Funktionen verfütterst.
    Tu uns bitte einen Gefallen: Schalte OPTION STRICT auf ON. Korrigiere dann deinen Quelltext so dass er auch mit dieser Option kompiliert und wenn das Problem dann immer noch besteht, meldest du dich nochmal.

    Edit 3:
    Der Fehler muss schon in der Ermittlung der Längen- und Breitengrade liegen. Laut Google-Maps liegen deine Koordinaten in Emsbach, Rheinland-Pfalz (1) und Hermagor, Österreich (2). Die sind durchaus 586 km voneinander entfernt. Bzw. 824 Straßen-Kilometer (laut Google Maps). Keine Ahnung wie du auf 72 kommst oder welche Orte du eigentlich messen wolltest...
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Arby“ ()

    Arby schrieb:

    Ich würde z.B. NIE mit CDbl arbeiten, sondern mit Double.TryParse und InvariantCulture als Schema angeben,

    @Kevin12345 Ich würde nie die Werte als String ablegen, sondern immer direkt als Double.
    Pack die Werte in eine typisierte DataTable, die kannst Du als XML laden und speichern.
    Auch die Datenbank kann Double-Werte als solche abspeichern.
    Rechne immer nur mit Double.
    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!