Seemeilen & Mercatorprojektion

Hallo liebe Community,
nach langer Zeit melde ich mich wieder zurück. Ich sitze gerade an einem mathematischen Problem bei dem ihr mir vllt helfen könnt. Ich möchte gerne einen Kreis zeichnen. Die Koordinate für den Mittelpunkt besteht aus einem Längen- und Breitengrad. Diese Koordinate rechne ich via Mercatorprojektion um. Dann habe ich noch einen Radius der in Seemeilen gegeben ist. Diesen multipliziere ich mit 1,852216 und erhalte den Radius in KM. Jetzt habe ich das Problem diese beiden Koordinaten in einen Zusammenhang zu bringen. Wie kann ich den Radius mit der Mercatorprojektion umrechnen, damit ich in den Kreis in einem Koordinatensystem zeichnen kann ?

Da Mercator verzerrt musst Du ein “Ei” zeichnen. Dir wird vermutlich nicht anders übrig bleiben als ein 20-Eck oder ein 30-Eck zu kreieren und jeden Punkt einzeln ausrechnen.

Wie gross ist denn der Kreis? Mercator bildet ja hinreichend kleine Kreise wieder auf Kreise ab, deshalb sind Kreisverkehre bei OSM immer rund, egal ob sie in Helsinki oder Lima sind. Bei der Wikipedia gibts dazu ein Bild mit projizierten Kreisen auf einer Weltkarte. Der Kreis wird nur grösser (um den Faktor 1/cos(Breitengrad) glaub ich…), aber nicht unförmiger, solange er eben nicht zu gross wird.

Was “hinreichend klein” ist, muss man halt festlegen, z.B. ob Du Kreisverkehre oder Reichweiten von Langstreckenflugzeugen willst. Im zweiten Fall würde ich auch ein Vieleck rechnen…

Das da sind Kreise um 50,10 mit 100 bis 2000km Radius, hilft evtl. beim Abschätzen:

Edit: Umgekehrt stell ichs mir gerade viel schwieriger vor: Wie kommt man denn zu einem Kreis auf einer Kugeloberfläche um lat0/lon0, ausgedrückt in lat/lon?

hmm, ich habe gerade probleme eure antworten auf meinen fall zu übertragen. im grunde möchte ich einen kreis zeichnen irgendwo auf einer mercatorkarte. ich habe die koordinaten für den mittelpunkt des kreises die in grad angegeben sind. damit der punkt auf der mercatorkarte gezeichnet werden kann, habe ich diesen mit der mercatorprojektion umgerechnet. nun habe ich noch den radius des kreises in der einheit seemeilen. 1 seemeile sind 0,01666666666666666666666666666667 grad. also muss ich doch einfach die seemeilen in grad umwandeln und dann mit der mercatorformel zur berechnung eines breitengrades in mercatorkoordinaten umrechnen ?

Wie gesagt, im kleinen Massstab bleibt der Kugelkreis auf der Mercatorkarte ein Kreis.

Du musst also nur mit den Mercatorformeln die lat-lon Koordinate der Kreismitte in Kartenkoordinaten
umrechnen. Der Radius auf der Karte ergibt sich aus dem Kartenmassstab.
(Kartenbereich ist zB 2 km breit, dann muss ein Radius 500m Kreis halb so breit
sein wie die Karte).

Chris

Mal überschlägig für unsere Kacheln auf einer kugeligen (statt einem Erdellipsoid) Welt gerechnet mit 1Seemeile=1Bogenminute am Äquator:

Der Äquator ist im Zoom=0 256 Pixel lang, in der echten Welt 36060=21600 Meilen. Der 50. Breitengrad wird ebenfalls auf 256 Pixel abgebildet. In echt ist er nur 21600cos(50)=13884 Meilen lang.

Mit jeder Zoomstufe wird die Abbildung verdoppelt. Bei Zoom=1 sinds 512 Pixel … bei Zoom=7 ist die Weltkarte 32768 Pixel breit. Am 50. Breitengrad entsprechen also 13884 Meilen 32768 Pixel und ein Pixel sind 0.4237 Meilen.

Ein 60-Meilen-Kreis um den 50. Breitengrad hätte also in dieser Zoomstufe einen Radius von 60/0.4237=142 Pixel.

Und jetzt zum Problem mit der verzerrenden Abbildung, wo die Kreise nach Norden immer größer werden:

Ein Flugzeug, das vom 50. Breitengrad aus 60 Meilen nach Norden fliegt, landet in der echten Welt am 51. Breitengrad. Der 51. Breitengrad hat aber nicht mehr den Masstab 0.4237 Meilen/pixel. Der 51 Breitengrad ist nämlich nur 21600*cos(51)=13593 Meilen lang und wird bei Merctorprojektion trotzdem auf 32768 Pixel abgebildet. Dort ist der Masstab also 0.4148 Meilen/Pixel und ein Kreis um den 51. Breitengrad hätte 145 Pixel Radius.

Das sähe merkwürdig aus, wenn man Reichweiten von Flugzeugen angibt. Flugzeuge von südlichen Flughäfen würden Landeplätze im Norden nicht erreichen, in umgekehrter Richtung würde es gehen. Also entweder malst Du 60-Meilen-Kreise im Zoom=7 mit Strichbreite 10 oder Du musst kleinere Kreise nehmen oder ab einigen zig Meilen doch ein Vieleck ausrechnen…

Also ich habe den Kreismittelpunkt bereits umgerechnet. Meine Karte hat einen Maßstab von 1:500.000 (1cm = 5km). Der zu zeichnende Kreis hat einen Radius von 2 Seemeilen. Wie groß müsste ich diesen nun zeichnen ?

7.4 mm

Bei Karten bezieht sich die Angabe des Maßstabs auf den Mittelpunkt des Kaetenblatts. Am oberen Rand ist er bei Mercatorkarten größer, am unteren kleiner als angegeben.

Das ist mit einfachstem Dreisatz möglich:

  1. Dreisatz:
    1 Seemeile = 1,85 km
    2 Seemeilen = 3,7 km

  2. Dreisatz (Radius)
    5 km = 1 cm
    3,6 km = 0,72 cm.

Aber, wie hier schon genannt, mußt Du “eigentlich” ein Ei zeichnen und keinen Kreis. maxbe hat die “Eier” ja schon perfekt gepostet.

Da jedoch die Abweichung der Ei-Form von der Kreisform bei nur 1,85 Kilometer Radius so minimal ist, kannst Du bei so Mini-Radien auch einfach einen Kreis zeichnen, das wird keiner merken. Vermutlich ist die Abweichung sogar kleiner als 1 Pixel (Je nach Deiner verwendeten Auflösung natürlich)

Hallo marvek,

Das ist mathematisch exakt gesehen falsch!

Was Du wahrscheinlich sagen wolltest:

Für kleine Radien ist die Abbildung eines Kreises durch die Mercatorprojektion in guter Näherung wiederum ein Kreis.

Genauso ist es!

Rechenweg:
2 Seemeilen= 3704m
3704m : 500.000= 7,408mm

Das stimmt allerdings nur für den Äquator!
z.B. auf der geografischen Breite von 60° muß er (1/cos(60) = 1/0.5 = 2) doppelt so groß sein!
Oder allgemein für die Breite x musst Du den Radius mit 1/cos(x) multiplizieren!

Bezüglich des relativen Fehlers habe ich mir ein kleines Perl-Script zusammengehackt:


use Math::Trig;

sub DegToRad
{
    return pi * shift() / 180;
}

sub relativer_fehler
{
    my ($lat, $radius)= @_;
    my $y0= log(tan(DegToRad($lat        )) + sec(DegToRad($lat        )))/2/pi;
    my $y1= log(tan(DegToRad($lat+$radius)) + sec(DegToRad($lat+$radius)))/2/pi;
    my $n0= 1/cos(DegToRad($lat))/360 * $radius;
    printf("Relativer Fehler bei Breite %5.1lf Grad und Radius %3.1lf Grad: %10.7lf%%\n", $lat, $radius, abs((($n0/($y1-$y0))-1)*100) );
}


relativer_fehler( 0.0, 0.1);
relativer_fehler( 0.0, 1.0);
relativer_fehler(45.0, 0.1);
relativer_fehler(45.0, 1.0);
relativer_fehler(60.0, 0.1);
relativer_fehler(60.0, 1.0);
relativer_fehler(85.0, 0.1);
relativer_fehler(85.0, 1.0);

was folgendes ausgibt


Relativer Fehler bei Breite   0.0 Grad und Radius 0.1 Grad:  0.0000508%
Relativer Fehler bei Breite   0.0 Grad und Radius 1.0 Grad:  0.0050771%
Relativer Fehler bei Breite  45.0 Grad und Radius 0.1 Grad:  0.0873427%
Relativer Fehler bei Breite  45.0 Grad und Radius 1.0 Grad:  0.8803251%
Relativer Fehler bei Breite  60.0 Grad und Radius 0.1 Grad:  0.1512770%
Relativer Fehler bei Breite  60.0 Grad und Radius 1.0 Grad:  1.5243488%
Relativer Fehler bei Breite  85.0 Grad und Radius 0.1 Grad:  1.0008612%
Relativer Fehler bei Breite  85.0 Grad und Radius 1.0 Grad: 10.3495911%

D.h. bei Breite 60 Grad und einem Radius von 6 Seemeilen(=0.1 Grad) gilt: Wenn diese 0.1 Grad 660 Pixel entsprechen, dann liegst Du schon mit 1 Pixel daneben.

Schöne Grüße

PA94

Wenn eine Karte nicht wirklich völlig verkorkst ist, bezieht sich der Maßstab auf die Kartenmitte. Bei Papier war das “schon immer” so, bei Online-Karten hat sich das glücklicherweise auch eingebürgert. Deshalb ruckelt die Maßstabsskala bei openstreetmap.org, wenn man die Karte in Nord-Süd-Richtung verschiebt.

Erstmal ein großes Dankeschön für alle Antworten. Ich bin noch recht neu auf dem Gebiet, deshalb entschuldigt mein Halbwissen. Zusammenfassend würde ich nun folgendermaßen Vorgehen :

  1. Den Mittelpunkt des Kreises mit den geografischen Koordinaten lon/lat mit der Mercatorprojektion umrechnen
  2. Radius von der Einheit Seemeilen in die Einheit Km umrechnen, da meine Karte einen Maßstab 1cm:500.000m , also 1cm:5km hat
  3. Verzerrungsfaktor für lat errechnen mit 1/cos(lat)
  4. Verzerrungsfaktor mit Radius multiplizieren

Jetzt stelle ich mir nur die Frage warum man nur den Breitengrad für den Radius mit einbezieht, was ist mit dem Längengrad xD ?

Ja. Punkt 3 und 4 kannst du dir sparen, wenn der Maßstab für die Gegend des Kreises gilt (wegen Lage in der Kartenmitte oder weil die Karte so klein ist, dass das egal ist). Falls er nicht gilt, ist der Verzerrungsfaktor

cos(Breitengrad_an_dem_der_Maßstab_gilt)/cos(Breitengrad_vom_Mittelpunkt_des_Kreises)

Für den Fall, dass der Maßstab am Äquator gilt, so wie PA95 schreibt, ist der Faktor 1/cos(lat)

Bei Mercator hängt die Verzerrung nur vom Breitengrad ab. Alles was auf der gleichen Breite liegt wird im gleichen Maße vergrößert dargestellt im Vergleich zu äquatornahen Gegenden. Der Längengrad spielt dabei keine Rolle (deshalb ist die Karte auch viereckig und nicht oval).

Meine Karte bezieht sich auf die gesamte Erdkugel. Ich habe später vor eine Funktion einzubauen bei der man zoomen kann, also im Grunde eine Veränderung des Maßstabs von 1:500.000 nach 1:200.000 oder 1.100.000. Wie gesagt ich verstehe noch nicht alle Zusammenhänge, deshalb wäre es sehr nett mir nochmal etwas ausführlicher zu erklären warum Punkt 3 und 4 für meine Berechnung nicht wichtig ist. Meinst du mit Kartenmitte die zentrale Lage von Deutschland ?

Bsp.:

Radius = 2 Seemeilen

2 * 1.852216 * 5

seemeilen * km * maßstabsfaktor

  1. Fall:

Wenn Du Dir eine Autokarte “Baden-Württemberg 1 : 200 000” kaufst, gilt dieses “1:200000” für die Mitte der Karte, also ungefähr für Stuttgart bei 48.5°N. Falls Dein Kreis um Stuttgart gemalt werden soll, musst Du nur “Entfernung mal Maßstab” rechnen.

2 Seemeilen in Stuttgart: 21852216mm 1/200000 =18.5mm

Sollte Dein Kreis am unteren Kartenrand liegen, sagen wir in Bregenz bei 47.5°N, musst Du den Korrekturfaktor cos(48.5)/cos(47.5) einbauen. Oder halt überlegen, ob diese 2% Abweichung für Dich interessant sind:

2 Seemeilen in Bregenz: 21852216mm 1/200000 * cos(48.5)/cos(47.5) =18.2mm

  1. Fall:

Wenn Du Dir die grosse Autokarte “Die Welt 1 : 200 000” kaufst, gilt “1:200000” auch für die Mitte, also am Äquator. Für alles, was weit weg ist vom Äquator musst Du den Korrekturfaktor einrechnen.

2 Seemeilen am Äquator: 21852216mm 1/200000 =18.5mm

2 Seemeilen in Bregenz: 21852216mm 1/200000* cos(0)/cos(47.5) =27.42mm

2 Seemeilen in Stuttgart: 21852216mm 1/200000* cos(0)/cos(48.5) =27.95mm

2 Seemeilen am Nordkap: 21852216mm 1/200000* cos(0)/cos(71.2) =57.47mm

Aus diesen Werten wird evtl auch klar, warum es Sinn hat, auf eine Karte von Baden-Württemberg einen Maßstab zu drucken, der stimmt halt dann maximal um 2% nicht. Auf einer Weltkarte ist das eher sinnfrei…