Geoprogrammierung - Entfernung zweier Punkte

birthdefect
Hallihallo.

Nachdem ich nun endlich eine Datenbank (Listen) mit Punkten
habe, die mit folgenden Attributen in den Tupel aufwarten können:

Deutschland: ca 6300 Orte mit
PLZ, Ortsname, Koordinaten in Lat und Lng, Bundesland und Landkreis

Österreich: ca 16000 Orte mit
PLZ, Ort,Gemeinde,Bezirk und Bundesland sowie Koordinaten in Lat und Lng.

... möchte ich möglichst genau die Distanz über den Erdball
(=Geoid, bzw. vereinfacht eine abgeflachte Kugel) zwischen
2 Kooridantenpaaren berechnen können.

Also die Länge jener Linie, die auf dieser abgefalchten Kugel über den
Erdball zu legen ist, damit die beiden Punkte auf kürzesten Weg verbunden
sind. Da ja DE weit genug in den Norden reicht, damit Näherungswerte für
Längs und Breitengrade nicht mehr ausreichen, muß eine neu Berechnung her.

Dabei habe ich mir folgendes überlegt:

Die Erde hat in meinem Modell an den Polen einen Radius RV und am Äquator
einen Radius RÄ. Wenn man nun den Erdball Achtelt und sich die Erde in der
nördlichen Hemisphäre anschaut, hat man eine Kurve, die Harmonisch von
RV in RÄ übergeht.

Diese Kurve schaut in meinem Modell so aus:


(Hier rot dargestellt, die blauen Kreise deuten auf die beiden Radien RV und RÄ hin.)

Diese rote Kurve errechne ich wie folgt:


Also R (LAT) = RÄ * (sin(2*LAT+Pi/2)+1)*0,5 + RV * (1-(sin(2*LAT+Pi/2)+1)*0,5);
Wobei LAT im Bogenmaß zu sein hat.
RÄ und RV sind bekannte Größen und können im Quelltext eingetippt werden.

R (LAT) gibt mir also den Radius jener erfundenen Kugel, die sich entlang des
Breitengrades von LAT mit dem von mir erfundenen Geoiden schneidet.
Von Oben gesehen ein exakter Kreis auf einer Hemisphäre.

Was ich mit nun überlegt habe ist folgende Vorgehensweise zur Berechnung
des Abstandes zweier Punkte auf diesem Geoiden:
Ich erhalte Pro Punkt eine solche Kugel, die den Geoiden entlang eines
Breitengrades schneidet, auf dem sich je ein solcher Punkt befindet.

Schritt 1:
Radien der beiden Kugeln (KP1 und KP2) berechnen RP1 und RP2.

Schritt 2:
Ich berechne den Winkel zwischen den beiden Linien im Raum, die
von je einem Punkt zum Mittelpunkt des Geoiden gehen.

Schritt 3:
Ich berechne jeweils die Länge des Bogens, der mit den Radien RP1 und RP2
aufgespannt wird. Ich habe also so den Abstand P1 auf KP1 zum, zur Mitte hin
auf KP1 projizierten P2 und analog dazu den Abstand P2 auf KP2 zum, zur Mitte
hin auf KP2 projizierten P1. Nennen wir die LKP1 und LKP2.

Schritt 4:
Ich berechne die Interpolation zwischen diesen beiden Strecken.
Mit L = LKP1 + LKP2 / 2
Eventuell sollte man diese Interpolation noch entsprechend harmonisieren,
unter Zuhilfenahme der obigen Formen f(LAT) (siehe Radienberechnung).


Was haltet Ihr davon ? großes Grinsen
Hanfling
Wenn ich dich richtig verstehe willst du nur die Entfernung von Orten ausrechnen?

Dafür machst du dir aber einen viel zu riesigen Aufwand. Die Erde als Kugel zu betrachten sollte mehr als Ausreichend genau sein.

Des weiteren würde ich dann in Kugelkoordinaten arbeiten, zumal die Punkte in genau der Form gegeben sind. Den Bogen dann zu Berechnen ist dann auch trivial. Das sollte nicht mehr als 1m von deiner Rechnung abweichen, wenn überhaupt soviel.

Ansonsten versteh ich dein Gefrickel mit den zwei Kugeln nicht, kannst du wenn nicht einfach einen Ellipsoiden benutzen?
birthdefect
Ja, natürlich! Ein Ellipsoid!

Damit könnte man natürlich vielleicht noch einfacher
den Radius passend zu einem Latitude-Wert berechnen.

Aber die Idee der zwei Kuglen ist die, daß ich keine
Lust habe, Längen auf einem Ellipsoiden zu berechnen.
Dazu müsste ich den Ellipsoiden mit einer Ebene
schneiden und das wäre mir doch etwas zu viel
Aufwand. Auch, wenn das Modell einer Kugel vielleicht
genau genug sein könnte, so will ich dennoch aus
Prinzip einen Drehellipsoiden bzw eine abgefalchte
Kugel verwenden.

Diese 2 Kugeln ergeben sich aus dem Umstand, daß
ich 2 Punkte in unterschiedlichen Breitengraden habe.
Dadurch erhalte ich 2 Radien, und ich berechne für
jeden der Radien (eben auf der Kugeloberfläche) die
Distanz zwischen den beiden Punkten und interpoliere
dann (was ich eh schon ungenau genug finde).

Außerdem gehen ja auch die Longitude-Linien, also
die Längenlinien zu den Polen hin zusammen und
mit meiner Berechnung muß ich m ich nicht mehr
weiters um diesen Umstand kümmern, weil ich eben
mit Winkeln arbeite... also Kuglekoordinaten
(Polarkoordinaten). Das hast Du ja richtig erkannt.
Feuerteufel

Moment mal. geschockt

Wenn ich die beiden Längen Interpoliere, kann ich genausogut
auch die Beiden Radien interpolieren bevor ich alles 2 mal rechne!
Dann ist das von Dir vorgeschlagene Kugelmodell natürlich gut.
So mache ichs! Das spart wertvollste Rechenzeit!

Die Sache mit der Ellipse im Schnitt überdenke ich auch nochmal.
Da bin ich scheinbar am Schlauch gestanden großes Grinsen

Danke fürn Tip!
Hanfling
Die Entfernung von zwei Orten ist doch die Nähste Strecke, wenn du auf der Oberfläche langgehst, oder? Also warum musst du da irgendwas schneiden?
Wenn du den Abstand haben willst, der direkt grade (durch die Erde durch ist) rechnest dir halt erstmal beide Punkte in karthesische Koordinaten um, nimmst die Punkte als Ortsvektoren, und hast dann den Betrag der Differenz als Abstand.

Naja, zu deinen unterschiedlichen Entfernungen der Orte je nach Breitengrad zum Erdmittelpunkt. Diese Abweichung, ist geringer als mögliche Höhenunterschiede (im Bezug auf Meeresspiegel).
Das mit dem Breitengradabhängigkeit der Radius, ist sehr sehr sehr minimal, und wirkt sich auf deine Rechnung auf der Oberfläche fast garnicht aus, zumal die Genauigheit stärker unter den lokalen Höhenunterschieden leidert. Somit hättest du dadurch nix erreicht.

Einen Elipsoiden zu nehmen ist um den Faktor 10 Umständlicher zu berechnen, als einfach auf einer Kugel ein Stück Linie. Ansonsten musst du halt r in Abhängigkeit von einem Winkel ausdrücken und das wird dann übelst hässlich. Augenzwinkern
birthdefect
R (Lat) = sqrt( (RV*cos(LAT))^2 + (RÄ*sin(LAT))^2 )

Das ist der Radius - bzw. der Abstand der gedachten Ellipse im
Schnitt mit einer Gerade aus dem Mittelpunkt, die mit dem
Winkel LAT ansteigt.

Besserwisser

Ist gar nicht so übelst, finde ich. Dein Tip mit dem
Ellipsoiden war gut. Da gibts nämlich ein Referenz-
ellipsoid, das für Vermessungszwecke herhalten muß.
Genau das werde ich nachprogrammieren.

cool
Hanfling
code:
1:
R (Lat) = sqrt( (RV*cos(LAT))^2 + (RÄ*sin(LAT))^2 )

Also für einen Radius finde ich das schon viel zu kompliziert. Abgsehen davon sollte man das mit geometrischen Beziehungen in der Ellipse wesentlich einfacher ausgedrückt kriegen.

Wie groß ist eigentlich RV/RÄ?

Aber es ging mir nicht um den Radius. Es ging mir um das Stück Weg, was du auf der Kugel zurücklegst, um das zu berechnest. Wenn dir Orte überananderliegen kannst du es ja einfach als Elipse betrachten. Aber wenn die Orte nach West/Ost verschoben sind, muss die die Strecke auf einem Ellipsoiden zurücklegen. Und wenn du dann da schon sowas für den Radius stehen hast, dann sind das Seitenlange Rechnungen, bis du auf auf eine Funktion kommst in Abhängigkeit von den beiden Koordinatenpaaren. Bei einer Kugel ist kannste einfach das Bogenelement dS = { dr, r d theta, r sin theta d phi } benutzen. Bei einem Elipoiden ist es wesentlich komplizierter, auch wenn du den Spezialfall hast das es ein Rotationsellipsoid ist, was es wesentlich einfacher macht.

Aber nochmal, wenn du ne Ellipse benutzt dann musst du auch die lokalen Höhenunterschiede mit einbeziehen.
birthdefect
Ja, genau!

Mir ist klar, daß ich sicherlich NICHT die Länge der Linie auf dem
Ellipsoiden berechnen werde. ich suche nur eine möglichst genaue
Näherung indem ich eben von den beiden Punkten den Abstand
zur Mitte nehm (Also die beiden Radien des Ellipsoiden) und dann
aus dem Mittel (R1 + R2)/2 der Radien mit einer Kugel weiterarbeite.

Natürlich wird schlußendlich nur ein Bogen auf einer Kugel berechnet.
Ein Kreissegment sozusagen, aber über diesen Ellipsoid hole ich
mir den Radius für diesen Kreis.

Freude
birthdefect
Ach ja und RÄ / RV ist

6.378.137,000 / 6.356.752,315
(WGS84 (World Geodetic System 1984))

Siehe auch im Wikipedia das ReferenzEllipsoid :
http://de.wikipedia.org/wiki/Erdellipsoid

Natürlich ist Abflachung der Erde MiNiMALST!


großes Grinsen
Hanfling
6.378.137,000 / 6.356.752,315 = 1,00336409

Ich bezweifle das sich das überhaupt spürbarauf dein Problem auswirken wird. Again, du bewegst dich zusätzlich noch auf ner Kugeloberfläche und du berechnest nur eine Strecke. Bei einer Fläche würde es sich vllt. sogar noch bemerkbar machen, da könnte man es aber auch noch vernachlässigen.

/edit:
Jetzt verstehe ich langsam was du willst. Aber wenn du da an der Stelle so näherst, brauchst du vorher auch ned das andere machen. Zumal du dich ja eh nur in einem sehr kleinen Bereich bewegst.
Chris Hunter
Die Schule hat euch ja total verdorben!
Hanfling
In der Schule lernt man doch nich, wie man sehr gut nähert, und trotzdem von der Genauigkeit im Promillebereich bleibt... und sich das Leben leichter macht. Augenzwinkern