Ortskoordinaten und ihre Anwendung
Norbert
- php
Hallo,
vor laengerer Zeit fielen mir ca. 180 Ortsnamen und die dazugehoerigen Koordinaten in die Haende. Da es mich reizte, habe ich ein PNG der BRD gesucht und die Orte dort eingetragen, was nach etwas Bastelei auch ganz gut klappte. Mit der gleichen Methode habe ich auch schon neuere Daten erfolgreich in dieses PNG geschrieben.
Nun zu meinem Problem:
Ich gebe einen Ort vor, z.B. Erfurt, und suche dann alle Orte, die nicht weiter als 33 km von Erfurt entfernt liegen. Trage ich die gefundenen Orte als Punkte in das PNG ein, entsteht jedoch kein Kreis, sondern eine aufrechtes Oval.
Nach etwas gruebeln habe ich auch die Ursache gefunden:
Die Faktoren km/Pixel sind unterschiedlich in X- bzw. Y-Richtung.
Andererseits stimmen sie wie sie sind, denn sonst liegt Marienleuchte in der Ostsee.
Irgendwo muss halt ein Denkfehler sein, ich komme nur nicht drauf.
Vielleicht findet hier ja jemand den Knackpunkt ...
Gruss und Dank
Norbert
Hallo Norbert,
[...] sondern eine aufrechtes Oval.
Nach etwas gruebeln habe ich auch die Ursache gefunden:
Die Faktoren km/Pixel sind unterschiedlich in X- bzw. Y-Richtung.
es sieht so aus, als hättest Du den breitenabhängigen Faktor doppelt drin :-)
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
Nach etwas gruebeln habe ich auch die Ursache gefunden:
Die Faktoren km/Pixel sind unterschiedlich in X- bzw. Y-Richtung.
es sieht so aus, als hättest Du den breitenabhängigen Faktor doppelt drin :-)
hmm,
koenntest Du Deine Vermutung bitte etwas konkretisieren ... danke ...
Gruss und Dank
Norbert
Nur Geduld, junger Norbert ;-)
koenntest Du Deine Vermutung bitte etwas konkretisieren ... danke ...
Es ist eine unheimlich gute Idee, seinen Quellcode zu kommentieren.
// Du setzt hier Skalierungsfaktoren (das Verhältnis von X/Y entspricht ungefähr
// dem Cosinus von 49 Grad, d.h. einem plausiblen Faktor, um Längengrade in
// Deutschland auf Kilometer umzurechnen.
$faktX = 0.593;
$faktY = 0.899;
[...]
// Deine Abfrage läßt vermuten, dass Du in der DB Kilometerangaben gespeichert
// hast, die Du aus den Geokoordinaten ermittelt hast.
$query = "SELECT geoID, ortsname, nrdKm, ostKm FROM geodata4 WHERE ".
"SQRT((nrdKm - $nrdC) * (nrdKm - $nrdC) + (ostKm - $ostC) * (ostKm - $ostC)) < $radius ".
"ORDER BY nrdKm";
[...]
// Dein Bild habe ich mit anderen Deutschlandkarten verglichen, ich konnte
// keine Verzerrung feststellen. Ich hab' allerdings bei meiner kurzen
// Stichprobe keine Angaben über die verwendete Projektion gefunden.
// Auf jeden Fall skalierst Du auf Deinem Bild unterschiedlich, eine gleiche
// Anzahl von Kilometern in Ost-West-Richtung resultiert in einer geringeren
// Pixelanzahl als in Nord-Süd-Richtung.
$psX = floor($faktX * ($ost - $offsX));
$psY = $SRC[1] - floor($faktY * ($nrd - $offsY));
Wenn Deine Städte überall richtig positioniert werden - schließlich passt
Erfurt ganz gut - dann wäre es ein Problem der verwendeten Projektion.
Teste daher Dein Programm mit anderen Landeshauptstädten und Grenzstädten an
der Ost- und Westgrenze. Die Ovalform kommt jedoch definitiv von Deinen Skalierungsfaktoren $faktX und $faktY.
Grüße
Vinzenz
Hallo,
Nur Geduld, junger Norbert ;-)
denkste,
ich bin leider schon aelter und habe nicht mehr so viel Zeit wie die Jungspunte ... ;-)
Ausserdem verschwinden Treads schon nach wenigen Tagen aus der Forumshauptdatei, womit der Tread praktisch einer "Zwangsschliessung" zum Opfer faellt. Und da das Thema alles andere als trivial ist, rennt uns einfach die Zeit weg.
Die Urechnung von Gradangaben in Kilometerangaben habe ich mir vom DLR in Portz besorgt und damit 184 Orte in die bekannte PNG-Karte eingetragen. Da sich die signifikanten Orte an den bekannten Orten wiederfinden, gehe ich von hinreichender Exaktheit der Berechnung aus. Die Skalierungsfaktoren $faktX und $faktY wurden empirisch ermittelt und sind nicht Bestandteil der Klasse zur Berechnung von Entfernungen aus GeoKoordinaten.
Um das Umkreisproblem in der Abfrage zu vereinfachen, habe ich mit besagter Klasse die GeoKoordinaten in Kilometer umgerechnet und in zwei neuen Spalten abgelegt.
Und welcher Teil des Codes war jetzt noch mal unklar?
Frage ruhig, ich frage ja auch ... ;-)
Gruss und Dank
Norbert
Hallo Norbert,
Ausserdem verschwinden Treads schon nach wenigen Tagen aus der Forumshauptdatei,
nicht schon nach zwei Tagen :-)
womit der Tread praktisch einer "Zwangsschliessung" zum Opfer faellt. Und da das Thema alles andere als trivial ist, rennt uns einfach die Zeit weg.
Die Urechnung von Gradangaben in Kilometerangaben habe ich mir vom DLR in Portz besorgt und damit 184 Orte in die bekannte PNG-Karte eingetragen.
Da sich die signifikanten Orte an den bekannten Orten wiederfinden,
ja auch nicht signifikante sind in etwa dort, wo sie tatsächlich sind :-)
gehe ich von hinreichender Exaktheit der Berechnung aus.
zum Zweck der Positionierung der Orte: ja
Die Skalierungsfaktoren $faktX und $faktY wurden empirisch ermittelt und sind nicht Bestandteil der Klasse zur Berechnung von Entfernungen aus GeoKoordinaten.
Um das Umkreisproblem in der Abfrage zu vereinfachen, habe ich mit besagter Klasse die GeoKoordinaten in Kilometer umgerechnet und in zwei neuen Spalten abgelegt.
Diese Kilometer sind vermutlich keine Kilometer - und da, denke ich, liegt das
Problem. Warum vermute ich das?
Erstens: Dein OffsetOst beträgt 653 km.
Laut Wikipedia ist Selfkant die westlichste Gemeinde Deutschlands, mit den Geokoordinaten:
51° 1' nördliche Breite
5° 55' östliche Länge
und liegt damit ziemlich exakt westlich von Köln, das in Wikipedia mit
50° 57' nördlicher Breite
6° 58' östlicher Länge
Die Westspitze Deutschlands ist auf der Karte verzeichnet und Dein Offset gibt
ja den Abstand der Westkante der Karte zum 0-Meridian an.
Beim Längengrad x (östlich von Greenwich) und Breitengrad y ergibt sich der Abstand zum Nullmeridian (bei angenommener Kugelform, die Ellipsoidkorrektur
vernachlässige ich einfach) zu
a = x * cos(y) * (40000/360)
Den Korrekturfaktor cos(y) vermisse ich bei Dir, denn selbst für Köln und 7° östlicher Länge komme ich nur auf rund 490 km Abstand zum Null-Meridian (ohne Cosinus-Korrektur auf 774 km), für Selfkant komme ich ohne Cosinus-Korrektur auf 657 km (passt zu Deinem OffsetOst), mit Kosinuskorrektur dagegen auf rund 413 km Ost. Da der Nordabstand fast vernachlässigbar ist (insbesondere in Hinblick auf die Nordostausdehnung von Köln) beträgt die Distanz zwischen Köln und der Westspitze rund 77 km, was ich nach einer hochpräzisen Messung (Geodreick und mein alter Schulatlas) bestätigen kann. Der Unterschied zu den 117 km ohne Korrektur ist jedenfalls offensichtlich.
Wenn Deine kmOst nun keinen wirklichen Abstand zum Nullmeridian angeben, sondern nur den Abstand, den ein Ort gleicher Länge auf dem Äquator zum Nullmeridian hätte, dann ist natürlich Deine Formel im SQL-Statement falsch,
da diese davon ausgeht, dass es sich um tatsächliche Kilometer handelt. Es ist ja schließlich ein einfacher Pythagoras, der bei kleinen Entfernungen hinreichend genau sein sollte.
Dass dies nur für kleine Entfernungen gilt, sollte klar sein. Beispielsweise liegt Saarbrücken laut Wikipedia auf
49° 14' nördlicher Breite und
7° 0' östlicher Länge.
d.h. bis auf 2 Bogenminuten (die in Wirklichkeit in der Ausdehnung der Städte untergehen) exakt südlich von Köln, was Deine Karte auch bestätigt.
Für Saarbrücken ergeben sich jedoch 508 kmOst, d.h. 18 km Abstand in Ostrichtung (statt maximal 2-3 km). Diese machen sich bei 190 km Nord-Süd-Abstand im Pythagoras kaum bemerkbar (weniger als 1 Kilomter Unterschied, also vernachlässigbar).
Wenn Deine Karte halbwegs abstandsgleich ist (richtig abstandsgleich geht ja nicht), dann sollte Dein Skalierungsfaktor in Nord-Süd-Richtung der gleiche sein wie in Ost-West-Richtung. Nach der Korrektur Deiner kmOst, nach Korrektur des OffsetOst und des Skalierungsfaktor sollte das Ergebnis kreisförmig aussehen.
Zusammengefasst: Der Fehler liegt nach meiner Analyse darin, dass Du vermutlich statt dem wirklichen Abstand zum Nullmeridian auf der Breite des Ortes den Abstand zum Nullmeridian auf dem Äquator genommen hast.
Freundliche Grüße
Vinzenz
Hallo,
Zusammengefasst: Der Fehler liegt nach meiner Analyse darin, dass Du vermutlich statt dem wirklichen Abstand zum Nullmeridian auf der Breite des Ortes den Abstand zum Nullmeridian auf dem Äquator genommen hast.
Nachtrag:
Als Bezugsmeridian würde ich eher den 10. Längengrad oder 10° 30' wählen (d.h. in etwa die Mitte Deutschlands), um die Fehler geringer zu halten. Diese kmOst sind schließlich ausschließlich dazu da, eine schnelle Umkreissuche zu ermöglichen.
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
nachdem 39h bzw. 32 Stunden seit meinen Bitten um Aufklaerung zu Deinem
unspezifischen Hinweis ohne jegliche Reaktion vergangen sind. Muss man
feststellen, dass Dein Beitrag unsachlich ist und somit SPAM darstellt.
Dir haette ich dergleichen eigentlich nicht zugetraut ... :-((
Gruss und Dank
Norbert