Ejemplo n.º 1
0
 public City(string country, string cityName, string timeZone, CityPopulation population)
 {
     Country    = country;
     Name       = cityName;
     TimeZone   = timeZone;
     Population = population;
 }
Ejemplo n.º 2
0
        public double SustainabilityScore(string city, string state)
        {
            // convert 2 letter state to full name for some requests
            // ex: given NE, select dictionary key for the first entry with value NE (key is full name)
            if (!Constants.states.ContainsValue(state))
            {
                throw new Exception("Only US locations are supported at this time");
            }
            state = Constants.states.FirstOrDefault(s => s.Value == state).Key;

            var client = new HttpClient();

            // population data
            CityPopulation p          = GetPopulationAsync(client, city, state).Result;
            int?           population = p.records.FirstOrDefault()?.fields.population;

            if (population == null)
            {
                throw new Exception("Population data error");
            }

            // use coords from population data to find ev chargers
            // ev charger score (bonus points if > avg)
            List <double> coordinates         = p.records[0].geometry.coordinates;
            var           OCResultList        = GetOpenChargeResultAsync(client, coordinates[1], coordinates[0]).Result;
            int           numEVStations       = OCResultList.Count(ocr => ocr.AddressInfo.Town == city);
            double        EVStationScoreBonus = (double)numEVStations / population.Value;

            // energy consumption score
            int    avgResidentialEnergyUse = GetEnergyConsumptionsResultsAsync(client, city, state).Result;
            double energyScore             = (double)avgResidentialEnergyUse / population.Value;

            // air quality value
            var airResult  = GetAirVisualResultAsync(client, city, state).Result;
            int airQuality = airResult.data.current.pollution.aqius;

            // air quality score based on us official air quality index rankings
            int airScore;

            if (airQuality <= 25)
            {
                airScore = 6;
            }
            else if (airQuality <= 100)
            {
                airScore = 5;
            }
            else if (airQuality <= 200)
            {
                airScore = 4;
            }
            else if (airQuality <= 300)
            {
                airScore = 3;
            }
            else if (airQuality <= 400)
            {
                airScore = 2;
            }
            else if (airQuality <= 500)
            {
                airScore = 1;
            }
            else
            {
                throw new Exception("api error: value not in expected range");
            }

            int finalScore = 10;

            if (airScore < 6)
            {
                finalScore -= (int)((7 - airScore));                // deductions for poor air quality
            }
            if (energyScore > 2)
            {
                finalScore -= (int)((energyScore + 1));                  // unsure of good metric to deduct points for energy score
            }
            if (EVStationScoreBonus > .0001)
            {
                finalScore++;                              // bonus point for ev chargers: approximate avg # evc / population = .1 / 1000 = .0001
            }
            client.Dispose();
            return(finalScore);
        }