# Transformation und Darstellung von Koordinaten



## BlackChocobo (26. Jul 2014)

Hallo,

ich hoffe, dass mir jemand bei folgendem Problem helfen kann:

Ich möchte eine Karte mit Punkten (repräsentieren Städte) zeichnen, die auf Längen- und Breitengrad-Informationen basieren. Die Daten für Grenzen und Städte habe ich bereits. 
Beispiel für den Knoten Berlin: Latitude: 52.516318, Longitude: 13.393183.
Die Größe der Karte soll 1024x768 Pixel betragen.

Meine Recherche hat ergeben, dass vorher eine Transformation der Koordinaten erfolgen muss. Dafür wollte ich die Affine Transformation nutzen, für die es in Java auch bereits eine entsprechende Umsetzung gibt (java.awt.geom.AffineTransform.AffineTransform()). Meine Frage ist nun, wie ich die Verhältnisse oder den Faktor bestimmte, damit richtig transformiert wird. Ich möchte, dass die Grenzen und Städte im richtigen Verhältnis zueinander auf 1024x768 abgebildet werden. 

Ich hoffe, ich habe das einigermaßen verständlich ausgedrückt, ansonsten einfach nochmal nachfragen.

Grüße,
BlackChocobo


----------



## knilch (27. Jul 2014)

Hi,
hier ist mal ein Ansatz:
Du musst dir erst mal Gedanken machen, wie gross die Karte sein wird, die du auf 1024X768 projizieren möchtest. Wenn du z.B. ganz Deutschland auf diese Fläche projizieren möchtest, wird die Karte so klein, dass sie nicht mehr lesen kannst.
Du musst das ganze eingrenzen.
Wenn du z.B. ein Bundesland abbilden möchtest, dann musst du die Koordinaten max & min Latitude sowie max & min Longitude vom Bundesland nehmen und diese Punkte so auf die Fläche 1024X768 skalieren, damit du das ganze Bundesland abbilden kannst. 
Dabei nimmst du die Koordinaten und bestimmst die Breite und Höhe. Danach berechnest du einen Skalierungsfakor für die Höhe und Breite und verwendest diese Skalierungsfaktoren beim Zeichnen der Punkte.
Dabei wirst du vermutlich nicht glücklich werden, da die Fläche sehr klein ist. Eventuell musst eine grössere Fläche nehmen und diese zoombar machen.


----------



## BlackChocobo (27. Jul 2014)

Hey knilch,

erstmal danke für die Antwort. Du hast vermutlich Recht mit der kleinen Bildgröße. Aber wenn ich das überhaupt erstmal gezeichnet bekomme, kann ich ja noch rumexperementieren und alles Schritt für Schritt höherschrauben. Außerdem ist die Vorgabe leider - was die Grenzen betrifft - das komplette Land darzustellen.

Okay, also wenn ich dich richtig verstanden habe, muss ich folgendes machen (ich liste es hier extra nochmal auf, damit du es evtl. korrigieren oder im Optimalfall bestätigen kannst^^):

A = Latitude(max) - Latitude(min) = Gesamtbreite der darzustellenden Fläche
B = Longitude(max) - Longitude(min) = Gesamtlänge der darzustellenden Fläche

C = 1024 (Breite des Bildes, später dann evtl. höher setzen)
D = 768 (Höhe des Bildes, später dann evtl. höher setzen)

Meine beiden Skalierungsfaktoren wären dann A/C und B/D und werden vorm Zeichnen mit den X bzw. Y Koordinaten multipliziert. Und ich glaube A*B wäre dann das, was man als BoundingBox bezeichnet.

Hört sich eigentlich erstmal logisch an. Vielen Dank dafür! Wenns falsch ist, bitte nochmal drauf hinweisen  Ein Zoomen wäre zwar cool, aber die Karte soll als Bild exportiert werden können. Zoomen kann man ja dann, wenn es in einem Grafikprogramm offen ist.


----------



## knilch (28. Jul 2014)

Hi BlackChocobo,
gerne.


> A = Latitude(max) - Latitude(min) = Gesamtbreite der darzustellenden Fläche
> B = Longitude(max) - Longitude(min) = Gesamtlänge der darzustellenden Fläche


Da A und B Längen / Breiten- Koordinaten sind, musst du diese in ein X-Y-Koordinatensystem umwandeln.
Sagen wir Latitude(max) ist x2 (A/2), Latitude(min) ist x1 (-A2), Longitude(max) ist y2 (B/2) und Longitude(min) ist y1 (-B/2).
Die Mitte von A (A/2) ist x0 (0), von B (B/2) ist y0 (0). So bekommst du die Fläche, die du darstellen willst so ausgerichtest, dass in der Bildmitte die Mitte der Karte ist, die du möchtest. Dies erleichtert dann auch die Transformation (Drehung) der Karte (0-360) falls du das noch zusätzlich implementieren möchtest.

Dies könnte dann die Fläche sein, die du darstellen möchtest. Anschliessend, wie du geschrieben hast, die Punkte, die du darstellen willst mit den Skalierungsfaktoren multiplizieren und auf der Fläche positionieren. Dabei musst du die Punkte von links nach rechts und von oben nach unten Zeichnen; in etwa so:

```
canvas.setWidth(mostRightXCoord-mostLeftXCoord);
canvas.setHeight(mostUpperYCoord-mostLowerYCoord);
// points sind dabei die skalierten Punkte, die du darstellen möchtest.
for(Point point in points) {
	double x = canvas.getWidth() + (mostUpperYCoord - point.getX());
	double y = mostRightXCoord - point.getY();
	drawPoint(x1, y1);
	drawLabel(x1, y1, "Das ist die Bezeichnung");
}
```


----------



## Thallius (28. Jul 2014)

Naja wenn man es genau machen will kann man überhaupt nicht mit Lat und Long rechnen sondern muss diese erstmal in eine Entfernnung umrechnen. Da sich die Koordinaten auf einen Ort auf einer Kugel beizehen, kann man nicht eifnach die Differenz aus Lat1 und Lat2 bilden um eine Entfernung zu erhalten. Dazu muss man die Erdkrümmung an der entsprechenden Stelle mit einberechnen (In Äquatornähe ist sie größer als an den Polen). Dafür gibt es beliebig komplizierte Methoden.

Gruß

Claus


----------



## knilch (28. Jul 2014)

> Naja wenn man es genau machen will kann man überhaupt nicht mit Lat und Long rechnen sondern muss diese erstmal in eine Entfernnung umrechnen. Da sich die Koordinaten auf einen Ort auf einer Kugel beizehen, kann man nicht eifnach die Differenz aus Lat1 und Lat2 bilden um eine Entfernung zu erhalten. Dazu muss man die Erdkrümmung an der entsprechenden Stelle mit einberechnen (In Äquatornähe ist sie größer als an den Polen). Dafür gibt es beliebig komplizierte Methoden.


Da stimme ich mit dir überein.
Ich denke, für einen ersten Kontakt mit der Darstellung von Koodinaten ohne Hilfsmittel wie google-maps etc. kann dies sicher mal versucht werden.
Jedoch wie du geschrieben hast, wird die genaue Darstellung der Punkte nicht so trivial sein, da diese umberechnet werden müssen. Z.b. Gauß-Krüger-System oder UTM-Koordinatensystem Koordinatensystem


----------

