hi,
ich hab ihn tatsächlich mal paar Stunden mit dem Optimize() laufen lassen und das Ergebniss
"so einfach" geht es nicht ... ok ich habe im alle 237 Waypoints der A7 gegeben aber die
Optimierung macht z.t. "keinen Sinn" ... warum verlässt er die Autobahn ... ???
irgendwann bemerkte ich das die 237 Datensätze "doppelte" enthielt... aber nicht "exakt" gleich ?
wenn ich mir das nun in der "Karte" ansehe liegen die "fast" übereinander, leicht versetzt.
also die "Karte abgefahren" bis ich zu einer BAB Auf/Ab-fahrt kam wo die "Gegenfahrbahn" Seite
keine Anschlussstelle hatte ... ja meistens sind auf beiden Seiten der BAB Auf/Ab-fahrten
Damit hat sich auch die doppelte KM Zahl "erklärt" und das hat auch Optimize() nicht "gemerkt" !
Also muss man da "vorher" die Daten "intelligenter" aufbereiten damit es Mappoint "merkt".
Code: Alles auswählen
LOCAL cBAB := "A"+LTRIM(STR(nNo))+","
LOCAL aBAB := {{"A7Start",;
"A7" ,; // Street
"Ellund" ,; // City
NIL ,; // OtherCity
NIL ,; // Region
"6330" ,; // PostalCode
geoCountryDenmark},; // Country
{"A7Ende" ,;
"A7" ,; // Street
"Nesselwang",; // City
NIL ,; // OtherCity
NIL ,; // Region
"87484" ,; // PostalCode
geoCountryGermany}} // Country
//
// Entrance to Germany
//
oResult := ::oMap:ActiveMap:FindAddressResults(aBAB[1,cStreet ],;
aBAB[1,cCity ],;
aBAB[1,cOtherCity ],;
aBAB[1,cRegion ],;
aBAB[1,cPostalCode],;
aBAB[1,nCountry ] )
//
// set relative 0.0 Startpoint
//
imax := oResult:Count()
IF imax > 0
nCounter++
oMPStart := oResult:Item(1)
::oMap:ActiveMap:ActiveRoute:Waypoints:Add(oMPStart)
::oMap:ActiveMap:ActiveRoute:Waypoints:Item(nCounter)::SegmentPreferences := geoSegmentPreferred
//
// show Location Waypoint in Map
::oMap:ActiveMap:Location := oMPStart
::oMap:ActiveMap:Location:Goto()
//
// 1x1 KM
::oMap:ActiveMap:Altitude := 10
ELSE
MSGBOX("Error Start")
QUIT
ENDIF
//
// now search for "A7,"
// to get all Highway Ramps (both Side !)
//
oResult := ::oMap:ActiveMap:FindAddressResults(cBAB,;
NIL,;
NIL,;
NIL,;
NIL,;
geoCountryGermany ) // only GERMANY "A7,"
imax := oResult:Count()
IF imax > 0
FOR i := 1 TO iMax
//
// oResult:Item(i) -> each Item of oResult
// i -> Item Number
// 0 -> "filled" by KM
// "X" -> "N->S" .or. "S->N"
// 0 -> Route No
AADD(aStart,{oResult:Item(i),i,0,"X",0})
nProz := INT(i/iMax*100)
IF (nProz % 1) == 0
cProz := LTRIM(STR(nProz))
::oDlgMap:oAnzeig:setcaption("Results"+Chr(13)+cProz+" %")
ENDIF
NEXT
::oDlgMap:oAnzeig:setcaption("ready Results"+Chr(13)+cProz+" %")
i := 1
FOR i := 1 TO iMax
nDistance := ::oMap:ActiveMap:Distance(oMPStart,aStart[i,1])
aStart[i,3] := nDistance
nProz := INT(i/iMax*100)
IF (nProz % 1) == 0
cProz := LTRIM(STR(nProz))
::oDlgMap:oAnzeig:setcaption("Distance"+Chr(13)+cProz+" %")
ENDIF
NEXT
ASort( aStart,,, {|aX,aY| aX[3] < aY[3] } )
ich hole mir also alle Waypoints in ein Array und sortiere die Daten nach KM relative zu oMPStart
damit läuft ein Optimize() schon ganz anders ab !
Man darf von MP wohl "nicht zuviel" verlangen, zuminderst was das "Routen planer" Modul angeht
... das macht jedes Auto-Navi "besser" ...
was gut geht ist "in the City", also auf "kleinem Raum". Die "City Tour" macht MP gut, ordentlich
und Optimize() geht genügend schnell.
hat man nun "Fern" Strecken so wird es komplizierter und es dauert ...
also wieder mal "nachdenken" wie man das nun in Griff bekommt ... und google´n nach ... was ?
nun kam mir wieder das BAB "Problem" in Sinn ... und wenn ich das erstmal "weglasse" ?
... was ja schnell und ohne Probleme geht ist eine A -> B Strecke ... und man bleibt auf der BAB
... und "City" geht ja schnell ... und dann wieder BAB ...
Ich habe also nun die Daten des Array "aufgeteilt" in "City" und dazwischen BAB
Das ganze funktioniert auch schon ganz gut für die N->S Verbindung mit "Automatik" für die
BAB "dazwischen", denn der "erste" Kunden in der nächsten Stadt ist ja dann der nördlichste
und das wäre bei N->S ja die kürzeste KM Anzahl wenn man die Methode Distance() benutzt.
Ich "weiss" als Mensch natürlich "wer" der nächste Kunde ist und ob der "in der City" oder per
BAB zu erreichen ist und muss hier ggf. "eingreifen" wenn MP "im Kreis" fahren möchte
So ausgerüstet lasse ich MP nun jeweils Teile der Tour Optimize(), Calculate() und anzeigen.
Alle Waypoints habe ich ja im Array und die bekommen dann Nummern aus der neuen "City" Tour.
Wenn ich nun so das Array "aufbereitet" habe lasse ich ich MP alle Waypoints einzeichnen
und mache dann nur noch ein Calculate() was auch bei paar hundert Adressen kein Problem
ist. Der "Gegencheck" mit Optimize() läuft noch, aber ich denke "schlauer" wird die Lösung
nicht ... es sei denn er findet eine Abkürzung