/// <summary> /// Given a list of testers, returns all testers in range from a specified address /// </summary> /// <param name="testersList">Testers to be examined</param> /// <param name="address">Address to calculate the distance from</param> /// <returns></returns> public static List <Tester> GetAllTestersInRange(List <Tester> testersList, AddressStruct address) { List <Tester> testersInRange = new List <Tester>(); foreach (Tester tester in testersList) { //double distance = GetDistanceFromDataSource(tester.Address, address); double distance = -1; if (distance != -1) { if (distance <= tester.MaximalDistance) { testersInRange.Add(tester); } } else { distance = CalculateDistanceGoogle(tester.Address, address); if (distance <= tester.MaximalDistance) { testersInRange.Add(tester); } } } return(testersInRange); }
/// <summary> /// Search the DataSource for the closest tester to a given address /// </summary> /// <param name="address">Address to be checked</param> /// <returns></returns> public static Tester GetClosestTester(AddressStruct address) { List <Tester> testers = new List <Tester>(); List <DistanceStruct> distances = new List <DistanceStruct>(); double minDistance; Tester closestTester = null; foreach (Tester tester in m_testersList) { double distance = GetDistanceFromDataSource(tester.Address, address); //If there is no internet connection if (distance == -2) { return(null); } if (distance != -1) { testers.Add(tester); distances.Add(new DistanceStruct(tester.Address, address, distance)); m_xamlImp.AddDistance(new DistanceStruct(tester.Address, address, distance)); } else { distance = CalculateDistanceGoogle(tester.Address, address); if (distance != 100.00001) { testers.Add(tester); distances.Add(new DistanceStruct(tester.Address, address, distance)); m_xamlImp.AddDistance(new DistanceStruct(tester.Address, address, distance)); } } } if (testers.Count == 0) { return(null); } minDistance = distances[0].Distance; closestTester = testers[0]; for (int i = 1; i < testers.Count; ++i) { if (distances[i].Distance < minDistance) { if (closestTester == null) { closestTester = new Tester(); } minDistance = distances[i].Distance; closestTester = testers[i]; } } return(closestTester); }
/// <summary> /// Returns true if a distance between two addresses was found in the DataSource /// </summary> /// <param name="originAddress">Origin address</param> /// <param name="destinationAddress">Destination address</param> /// <returns></returns> public static bool IsDistanceExist(AddressStruct originAddress, AddressStruct destinationAddress) { DistanceStruct distanceTarget = new DistanceStruct(originAddress, destinationAddress, 0); foreach (DistanceStruct distance in m_xamlImp.GetAllDistances()) { if (distance == distanceTarget) { return(true); } } return(false); }
/// <summary> /// Returns the distance between two addresses if found in the DataSource. Returns -1 if not found /// </summary> /// <param name="originAddress">Origin address</param> /// <param name="destinationAddress">Destination address</param> /// <returns></returns> public static double GetDistanceFromDataSource(AddressStruct originAddress, AddressStruct destinationAddress) { DistanceStruct distanceTarget = new DistanceStruct(originAddress, destinationAddress, 0); foreach (DistanceStruct distance in m_xamlImp.GetAllDistances()) { if (distance == distanceTarget) { return(distance.Distance); } } return(-1); }
/// <summary> /// Returns true if a given address exists in the DataSource /// </summary> /// <param name="address">Address to be checked</param> /// <returns></returns> private bool IsAddressExists(AddressStruct address) { foreach (City city in m_cities) { if (city.city == address.City) { foreach (string street in city.streets) { if (street == address.Street) { return(true); } } } } return(false); }
/// <summary> /// Returns true if a given address exists in the DataSource /// </summary> /// <param name="address">Address to be checked</param> /// <returns></returns> public static bool IsAddressExists(AddressStruct address) { List <City> m_cities = m_xamlImp.GetAllCities(); foreach (City city in m_cities) { if (city.city == address.City) { foreach (string street in city.streets) { if (street == address.Street) { return(true); } } } } return(false); }
//Click Events private async void TestersInRangeButton_Click(object sender, RoutedEventArgs e) { distanceSpinner.Visibility = Visibility.Visible; findClosetTesterButton.IsEnabled = false; ClearFieldsButton.IsEnabled = false; distanceSpinner.Spin = true; m_targetTrainee = GetTrainee(); AddressStruct testAddress = GetTestAddress(); FilterData(); double distanceFromTrainee = 100.000001; await Task.Run(async() => { TestersList = BLTools.GetAllTestersInRange(TestersList, testAddress); TestersInRange = BLTools.GetClonedList(TestersList); distanceFromTrainee = BLTools.CalculateDistanceGoogle(m_targetTrainee.Address, testAddress); }).ContinueWith((s) => { Dispatcher.Invoke(() => { if (TestersList.Count == 0) { MessageBox.Show(string.Format("Couldn't find a tester in range\nTry a different test location"), "Error!", MessageBoxButton.OK, MessageBoxImage.Error); SelectTesterCmi.IsEnabled = false; TriggerSpinner(); } else { MessageBox.Show(string.Format("Success!\nPlease select a tester"), "Success!", MessageBoxButton.OK, MessageBoxImage.Information); SelectTesterCmi.IsEnabled = true; distanceTb.Text = distanceFromTrainee.ToString(); } UpdateCollection(); }); }); }
private void TesterDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { Tester tester = testerDataGrid.SelectedItem as Tester; Trainee trainee = GetTrainee(); AddressStruct testAddress = GetTestAddress(); if (tester == null || testAddress == null || testAddress == new AddressStruct() || trainee == null) { return; } selectTesterButton.IsEnabled = true; double distance = BLTools.GetDistanceFromDataSource(trainee.Address, tester.Address); //If no distance was already measured between 2 addresses if (distance < 0) { Task.Run(() => { distance = BLTools.CalculateDistanceGoogle(trainee.Address, tester.Address); }).ContinueWith((t) => { Dispatcher.Invoke(() => { testerDistanceTb.Text = distance.ToString("0.00") + " Km"; }); }); } //If distance was already measured between 2 addresses else { testerDistanceTb.Text = distance.ToString("0.00") + " Km"; } }
//Methods /// <summary> /// Calculates distance between two address using MapQuest API /// </summary> /// <param name="originAddress">Origin Address</param> /// <param name="destinationAddress">Destination address</param> /// <returns></returns> public static double CalculateDistanceMapQuest(AddressStruct originAddress, AddressStruct destinationAddress) { if (BlValidations.CheckForInternetConnection() == false) { return(-2); } Thread.Sleep(100);//Prevents continious calls double distanceInKm = 100.00001; string drivingTime; string addressMQFormat1 = originAddress.Street + ", " + originAddress.City; string addressMQFormat2 = destinationAddress.Street + ", " + destinationAddress.City; string url = @"https://www.mapquestapi.com/directions/v2/route" + @"?key=" + "7LkPRPGhyp6sB8mYiAFRKpM72oFYAtCh" + @"&from=" + originAddress.ToString() + @"&to=" + destinationAddress.ToString() + @"&outFormat=xml" + @"&ambiguities=ignore&routeType=fastest&doReverseGeocode=false" + @"&enhancedNarrative=false&avoidTimedConditions=false"; //request from MapQuest service the distance between the 2 addresses HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); WebResponse response = request.GetResponse(); Stream dataStream = response.GetResponseStream(); StreamReader sreader = new StreamReader(dataStream); string responsereader = sreader.ReadToEnd(); response.Close(); //the response is given in an XML format XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(responsereader); //If we have a valid answer if (xmldoc.GetElementsByTagName("statusCode")[0].ChildNodes[0].InnerText == "0") { //distance XmlNodeList distance = xmldoc.GetElementsByTagName("distance"); double distInMiles = Convert.ToDouble(distance[0].ChildNodes[0].InnerText); //driving time XmlNodeList formattedTime = xmldoc.GetElementsByTagName("formattedTime"); string fTime = formattedTime[0].ChildNodes[0].InnerText; //MessageBox.Show("Driving Time: " + fTime); drivingTime = fTime; distanceInKm = distInMiles * 1.609344; } //if an error occurred, one of the addresses is not found else if (xmldoc.GetElementsByTagName("statusCode")[0].ChildNodes[0].InnerText == "402") { MessageBox.Show("Address was not found. Please try again"); } //busy network or other error... else { MessageBox.Show("Server is too busy..."); } return(distanceInKm); }
/// <summary> /// Calculates distance between two address using Google Maps API. Returns -2 if no internet connection was found /// </summary> /// <param name="originAddress">Origin address</param> /// <param name="destinationAddress">Destination address</param> /// <returns></returns> public static double CalculateDistanceGoogle(AddressStruct originAddress, AddressStruct destinationAddress) { if (BlValidations.CheckForInternetConnection() == false) { return(-2); } Thread.Sleep(100);//Prevents continious requests double distanceInKm = 100.00001; string drivingTime; string url = @"https://maps.googleapis.com/maps/api/distancematrix/xml?units=imperial" + "&origins=" + originAddress.ToString() + "&destinations=" + destinationAddress.ToString() + "&key=AIzaSyADtzLMIItcgU6_9jSifNHC8oMmDN6bpdA"; //request from Google Distance Matrix API service the distance between the 2 addresses HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); WebResponse response = request.GetResponse(); Stream dataStream = response.GetResponseStream(); StreamReader sreader = new StreamReader(dataStream); string responsereader = sreader.ReadToEnd(); response.Close(); //the response is given in an XML format XmlDocument xmldoc = new XmlDocument(); xmldoc.LoadXml(responsereader); //If we have an answer if (xmldoc.GetElementsByTagName("status")[0].ChildNodes[0].InnerText == "OK") { //If one of the addresses is not found if (xmldoc.GetElementsByTagName("status")[1].ChildNodes[0].InnerText == "NOT_FOUND") { Console.WriteLine("one of the adrresses is not found"); } //if 2 of the addresses are found else { //the returned distance XmlNodeList distanceXml = xmldoc.GetElementsByTagName("distance"); double distanceInMiles = Convert.ToDouble(distanceXml[0].ChildNodes[1].InnerText.Replace(" mi", "")); distanceInKm = distanceInMiles * 1.609344; m_xamlImp.AddDistance(new DistanceStruct(originAddress, destinationAddress, distanceInKm)); //the returned duration XmlNodeList duration = xmldoc.GetElementsByTagName("duration"); string dur = duration[0].ChildNodes[1].InnerText; drivingTime = dur; } } //we have no answer, the web is busy, the waiting time for answer is limited (QUERY_OVER_LIMIT), we should try again (at least 2 seconds between 2 requests) else { Console.WriteLine("We have'nt got an answer, maybe the net is busy..."); } return(distanceInKm); }