>* 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 >