public List<TravelTime> GetTravelTimes(Location origin, Location destination)
 {
     var list = new List<TravelTime>();
     GetTravelTimeForMode(origin, destination, list, TravelMode.Driving);
     GetTravelTimeForMode(origin, destination, list, TravelMode.Transit);
     return list;
 }
 private void GetTravelTimeForMode(Location origin, Location destination, List<TravelTime> list, TravelMode mode)
 {
     var time = this.GetTravelTime(origin, destination, mode);
     if (time != null)
     {
         list.Add(time);
     }
 }
 private string StringForm(Location loc)
 {
     if (!string.IsNullOrEmpty(loc.Latitude) && !string.IsNullOrEmpty(loc.Longitude))
     {
         return loc.Latitude + "," + loc.Longitude;
     }
     return loc.Address + " " + loc.Suburb + " " + loc.Postcode + " Australia";
 }
 static void Main(string[] args)
 {
     DirectionsService ds = new DirectionsService();
     Location origin = new Location { Suburb = "Sydney" };
     Location destination = new Location { Suburb = "Melbourne" };
     var result = ds.GetTravelTimes(origin, destination);
     foreach (var entry in result)
     {
         Console.WriteLine("{0}: {1}", entry.Mode, entry.Minutes);
     }
     Console.ReadLine();
 }
        public TravelTime GetTravelTime(Location origin, Location destination, TravelMode mode)
        {
            string originString = StringForm(origin);
            string destinationString = StringForm(destination);
            var request = new DirectionsRequest()
            {
                ApiKey = apiKey,
                Origin = originString,
                Destination = destinationString,
                TravelMode = mode,
                DepartureTime = DateTime.Now,
            };

            var response = GoogleMapsApi.GoogleMaps.Directions.Query(request);

            var route = response.Routes.FirstOrDefault();
            if (route != null)
            {
                // For routes that contain no waypoints, the route will consist of a single "leg".
                var leg = route.Legs.FirstOrDefault();
                if (leg != null)
                {
                    // Get the origin and destination's lat/long if not yet known.
                    origin.Latitude = origin.Latitude ?? leg.StartLocation.Latitude.ToString();
                    origin.Longitude = origin.Longitude ?? leg.StartLocation.Longitude.ToString();

                    destination.Latitude = destination.Latitude ?? leg.EndLocation.Latitude.ToString();
                    destination.Longitude = destination.Longitude ?? leg.EndLocation.Longitude.ToString();

                    var transitStep = leg.Steps.FirstOrDefault(a => a.TransitDetails != null);

                    TimeSpan duration = leg.Duration.Value;
                    TravelTime time = new TravelTime
                     {
                         Mode = mode.ToString(),
                         Days = duration.Days,
                         Hours = duration.Hours,
                         Minutes = duration.Minutes,
                         Seconds = duration.Seconds,
                         TransitDepartureTime = transitStep == null ? null : transitStep.TransitDetails.DepartureTime.Text,
                         TransitDepartureStop = transitStep == null ? null : transitStep.TransitDetails.DepartureStop.Name,
                         TransitArrivalTime = transitStep == null ? null : transitStep.TransitDetails.ArrivalTime.Text,
                         TransitArrivalStop = transitStep == null ? null : transitStep.TransitDetails.ArrivalStop.Name,
                         TransitRoute = transitStep == null ? null : transitStep.TransitDetails.Lines.ShortName,
                         TransitRouteDescription = transitStep == null ? null : transitStep.TransitDetails.Lines.Name
                     };
                    return time;
                }
            }
            return null;
        }
        public List<Facility> Search(Location loc, FacilityType type)
        {

            string serviceCategory = null;
            string servicetype = null;
            switch (type)
            {
                case FacilityType.GP:
                    serviceCategory = "General Practice/GP (doctor)";
                    break;
                case FacilityType.Pharmacy:
                    servicetype = "Pharmacy";
                    break;
            }

            var requestDic = new Dictionary<string, string>
            {
                {"usepostcoderadialsearch", "true"},
                {"suburbpostcodedata", JsonConvert.SerializeObject(new { SiteSearchSuburbPostcodeParams = new { SuburbPostcode = loc.Suburb + " " + loc.Postcode, SearchSurroundingSuburbs = true } })},
                {"startpos", "1"},
                {"servicetype", servicetype},
                {"ServiceCategory", serviceCategory},
                {"SearchSiteAddress", "true"},
                {"SearchServiceCoverageArea", "false"},
                {"SearchServiceAddress", "false"},
                {"orderby", "Distance"},
                {"endpos", "5"},
                {"deliverymethod", "{\"string\":\"Site Visit\"}"},
                {"callback", "angular.callbacks._4"},
                {"apikey", "nhccn-9vSRwUZooHY2BebTOvAhA93n"},
                {"alwaysreturn", "5"}
            };

            string url = "https://api.nhsd.com.au/nhsd/v2.8/rest/sitesearch?";
            foreach (var entry in requestDic)
            {
                if (entry.Value != null)
                {
                    url += entry.Key + "=" + Uri.EscapeDataString(entry.Value) + "&";
                }
            }

            WebRequest req = WebRequest.Create(url);

            StreamReader sr = new StreamReader(req.GetResponse().GetResponseStream());
            WebResponse response = req.GetResponse();
            string responseString = sr.ReadToEnd();
            string json = responseString.Substring(requestDic["callback"].Length + 1, responseString.Length - requestDic["callback"].Length - 2);
            RootObject result = JsonConvert.DeserializeObject<RootObject>(json);
            FacilitySearchResult searchResult = new FacilitySearchResult();
            var firstSite = result.SiteSearchResponse.SiteSearchResult.ResultList.SiteData[0];
            
            var facilities = result.SiteSearchResponse.SiteSearchResult.ResultList.SiteData.Select(a => new Facility
                {
                    Location = new Location
                    {
                        Address = a.SiteAddress.Address_Line_1 + " " + a.SiteAddress.Address_Line_2 + " " + a.SiteAddress.Address_Line_3,
                        Suburb = a.SiteAddress.Suburb,
                        Postcode = a.SiteAddress.Postcode,
                        Latitude = a.SiteAddress.Latitude,
                        Longitude = a.SiteAddress.Longitude,
                    },
                    OpenNow = a.ServiceCollection.ServiceData.OpenNow,
                    ClosingTime = GetClosingTime(a.ServiceCollection.ServiceData),
                    Name = a.OrganisationName,
                }).ToList();
            return facilities;
        }
        public void Lookup(Location loc)
        {
            var request = new GoogleMapsApi.Entities.Geocoding.Request.GeocodingRequest
            {
                Location = new GoogleMapsApi.Entities.Common.Location(double.Parse(loc.Latitude), double.Parse(loc.Longitude)),
                ApiKey = apiKey
            };

            var response = GoogleMapsApi.GoogleMaps.Geocode.Query(request);

            var result = response.Results.FirstOrDefault();
            if (result != null)
            {
                loc.Suburb = AddressComponent(result, "locality");
                loc.Postcode = AddressComponent(result, "postal_code");
                loc.Address = AddressComponent(result, "street_number");
                loc.Address += " " + AddressComponent(result, "route");
            }
        }