Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

3rd Step

Rund um MS-MapPoint

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11075
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

3rd Step

Beitrag von AUGE_OHR » Mi, 01. Okt 2008 6:42

hi,

nachdem wir in Step 2 ja schon die Karte sehen konnten und auch manuell Daten eingeben
konnten geht es jetzt darum wie man DBF Daten in die Karten bekommt.

Ich nehme dafür wieder den Routen Planer und will nun die Waypoints der Kunden eintragen und
dann soll mir MapPoint die Route mit den Methode Calculate() oder evtl Optimize() "bearbeiten".

Code: Alles auswählen

METHOD XbMap:MapLadelist(nNo)
LOCAL ...
STATIC oListbox := NIL
DEFAULT nNo TO 1
...
IF oListbox = NIL
   aPos     := CenterPos(aSize, AppDeskTop():currentSize())
   oListbox := XbpListBox():new( ::oDlgMap:drawingArea, , aPos, aSize, aPP)
   oListbox:tabStop := .T.
   oListbox:create()
   oListbox:hide()
ENDIF
// Ausgangs Adresse
::AddHome(1)

SELECT 23                                 // SORT Ladeliste
::oDlgMap:oStatus:Show()
GO TOP
DO WHILE !EOF()
        // was anzeigen
        ::oDlgMap:oStatus:Setcaption( ...)

*      Street      String
*      City        String
*      OtherCity   String
*      Region      String
*      PostalCode  String
*      Country     Variant

   oResult := ::oMap:ActiveMap:FindAddressResults( ;
           TRIM(ConvToOEMCP(SORTLADE->Strasse)),;
           TRIM(ConvToOEMCP(SORTLADE->Ort    )),;
           NIL,;
           NIL,;
           TRIM(ConvToOEMCP(SORTLADE->PLZ    )),;
           geoCountryGermany  )

   imax := oResult:Count()
   IF imax > 0
      IF imax > 1
         oListbox:clear()
         FOR i := 1 TO iMax
            // Klarname der Strasse
            oListbox:addItem(oResult:Item(i):Name())
         NEXT
         oListbox:show()
         oListbox:itemSelected := {| uNIL1, uNIL2, oSelf | ;
                     nWahl := oSelf:getData()[1],;
                     ::oMap:ActiveMap:ActiveRoute:Waypoints:Add(oResult:Item(nWahl)),;
                     oListbox:hide() ,;
                     lDone := .T. }

         oListbox:setdata({1})
         SetappFocus(oListbox)
         //
         // manueller Eingriff notwendig weil Ergebniss > 1 Treffer
         //
         lDone := .F.
         DO WHILE .NOT. lDone
              nEvent := AppEvent ( @mp1, @mp2, @oXbp )
              oXbp:HandleEvent ( nEvent, mp1, mp2 )
              SLEEP(2)
         ENDDO
      ELSE
         nWahl := 1
         ::oMap:ActiveMap:ActiveRoute:Waypoints:Add(oResult:Item(nWahl))
      ENDIF
      // allways on last Waypoint (where i come from)
      ::oMap:ActiveMap:ActiveRoute:Waypoints:Item(nCount):SegmentPreferences := geoSegmentPreferred
      nCount++

      // Positionierung auf der Karten anzeigen 
      ::oMap:ActiveMap:Location := oResult:Item(nWahl)
      // gehe zur Location 
      ::oMap:ActiveMap:Location:Goto()
      // Höhe = Zoom wie man will
      ::oMap:ActiveMap:Altitude := 10
   ELSE
      TONE(1000)
   ENDIF
   // nächester WayPoint
   SKIP
ENDDO
CLOSE
// und wieder "nach Hause"
::AddHome(2,iMax)

//
// diese Optionen kann man auch im Routen Planer erreichen
// 
// ein Calculate() "geht immer" aber ein Optimize() kann dauern
// wenn er "Unsinn" bekommt den ein User auch schon optisch
// erkennen kann und eingreifen kann bevor er Optimize() aufruft
//
*   IF ::oMap:ActiveMap:ActiveRoute:Waypoints:IsOptimized()
*   ELSE
*       ::oMap:ActiveMap:ActiveRoute:Waypoints:Optimize()  
*   ENDIF

    ::oMap:ActiveMap:ActiveRoute:Calculate()
mit FindAddressResults() findet man nun "am besten" wenn man den Strassen Namen, PLZ, Ort
und Country eingibt doch leider gibt es manchmal "mehr" Treffer. So haben scheinbar Einkaufs-
Zentren ihre eigene Postleitzahl (postcode) sodas der User eine Auswahl treffen können muss.

Das wird nun durch die XbpListbox() bewerkstelligt wobei die DO WHILE dafür durch eine Eventloop
unterbrochen werden muss. Mit der Methode :Add() fügen wir nun das Object als Waypoints ein.
Danach wird dann noch bestimmt auf welchen "Weg Type" (:SegmentPreferences) er fahren möge.

Mit Location wird nun die neue Position gesetzt und durch die Methode :Goto() wird die Karte auf
die Location zentriert. Den "Zoom" kann man mit ZoomIn/Out oder durch die "Höhe" Altitude
bestimmen wie wir die Karten dem User zeigen wollen.

Zu Schluss kommt dann noch die Calculate() Methode und er zeigt uns auf der Karte die
Verbindungen der WayPoints. Diese ist aber noch nicht Optimize() welches in einen anderen
Thread besprochen wird.

Fortsetzung folgt ...
gruss by OHR
Jimmy

Antworten