package weather import "math" // Attempts to complete missing fields that may not // be set by a specific provider, such as DewPoint and WindChill func (u *WeatherUpdate) Enrich() { if u == nil { return } if u.WindChillF == 0 { u.WindChillF = CalculateWindChill(u.TempOutdoorF, u.WindSpeedMPH) } if u.DewPointF == 0 && (u.TempOutdoorF != 0 && u.HumidityOudoor != 0) { u.DewPointF = CalculateDewPoint(u.TempOutdoorF, float64(u.HumidityOudoor)) } if u.BaromAbsoluteIn == 0 { u.BaromAbsoluteIn = u.BaromRelativeIn } } func CalculateDewPoint(tempF, humidity float64) float64 { // Convert temperature from Fahrenheit to Celsius tempC := (tempF - 32) * 5 / 9 // Calculate the dew point using the Magnus-Tetens approximation a := float64(17.27) b := float64(237.7) alpha := (a*tempC)/(b+tempC) + math.Log(humidity/100) dewPointC := (b * alpha) / (a - alpha) // Convert dew point back to Fahrenheit dewPointF := (dewPointC * 9 / 5) + 32 return dewPointF } func CalculateWindChill(tempF float64, windSpeedMPH float64) float64 { if windSpeedMPH <= 3 { // Wind chill calculation doesn't apply for very low wind speeds return tempF } // Formula for calculating wind chill return 35.74 + 0.6215*tempF - 35.75*math.Pow(windSpeedMPH, 0.16) + 0.4275*tempF*math.Pow(windSpeedMPH, 0.16) }