//C2H4O = ethylene oxide public static double ShortestDistancePollutantSensor(List <double> s) { List <Factory_Pollutant_Final> pollutantSensors = db.Factory_Pollutant_Finals.ToList(); double largeNum = double.MaxValue; Factory_Pollutant_Final pollutantSensor = new Factory_Pollutant_Final(); foreach (Factory_Pollutant_Final f in pollutantSensors) { double sensorDistance = GeocodeController.LatLongDistance(s[0], s[1], f.Latitude, f.Longitude); if (sensorDistance < largeNum) { largeNum = sensorDistance; pollutantSensor = f; pollutantlat = f.Latitude; pollutantlong = f.Longitude; } } double ethyleneOxide = (double)pollutantSensor.EtO_ugm3; return(ethyleneOxide); }
public ActionResult AQI(string streetAddress) { //index zero = index of model pollutant and index one = whether we use one or eight hour List <WeatherDataFromAPI> weather = WeatherController.WeatherData(); double AQIForO3 = 0; double UGM3 = 0; List <Sensor> threeSensors = new List <Sensor>(); ResultView rv = new ResultView(); // get user location in lat/long List <double> userLocation = GeocodeController.ParseUserLocation(streetAddress); Session["UserLocation"] = userLocation; //grabs the closest sensor to your address List <Sensor> closestSensors = GeocodeController.ShortestToLongest(userLocation); //got all our weather info here List <double> twoClosestAQIs = new List <double>(); List <double> ForecastedAQI = new List <double>(); List <double> PollutantAQIs = new List <double>(); //skips sensor if data is unreliable for (int i = 0; i < closestSensors.Count; i++) { if (twoClosestAQIs.Count == 2) { break; } Sensor closestSensor = closestSensors[i]; if (i == 0) { Session["ClosestSensor"] = closestSensor; } //get sensor readings from OST and SIMMS PollutantController.PullData(closestSensor); PollutantController.PollutantListReadings(60); PollutantController.PollutantAverageReadings(closestSensor); //List<Pollutant> pollutants //List<Ost_Data_Feb_Apr_Final> OSTPollutantData //List<Ost_Data_Feb_Apr_Final> SelectedOstReadings //List<simms_Data_Feb_Apr_Final> SimmsPollutantData //List<simms_Data_Feb_Apr_Final> SelectedSimmsReadings //List<double> PollutantAverages //List<double> PollutantAQIs double eightHrPollutantPPM = PollutantController.eighthourO3; double oneHrPollutantPPM = PollutantController.PollutantAverages[0]; //index zero = index of model pollutant and index one = whether we use one or eight hour List <int> indexAndOneorEight = PollutantController.EightorOneHour(oneHrPollutantPPM, eightHrPollutantPPM); if (eightHrPollutantPPM > 0.125) { // using 1h reading AQIForO3 = PollutantController.CalculateO3AQI(oneHrPollutantPPM, indexAndOneorEight[0], indexAndOneorEight[1]); } else { // using 8h reading AQIForO3 = PollutantController.CalculateO3AQI(eightHrPollutantPPM, indexAndOneorEight[0], indexAndOneorEight[0]); } //if O3AQI is less than 5, it's bad data if (AQIForO3 > 5) { threeSensors.Add(closestSensor); twoClosestAQIs.Add(AQIForO3); int recommendationIndex = PollutantController.EPABreakpointTable(eightHrPollutantPPM); string recommendation = OzoneRecommendations.OzoneLevels[recommendationIndex]; rv.Recommendations = recommendation; if (twoClosestAQIs.Count < 2) { List <double> historicData = PollutantController.HistoricData(closestSensor); rv.HistoricData = historicData; rv.SensorName = closestSensor.CrossStreet; UGM3 = PollutantController.ConvertToUGM3(PollutantController.eighthourO3); for (int j = 0; j < 4; j++) { // using weather data to forecast tomorrow's AQI (index 1 = 24h) double futureWeatherForO3 = WeatherController.WeatherForecastEquation(weather, j, UGM3); // convert from UG/M3 to PPM double futureAQIO3PPM = PollutantController.UGM3ConvertToPPM(futureWeatherForO3, 48); int EPABreakpointIndex = PollutantController.EPABreakpointTable(futureAQIO3PPM); double FutureAQIForO3 = PollutantController.CalculateO3AQI(futureAQIO3PPM, EPABreakpointIndex, indexAndOneorEight[0]); // add future AQIs to list ForecastedAQI.Add(FutureAQIForO3); } double c2H4O = PollutantController.ShortestDistancePollutantSensor(userLocation); rv.PollutantWarning = PollutantController.PollutantWarning(c2H4O); rv.C2H4OPPM = c2H4O; if (closestSensor.Name.Contains("graq")) { int pm25BreakpointIndex = PollutantController.BreakpointIndex(PollutantController.PollutantAverages[2], 3); rv.PM25AQI = Math.Round(PollutantController.CalculateEPA(PollutantController.PollutantAverages[2], pm25BreakpointIndex, 3)); } else { int pm25BreakpointIndex = PollutantController.BreakpointIndex(PollutantController.PollutantAverages[4], 3); rv.PM25AQI = Math.Round(PollutantController.CalculateEPA(PollutantController.PollutantAverages[4], pm25BreakpointIndex, 3)); int no2BreakpointIndex = PollutantController.BreakpointIndex(PollutantController.PollutantAverages[3], 6); rv.NO2AQI = Math.Round(PollutantController.CalculateEPA(PollutantController.PollutantAverages[3], no2BreakpointIndex, 6)); int so2BreakpointIndex = PollutantController.BreakpointIndex(PollutantController.PollutantAverages[5], 5); rv.SO2AQI = Math.Round(PollutantController.CalculateEPA(PollutantController.PollutantAverages[5], so2BreakpointIndex, 5)); int coBreakpointIndex = PollutantController.BreakpointIndex(PollutantController.PollutantAverages[2], 4); rv.CO = Math.Round(PollutantController.CalculateEPA(PollutantController.PollutantAverages[2], coBreakpointIndex, 4)); } } } } rv.TwoClosestSensors = threeSensors; rv.O3AQI = Math.Round(twoClosestAQIs[0]); rv.Second03AQI = Math.Round(twoClosestAQIs[1]); //rv.Third03AQI = twoClosestAQIs[2]; rv.PredictedAQITomorrow = Math.Round(ForecastedAQI[1]); rv.PredictedAQI3Day = Math.Round(ForecastedAQI[2]); rv.PredictedAQI5Day = Math.Round(ForecastedAQI[3]); rv.Weather = weather; rv.Factorylat = PollutantController.pollutantlat; rv.Factorylong = PollutantController.pollutantlong; double EPAAQI = PollutantController.EPAAQIData(); int breakpointIndex = PollutantController.EPABreakpointTable(EPAAQI); double AQIForEPA = PollutantController.CalculateEPA(EPAAQI, breakpointIndex); rv.AQIColor1 = ColorWarning(twoClosestAQIs[0]); rv.AQIColor2 = ColorWarning(twoClosestAQIs[1]); rv.EpaAQI = Math.Round(AQIForEPA); ViewBag.AQI = AQIForO3; Session["ResultView"] = rv; return(View(rv)); }