summaryrefslogtreecommitdiffstats
path: root/weather_mapper.go
blob: 35a90bf524e06fe27be69e2910f05be680772af4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// weather_mapper.go - Fixed with exported map
package main

import (
	"time"
)

// WeatherMapper handles weather symbol mapping
type WeatherMapper struct {
	symbolMap map[int]Weather
}

// NewWeatherMapper creates a new weather mapper
func NewWeatherMapper() *WeatherMapper {
	return &WeatherMapper{
		symbolMap: FmiToOwm,
	}
}

// Map converts FMI weather symbol to OWM weather with day/night icon
func (wm *WeatherMapper) Map(symbol int, forecastTime, sunrise, sunset time.Time) Weather {
	weather, ok := wm.symbolMap[symbol]
	if !ok {
		weather = Weather{800, "Clear", "clear sky", "01"}
	}

	// Determine day/night
	isDay := !forecastTime.Before(sunrise) && forecastTime.Before(sunset)
	if isDay {
		weather.Icon += "d"
	} else {
		weather.Icon += "n"
	}

	return weather
}

// FmiToOwm is the global FMI to OpenWeatherMap mapping
var FmiToOwm = map[int]Weather{
	1:  {800, "Clear", "clear sky", "01"},
	2:  {801, "Clouds", "few clouds", "02"},
	3:  {802, "Clouds", "scattered clouds", "03"},
	4:  {803, "Clouds", "broken clouds", "04"},
	5:  {804, "Clouds", "overcast clouds", "04"},
	6:  {701, "Mist", "mist", "50"},
	7:  {701, "Mist", "mist", "50"},
	8:  {741, "Fog", "fog", "50"},
	9:  {741, "Fog", "fog", "50"},
	10: {741, "Fog", "fog", "50"},
	11: {300, "Drizzle", "light intensity drizzle", "09"},
	12: {301, "Drizzle", "drizzle", "09"},
	13: {302, "Drizzle", "heavy intensity drizzle", "09"},
	21: {520, "Rain", "light intensity shower rain", "09"},
	22: {521, "Rain", "shower rain", "09"},
	23: {522, "Rain", "heavy intensity shower rain", "09"},
	24: {511, "Rain", "freezing rain", "13"},
	25: {500, "Rain", "light rain", "10"},
	26: {501, "Rain", "moderate rain", "10"},
	27: {502, "Rain", "heavy intensity rain", "10"},
	30: {500, "Rain", "light rain", "10"},
	31: {501, "Rain", "moderate rain", "10"},
	32: {502, "Rain", "heavy intensity rain", "10"},
	40: {600, "Snow", "light snow", "13"},
	41: {600, "Snow", "light snow", "13"},
	42: {601, "Snow", "snow", "13"},
	43: {602, "Snow", "heavy snow", "13"},
	50: {300, "Drizzle", "drizzle", "09"},
	51: {300, "Drizzle", "light drizzle", "09"},
	52: {301, "Drizzle", "drizzle", "09"},
	53: {302, "Drizzle", "heavy drizzle", "09"},
	54: {302, "Drizzle", "heavy drizzle", "09"},
	55: {302, "Drizzle", "heavy drizzle", "09"},
	56: {313, "Rain", "freezing drizzle", "09"},
	57: {314, "Rain", "heavy freezing drizzle", "09"},
	58: {314, "Rain", "freezing drizzle", "09"},
	59: {314, "Rain", "freezing drizzle", "09"},
	60: {500, "Rain", "light rain", "10"},
	61: {501, "Rain", "moderate rain", "10"},
	62: {502, "Rain", "heavy rain", "10"},
	63: {503, "Rain", "very heavy rain", "10"},
	64: {504, "Rain", "extreme rain", "10"},
	65: {504, "Rain", "extreme rain", "10"},
	66: {511, "Rain", "freezing rain", "13"},
	67: {511, "Rain", "freezing rain", "13"},
	68: {611, "Snow", "sleet", "13"},
	69: {612, "Snow", "sleet", "13"},
	70: {600, "Snow", "light snow", "13"},
	71: {601, "Snow", "snow", "13"},
	72: {602, "Snow", "heavy snow", "13"},
	73: {615, "Snow", "rain and snow", "13"},
	74: {616, "Snow", "rain and snow", "13"},
	75: {620, "Snow", "light shower snow", "13"},
	76: {621, "Snow", "shower snow", "13"},
	77: {622, "Snow", "heavy shower snow", "13"},
	78: {622, "Snow", "heavy snow", "13"},
	79: {622, "Snow", "heavy snow", "13"},
	80: {520, "Rain", "light intensity shower rain", "09"},
	81: {521, "Rain", "shower rain", "09"},
	82: {522, "Rain", "heavy intensity shower rain", "09"},
	83: {611, "Rain", "sleet", "13"},
	84: {612, "Rain", "sleet", "13"},
	85: {621, "Snow", "shower snow", "13"},
	86: {622, "Snow", "heavy shower snow", "13"},
	87: {602, "Snow", "heavy snow", "13"},
	88: {602, "Snow", "heavy snow", "13"},
	91: {200, "Thunderstorm", "thunderstorm with light rain", "11"},
	92: {202, "Thunderstorm", "thunderstorm with heavy rain", "11"},
	93: {212, "Thunderstorm", "thunderstorm", "11"},
	94: {221, "Thunderstorm", "ragged thunderstorm", "11"},
}