Locatorberechnung im Amateurfunk mit C#

Dieses Tool berechnet die Entfernung sowie die Richtung zwischen zwei Locatorfelder.

Im Amateurfunk werden keine Koordinaten, sondern Locatorfelder genutzt. Dies ist ein Raster über den ganzen Globus. Das Locatorfeld um Berlin und Brandenburg herum hat die Buchstaben und Ziffern JO62. Hinzu kommen noch die Kleinfelder mit den Buchstaben A bis X. Dies sind die Zeilen und Spalten im Rastergitter.

Berlin hat z.B. den Locator JO62QM. (Zeile Q, Spalte M) und noch andere, denn Berlin ist doch ein bisschen größer.

Rom hat den Locator JN61GV und ist von der Stadt Brandenburg an der Havel (JO62GJ) nur 1166 Kilometer entfernt und liegt in 180 Grad (das ist Süden). Der Amateurfunker dreht also seine Antenne auf 180 Grad.

Brandenburg – Rom

Die Entfernungsangaben werden auch bei Wettbewerben (Contesten) genutzt. Dann werden aus den Kilometern – Punkte. Und 1166 Punkte sind schon ein guter Wert.

Ein Download der Installationsdateien findet du hier: DL1RLB/MyLocator · GitHub

Aber dort findest du auch den kompletten C# Code.

GitHub – DL1RLB/MyLocator: Berechnet den Locatorstandort

Das Programm nutzt die Klasse von Yves Goergen, http://unclassified.software/source/maidenheadlocator Copyright (c) 2011 zur Berechnung und  basiert auf einem Perl-Modul von Dirk Koopman, G1TLH, vom 07.11.2002. Quelle: http://www.koders.com/

Die Kompassrose, als freies Tool, wurde in "C# Helper" (http://www.csharphelper.com/howtos/howto_horizontal_compass.html) beschrieben.

In der Form werden zwei Textboxen (Heimatlocator und Ziellocator) angelegt. Das Ergebnis wird in den anderen Textboxen und Labels angezeigt.

Die Klasse „MaidenheadLocator“ berechnet die Entfernung, die Richtung aber auch die Koordinaten werden berechnet. Der Locator kann auch aus den Koordinaten ermittelt werden. Die Werte müssen mit Komma eingetragen werden. Es gibt mehrere Onlinekarten wo der Locator angezeigt werden kann. Mein Beispiel zeigt die Karte von HA8TKS.

        public void Berechnen_Click(object sender, EventArgs e)
        {
            #region Entfernung und Richtung berechnen aus zwei Textfeldern

            // die beiden Locatoreingaben holen und in der Klasse MaidenheadLocator ausrechnen lassen
            double entfernung = MaidenheadLocator.Distance(tbHeimatlocator.Text, tbZiellocator.Text);

            // Richtung berechnen aus den zwei Textfeldern
            double richtung = MaidenheadLocator.Azimuth(tbHeimatlocator.Text, tbZiellocator.Text);

            // Heimatlocator aus dem Textfeld
            string heimatLocator = tbHeimatlocator.Text;

            // Koordinaten vom Lacator aus dem Textfeld des Heimatlocators
            LatLng heimatkoordinaten = MaidenheadLocator.LocatorToLatLng(tbHeimatlocator.Text);

            // Koordinaten vom Lacator aus dem Textfeld des Ziellocators
            LatLng zielkoordinaten = MaidenheadLocator.LocatorToLatLng(tbZiellocator.Text);

            // Breite/Länge in Locator konvertieren
            string myLoc = MaidenheadLocator.LatLngToLocator(52.41, 12.55);

            //Richtungswert auf 2 Kommastellen runden
            tbRichtung.Text = Math.Round(double.Parse(richtung.ToString()), 2).ToString() + " °";
            
            // EntfernungsWert auf 2 Kommastellen runden 
            tbEntfernung.Text = Math.Round(double.Parse(entfernung.ToString()), 2).ToString() + " km";

            // in Textfeld eintragen
            lblZielKoordinaten.Text = zielkoordinaten.ToString(); 
            
            // in Textfeld eintragen
            lblEigeneKoordinaten.Text = heimatkoordinaten.ToString(); 
            
            // umwandeln der Gradanzahl in eine Ganzahlige Zahl
            CurrentValue = Convert.ToInt32(richtung); 
            
            // in Label eintragen
            lblDegrees.Text = CurrentValue.ToString() + " °"; 

            // neuzeichnen der Kompassnadel bei Änderung 
            picHeading.Refresh();
        }
        #endregion

Im Code wird noch der runde Kompass sowie der Zeiger im Kompass gezeichnet. Zusätzlich habe ich eine Regex-Prüfung eingebaut. Denn nicht alle Locatordaten sind richtig. Die ersten beiden Buchstaben vom Locator reichen nur von A bis R und der letzten Buchstaben im Raster ist das X. Das heißt Y und Z führen zu einer Exeption (Absturz des Programms). Bei Eingabe von falschen Zeichen wird der Text rot.

#region Heimatlocator Prüfen auf Richtigkeit der eingegebenen Buchstaben
private void homeLoc_TextChanged(object sender, EventArgs e)
{
    if (new Regex("^[A-R,a-r]{2}[0-9]{2}[A-X,a-x]{2}$").IsMatch(tbHeimatlocator.Text))
    {
        tbHeimatlocator.Enabled = true;
        tbHeimatlocator.ForeColor = Color.Black;
    }
    else
    {
        //MessageBox.Show("Dieser Locator gibt es nicht!");
        tbHeimatlocator.ForeColor = Color.Red;
    }
}
#endregion

Die Messagebox habe ich wieder ausgeschaltet. Denn die kommt bei jedem neuen Buchstaben, weil ich diese Prüfung während der Eingabe prüfen. Das Prüfe ich natürlich auch auf den Ziellocator.

roter Text bei falschem Locator

Jetzt habe ich eine Grundlage für weiter Anpassung und Verbesserungen.

  • Speichern des zuletzt eingegebenen Heimatlocators – Erledigt
  • Locator ermitteln aus den Koordinaten- Erledigt
  • Link zur Anzeige des Locators oder der Koordinaten auf einer Karte- Erledigt
  • Zeiger als ein Beam (Antenne)
  • weitere Gradzahlen in der Kompassrose, z.B. 45 Grad
  • Fehlerbehebung Exeption bei falschen Werten

Wer mehr über Locatoren wissen will schaut bei Wikipedia nach. Dort findet man auch die C# Klasse.

Quellenangaben im Text.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert