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:
-
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;
-
Es soll eine Umrechnung in dezimale Winkelangaben möglich sein:
final double breiteDezimal = stuttartBreite.getDezimal();
-
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 Anteil0.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. -
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
Tipp
Nutzen Sie
DecimalFormat
mit den MethodensetMaximumIntegerDigits(int)
undsetMaximumFractionDigits(int)
. -
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. -
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´´
-
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.