hi,
ok ich habe mich durch die KM Angaben "verwirren" lassen. Ich habe versucht die MapPoint KM
und die MautTabelle KM zu "synchronisieren", aber "falsche" KM führen auch zu falschen
Resultaten ...
"gemerkt" hab ich es an der BAB 24 weil MapPoint mir da sagt das die Anschlussstelle "Reinbeck"
ca. 22,550KM vom Anfang entfernt sein soll. Das stimmt aber nicht den ich "weiss" das es nur
ca. 11KM sind. Der "Fehler" steckte nun hinter dem BAB Kreuz OST wo MapPoint "über die Dörfer"
fährt ... aber da gibt es keine Auf- / Ab-fahrten ... deshalb ca. 10KM statt 4.6KM die ich als
"Rennstrecke" habe wenn ich den Wagen mal "ausfahren" will ... und wenn er dann mal richtig
gut läuft, gehe ich nicht vom Gas sondern fahre weitere 6.8KM bis nach "Witzhave" ... (jaja es
gibt dort eigentlich eine Beschränkung 120KM/H, aber um 06:00 sind nicht so viele unterwegs ...)
ok zurück zum Thema. Im Thread
http://www.xbaseforum.de/viewtopic.php?f=49&t=2730
habe ich ja nun beschrieben wie man mit kartesisches Koordinaten "rechnen" kann. Hierbei ist
zu beachten das man möglichst "viele Stellen hinterm Komma" hat, den schon die 4th Stelle
hinterm Komma macht ja 10m aus.
Relevant ist ja nur die Mauttabelle und die vorgegebenen KM Angaben und ich gehe ja immer von
einer "idealen" Strecke zwischen 2 Punkten aus. Der Ausgangs Punkt wird also, wie bei der Map-
Point Routine, per "manueller" Geo Koordinaten festgelegt. Nun habe ich von MapPoint "irgendwo"
ja den nächsten Waypoint ... und auch eine Entfernung ( Calulate() by MapPoint ) und weiter
Geo Koordinaten ... und irgendwo dazwischen, 10,8 KM von Anfangspunkt, kommt die Anschluss-
stelle "Reinbeck".
Ich bin nun "nach Formel" vorgegangen und habe aus den beiden GPS Koordinaten die Strecke "c"
berechnet und siehe da es kommt ein Unterschied zur Optimze()/Calculate() Methode von Map-
Point raus wobei ich nicht nur den Unterschied "Luftlinie" meine.
Also nun mal die Formel umstellen und "c" mit 10.8KM von Anfangsort vorgeben und ich erhalte
eine neues Geo Koordinaten Paar. Dies von MapPoint in der Karte eingetragen "trifft" es schon
recht genau ... je nachdem wie viele Stellen hinterm Komma man nimmt (ich nehme jetzt N,10,6)
Als letztes jetzt noch mal eine "Gegenprobe" und den GPS Wert von MapPoint suchen lassen und
mit "seiner" Tabelle verglichen ... tja da kommt dann "Barsbüttel" raus was nördlich der BAB 24
liegt und "Reinbeck" liegt südlich der BAB 24 ... keine 50m Differenz ...
naja sowas in der Art kenne ich ja von Postleitzahlen. Ich habe hier die 21509, aber wenn ich
über die Strasse gehe bin ich in 21465 ... die Grenze liegt in der Strassenmitte.
Zusammenfassung : Mittels der CalcPos() Routine lässt sich unter MapPoint 2004 rechte genau
eine neue Location berechnen. Wenn man nun zwei Paar Geo Koordinaten hat kann man damit
die "Luftlinie" als Entfernung berechnen. Sucht man nun einen Punkt auf dieser "Luftlinie" so
braucht man die Entfernung zu einem Geo Punkt und dessen Koordinaten und kann damit die
neuen Koordinaten berechnen.
Code: Alles auswählen
METHOD XbMap:CalcPos(oMap, oLoc, nLocLat, nLocLon,nTest)
LOCAL oNordPol
LOCAL oStCruz
LOCAL oSuedPol
LOCAL dblHalfEarth
LOCAL dblQuarterEarth
LOCAL Pi := 3.14159265358979
LOCAL d,l
oNordPol := oMap:GetLocation( 90, 0)
oStCruz := oMap:GetLocation( 0,-90) // Center of western hemisphere
oSuedPol := oMap:GetLocation(-90, 0)
// Compute distance between north and south poles == half earth circumference
dblHalfEarth := oMap:Distance(oNordPol,oSuedPol)
// Quarter of that is the max distance a point may be away from locSantaCruz
// and still be in western hemisphere
dblQuarterEarth := dblHalfEarth / 2
// Compute latitude from distance to north pole
nLocLat := 90 - 180 * oMap:Distance(oNordPol, oLoc) / dblHalfEarth
// Compute great circle distance to locX from point on Greenwich meridian and computed
// Latitude
d := oMap:Distance(oMap:GetLocation(nLocLat, 0), oLoc)
// convert latitude to radian
l := (nLocLat / 180) * nPi
// Compute Longitude from great circle distance
nLocLon := 180 * Arccos((Cos((d * 2 * nPi) / ;
(2 * dblHalfEarth)) - Sin(l) * Sin(l)) / (Cos(l) * Cos(l))) / nPi
//
// nur als Gegentest mit Xbase++ Source
nTest := 180 * YYArccos((YYCos((d * 2 * nPi) / ;
(2 * dblHalfEarth)) - YYSin(l) * YYSin(l)) / (YYCos(l) * YYCos(l))) / nPi
// Correct longitude sign if located in western hemisphere
If oMap:Distance(oStCruz, oLoc) < dblQuarterEarth
nLocLon = nLocLon*(-1)
ENDIF
RETURN self