Geographische Längen- und Breitenangaben

Vorbereitung

Falls Sie die erste Aufgabe bearbeitet haben, arbeiten Sie einfach an Ihrem Projekt weiter. Ansonsten lesen Sie bitte in der ersten Aufgabe die Anleitung zum Projektimport sowie die weiteren Hinweise zum Hochladen in das Ilias System.

Beschreibung

Implementierung einer Klasse zur Darstellung und Umrechnung von Winkelangaben in geographischen Koordinaten. Die Winkeldarstellung durch Grad, Winkelminuten und -sekunden erlaubt z.B. die Breitenangabe von Stuttgart als 48 Grad, 46 Winkelminuten und 56 Winkelsekunden:

Geographische Breite Stuttgart: 48° 46´ 56´´

Dabei entsprechen:

  • 360° Grad dem Vollkreis.

  • 60´ Winkelminuten einem Grad (1°).

  • 60´´ Winkelsekunden einer Winkelminute (1´).

Neben dieser Grad/Minuten/Sekunden Darstellung gibt es auch die dezimale Graddarstellung: Diese geht ebenfalls von einem Vollkreis zu 360° aus. Allerdings werden die Minuten- und Sekundenanteile als Dezimalbruch angegeben. Die geographische Breite 48° 46´ 56´´ von Stuttgart ergibt sich in dieser Darstellung daher zu:

\[48,782222 = 48 + {46\over 60} + {56 \over {60 \times 60}}\]

Oder allgemein mit Dezimalgrad d, Grad g, Winkelminuten m und Winkelsekunden s:

\[d = g + {m\over 60} + {s \over {60 \times 60}}\]

Aufgaben

Implementieren Sie die bereits vorhandene, bislang leere, Klasse de.hdm_stuttgart.mi.sd1.aufgabe2.Geo. Beachten Sie die Unit Tests in de.hdm_stuttgart.mi.sd1.test.aufgabe2.Test_Geo. Folgende Eigenschaften sollen gelten:

  1. Instanzen von Geo sollen durch Angabe von Grad, Winkelminuten und -sekunden erzeugt werden können:

    final Geo stuttartBreite = new Geo(48, 46, 56);

    Grad, Minuten und Sekunden sollen als int in beliebigen Scopes sichtbar sein:

    ...
    final int grad = stuttartBreite.grad,
           minuten = stuttartBreite.minuten,
          sekunden = stuttartBreite.sekunden;
  2. Es soll eine Umrechnung in dezimale Winkelangaben möglich sein:

    final double breiteDezimal = stuttartBreite.getDezimal();
  3. Eine Instanz von Geo soll alternativ durch Angabe dezimaler Winkelwerte erzeugt werden können:

    final Geo greenwichBreite = new Geo(51.477222);

    Tipp

    Sie müssen zunächst Werte wie 51.477222 in den ganzzahligen Gradanteil 51 und den gebrochenen Anteil 0.477222 zerlegen. Dazu kann die Methode floor() in Zusammenarbeit mit einer cast Operation verwendet werden. Dies erlaubt Ihnen die Umkehrung der Formel \(d = g + {m\over 60} + {s \over {60 \times 60}}\) zur Zerlegung eines Dezimalgradwerts d in Grad, Winkelminuten und -sekunden.

  4. Instanzen von Geo sollen im Standard wie folgt ausgegeben werden:

    final Geo stuttartBreite = new Geo(48.782222);
    System.out.println(stuttartBreite);
    48° 46´ 56´´

    Das Format der Ausgabe soll global für alle Instanzen auf dezimale Graddarstellung umgestellt werden können. Dabei sollen genau sechs Nachkommastellen ausgegeben werden:

    ...
    Geo.nutzeDezimalStandard(true);
    System.out.println(stuttartBreite);
    48.782222
  5. Instanzen von Geo sollen auf Wertgleichheit geprüft werden können:

    final Geo
      g1 =      new Geo(33, 53, 19),
      g2 =      new Geo(45, 22, 13),
      g1_klon = new Geo(33, 53, 19);
    
    System.out.println(g1.equals(g2));
    System.out.println(g1.equals(g1_klon));
    false
    true

    Implementieren Sie auch eine kompatible hashCode() Methode.

  6. Winkelangaben sollen aufsteigend sortierbar sein:

    final Geo
      stuttartBreite = new Geo(48, 46, 56),
      beirutBreite = new Geo(33, 53, 19),
      atlantaBreite = new Geo(33, 44, 56);
    
    final Geo[] breitenAngaben =
      {stuttartBreite, beirutBreite, atlantaBreite};
    
    Arrays.sort(breitenAngaben);
    
    System.out.println("Breitengrade Stuttgart, Beirut und Atlanta"
        + "\naufsteigend sortiert:");
    
    for (final Geo g: breitenAngaben) {
      System.out.println(g);
    }
    Breitengrade Stuttgart, Rom und Greenwich 
    aufsteigend sortiert:
    41° 53´ 30´´
    48° 46´ 56´´
    51° 28´ 38´´
    
  7. Instanzen von Geo sollen unveränderbar (immutable) sein. Der folgende Code soll beispielsweise zu einem Compile time Fehler führen:

    final Geo g = new Geo(22);
    g.sekunden = 44;

Sie finden obige Beispiele als auskommentierten Code in der Klasse de.hdm_stuttgart.mi.sd1.aufgabe2.extra.GeoUsageSample. Sobald Ihre Geo Klasse fertig implementiert ist, können Sie die Kommentare entfernen und sollten bei Ausführung folgendes Ergebnis sehen:

Stuttgart Breite Grad:48
Stuttgart Breite Minuten:46
Stuttgart Breite Sekunden:56

Dezimale Breitenangabe Stuttgart: 48.782222222222224
false

Breitengrade Stuttgart, Beirut und Atlanta
aufsteigend sortiert:
33° 44´ 56´´
33° 53´ 19´´
48° 46´ 56´´

Standarddarstellung Breite Stuttgart:48° 46´ 56´´
Dezimaldarstellung Breite Stuttgart:48.782222
Hochladen Ihrer Lösung in das Klausursystem

Laden Sie die Lösung dieser Aufgabe als gemeinsamen Projekt Export mit der ersten Aufgabe „Klassenmethoden“ gemäß den dortigen Hinweisen hoch. Falls Sie die erste Aufgabe ebenfalls bearbeitet haben, enthält Ihr Upload die Lösungen zu beiden Aufgaben.

Tragen Sie im Freitextfeld weiter unten genau einen der beiden Texte ein:

  • Ich habe die aktuelle Aufgabe bearbeitet und erhoffe dafür Punkte.

  • Ich habe die aktuelle Aufgabe nicht bearbeitet.