/// <summary>
        /// Processes a location point.
        /// If the point falls within a cluster (in danger), the user has to be notified.
        /// </summary>
        /// <param name="location">A location point that has to be processed</param>
        /// TODO Consider making this async
        public void ProcessLocation(Location location, string token)
        {
            string firebaseToken = _databaseEngine.Get_Firebase_Token(token);
            int    risk          = 0;
            var    clusters      = _clusterService.ClustersInRange(location, -1);

            if (clusters != null)
            {
                if (clusters.Count > 0)
                {
                    risk = RISK.MEDIUM_RISK;

                    clusters.ForEach(cluster =>
                    {
                        var coordinates = cluster.Coordinates;

                        for (int i = 0; i < coordinates.Count; i++)
                        {
                            if (Cluster.HaversineDistance(location, coordinates.ElementAt(i)) <= ProximityToCarrier)
                            {
                                _databaseEngine.Increment_Incidents(location.AccessToken);
                                risk = RISK.HIGH_RISK;
                            }
                        }
                    });

                    RiskDetected(token, firebaseToken, location, risk);
                }
                else
                {
                    ProcessWithUnclusteredLocations(token, location, firebaseToken);
                }
            }
            else
            {
                ProcessWithUnclusteredLocations(token, location, firebaseToken);
            }
        }
Exemple #2
0
        public ObjectResult Cluster_Test([FromBody] Token token_object)
        {
            Location location = JsonConvert.DeserializeObject <Location>(token_object.Object_To_Server);

            return(Ok(JsonConvert.SerializeObject(Cluster_Service.ClustersInRange(location, -1))));
        }
        public ItineraryRiskWrapper ProcessItinerary(Itinerary userItinerary, string access_token)
        {
            double averageClusterDensity = 0;

            ItineraryRisk itinerary = new ItineraryRisk(userItinerary.Created, access_token);

            if (userItinerary.Locations != null)
            {
                if (itinerary.LocationItineraryRisks == null)
                {
                    itinerary.LocationItineraryRisks = new Dictionary <Location, int>();
                }

                List <Location> locationList = userItinerary.Locations;

                locationList.ForEach(location =>
                {
                    var clusters = ClusterService.ClustersInRange(location, -1);

                    if (clusters != null)
                    {
                        averageClusterDensity = CalculateClusteringDensity(clusters);

                        if (averageClusterDensity == 0)
                        {
                            itinerary.LocationItineraryRisks.Add(location, RISK.NO_RISK);
                        }
                        else if (averageClusterDensity > HIGHDENSITY)
                        {
                            itinerary.LocationItineraryRisks.Add(location, RISK.HIGH_RISK);
                        }
                        else
                        {
                            itinerary.LocationItineraryRisks.Add(location, RISK.MEDIUM_RISK);
                        }
                    }
                    else
                    {
                        // Check unclustered current locations
                        var oldClusters = ClusterService.OldClustersInRange(location, -1);

                        if (oldClusters != null)
                        {
                            averageClusterDensity = CalculateClusteringDensity(clusters);
                            if (averageClusterDensity == 0)
                            {
                                itinerary.LocationItineraryRisks.Add(location, RISK.NO_RISK);
                            }
                            else if (averageClusterDensity > HIGHDENSITY)
                            {
                                itinerary.LocationItineraryRisks.Add(location, RISK.MODERATE_RISK);
                            }
                            else
                            {
                                itinerary.LocationItineraryRisks.Add(location, RISK.LOW_RISK);
                            }
                        }
                        else
                        {
                            // No clusters near this location
                            itinerary.LocationItineraryRisks.Add(location, RISK.NO_RISK);
                        }
                    }
                });

                itinerary.TotalItineraryRisk = CalculateTotalRisk(itinerary.LocationItineraryRisks);

                /*itinerary.UserAccessToken = DatabaseEngine.GetUserEmail(access_token)*/;
                if (access_token != WebAppToken)
                {
                    var _id = DatabaseEngine.Insert_Itinerary_Risk(itinerary);
                    itinerary.ID = _id;
                }
            }
            return(new ItineraryRiskWrapper(itinerary));
        }