コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
        /// <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);
        }
コード例 #7
0
        //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();
                });
            });
        }
コード例 #8
0
        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";
            }
        }
コード例 #9
0
        //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);
        }
コード例 #10
0
        /// <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);
        }