>>* load the libraries >>DO LOCFILE("here_loader.prg") >> >>* instantiate an overHere manager >>LOCAL oh AS overHere >> >>m.oh = CREATEOBJECT("overHere") >>m.oh.SetCredentials(YOUR-API-KEY-HERE) >>>>
>>* first, let's get some addresses from the NorthWind database >> >>SELECT * ; >> FROM (HOME(0) + "Samples\Northwind\customers") ; >> WHERE City == "London" AND Country == "UK" ; >> INTO CURSOR curCustomers >> >>CREATE CURSOR curWaypoints ; >> (WPId Varchar(20), ; >> Latitude Double (4), Longitude Double (4), ; >> Sequence Integer NULL DEFAULT NULL, ; >> Arrival Datetime NULL DEFAULT NULL, Departure Datetime NULL DEFAULT NULL) >> >>* and try to find their geo coordinates >> >>LOCAL GC AS oh_GeocodeSearch >> >>m.GC = m.oh.SetResource("GeocodeSearch") >> >>* we start by locating the Heathrow Airport >> >>m.GC.SearchText.Set("UK Heathrow Airport") >> >>IF !ISNULL(m.GC.GetLocation(.T.)) AND m.GC.Location.Views.Count > 0 >> INSERT INTO curWaypoints (WPId, Latitude, Longitude) ; >> VALUES ('HEATHROW0', ; >> m.GC.Location.Views(1).Results(1).Location.NavigationPosition.Latitude.Get(), ; >> m.GC.Location.Views(1).Results(1).Location.NavigationPosition.Longitude.Get()) >> INSERT INTO curWaypoints (WPId, Latitude, Longitude) ; >> VALUES ('HEATHROW1', ; >> m.GC.Location.Views(1).Results(1).Location.NavigationPosition.Latitude.Get(), ; >> m.GC.Location.Views(1).Results(1).Location.NavigationPosition.Longitude.Get()) >>ELSE >> ? "Couldn't locate starting point, aborting..." >> RETURN >>ENDIF >> >>* and now the customers' addresses location >> >>SELECT curCustomers >> >>SCAN >> m.GC.SearchText.Set(TEXTMERGE("<<TRIM(curCustomers.city)>> <<TRIM(curCustomers.address)>>")) >> IF !ISNULL(m.GC.GetLocation(.T.)) AND m.GC.Location.Views.Count > 0 >> INSERT INTO curWaypoints (WPId, Latitude, Longitude) ; >> VALUES (curCustomers.customerid, ; >> m.GC.Location.Views(1).Results(1).Location.NavigationPosition.Latitude.Get(), ; >> m.GC.Location.Views(1).Results(1).Location.NavigationPosition.Longitude.Get()) >> ELSE >> ? "Not found:", TRIM(curCustomers.address) >> ENDIF >>ENDSCAN >>>>
>>* by now, we have the starting point (Heathrow Airport) and the known addresses of our customers in London >> >>* let's find the best visit sequence >> >>LOCAL FS AS oh_FindSequence >>LOCAL WP AS oh_WaypointWithIdType >>LOCAL WPF AS oh_FindWaypointInfoType >> >>m.FS = m.oh.SetResource("FindSequence") >> >>* we'll go by car >> >>m.FS.Mode.Set("Type", "fastest") >>m.FS.Mode.Set("Transport", "car") >>m.FS.Mode.Set("TrafficMode", "enabled") >>m.FS.ImproveFor.Set("time") >> >>SELECT curWaypoints >> >>GO TOP >> >>* where do we start >> >>m.FS.Start.Set(curWaypoints.wpid , curWaypoints.latitude, curWaypoints.longitude) >> >>* we also want to go back to Heathrow, after our visits >> >>SKIP >> >>m.FS.End.Set(curWaypoints.wpid, curWaypoints.latitude, curWaypoints.longitude) >> >>* when we'll start (tomorrow, at 09:00) >> >>m.FS.Departure.Set(DTOT(DATE() + 1) + 9 * 3600) >> >>SKIP >> >>SCAN REST >> >> * add all the customers addresses >> m.WP = CREATEOBJECT("oh_WaypointWithIdType") >> m.WP.Set(curWaypoints.wpid, curWaypoints.latitude, curWaypoints.longitude) >> * let's assume our visits will take 30 minutes each >> m.WP.ServiceTime.Set(30 * 60) >> m.FS.Destinations.Add(m.WP) >> >>ENDSCAN >> >>* find the sequence >>m.FS.Find(.T.) >>>>
>>* we have a sequence, now we need a route for it >> >>LOCAL CR AS oh_CalculateRoute >>LOCAL GC AS oh_GeoWaypointParameterType >> >>m.CR = m.oh.SetResource("CalculateRoute") >> >>* copy the settings from the find sequence resource >>* to get consistent directions >> >>m.CR.Mode.Set("Type", m.FS.Mode.Get()) >>m.CR.Mode.Set("Transport", m.FS.Mode.TransportMode.Get()) >>m.CR.Mode.Set("TrafficMode", m.FS.Mode.TrafficMode.Get()) >>m.CR.Departure.Set(m.FS.Departure.Get()) >> >>* use the waypoints in the sequence to define the route >> >>* contrary to the find sequence resource, calculate route will respect >>* the waypoints in the order they are added >> >>FOR EACH m.WPF IN m.FS.Sequence.Results(1).Waypoints >> >> * register the sequence of waypoints for browsing, later >> UPDATE curWaypoints ; >> SET Sequence = m.WPF.Sequence.Get(), ; >> Arrival = m.WPF.EstimatedArrival.Get(), ; >> Departure = m.WPF.EstimatedDeparture.Get() ; >> WHERE WPId == m.WPF.Id.Get() >> >> * add the waypoint to the route we want to calculate >> m.GC = CREATEOBJECT("oh_GeoWaypointParameterType") >> m.GC.Set(,,m.WPF.Latitude.Get(), m.WPF.Longitude.Get(),,,m.WPF.Id.Get()) >> m.CR.Waypoints.Add(m.GC) >> >>ENDFOR >> >>* just some typical settings >>m.CR.Representation.Set("display") >>m.CR.ManeuverAttrib.Parse("po,le,tt,bb") >>m.CR.InstructionFormat.Set("text") >> >>m.CR.Calculate(.T.) >>>>
>>* the route is calculated, by now >> >>* although we have lots of details in the calculated route >>* we just want to draw a map of it >> >>LOCAL RM AS oh_RouteMap >> >>m.RM = m.oh.SetResource("RouteMap") >> >>LOCAL Route AS oh_MapRouteMarkerGroupType >>LOCAL Pos AS oh_GeoCoordinateType >>LOCAL RouteShape AS oh_GeoPolylineType >> >>m.Route = CREATEOBJECT("oh_MapRouteMarkerGroupType") >>* get the shape of the route from the response >>m.Route.RouteCoords.Parse(m.CR.Route.Routes.Item(1).Shape.ToString()) >> >>* set it, it's almost ready to display >> >>m.RM.Routes.Add(m.Route) >> >>* back to our waypoints, we want to display markers along the route >>FOR EACH m.WPF IN m.FS.Sequence.Results(1).Waypoints >> m.POI = CREATEOBJECT("oh_PointOfInterestType") >> m.POI.Set(m.WPF.Latitude.Get(), m.WPF.Longitude.Get(), ; >> "ffB0B0", "004040", 10, m.WPF.Sequence.ToString() + " " + m.WPF.Id.Get()) >> m.RM.PointsOfInterest.Add(m.POI) >>ENDFOR >> >>* get the map of the route >>m.RM.Request() >> >>IF TYPE("_Screen.oh") == "U" >> _Screen.AddObject("oh", "Image") >> _Screen.oh.Visible = .T. >>ENDIF >> >>* and display it in the VFP screen >> >>_Screen.oh.PictureVal = m.RM.GetImage() >> >>* browse through the unordered and ordered sequence of points >>* (the map will be left behind) >> >>SELECT curWaypoints >>GO TOP >>BROWSE NOWAIT LAST >> >>SELECT * FROM curWaypoints ORDER BY Sequence INTO CURSOR curOrderedWaypoints >> >>SELECT curOrderedWaypoints >>GO TOP >>BROWSE NOWAIT LAST >>Cyrus