Skip to content

Weather

This example showcases an interactive weather map of European capital cities using the Smartmaps API. The application displays current temperatures for 26 major European capitals, presenting the data in rectangular labels overlaid on the map. Users can view a comprehensive overview of temperatures across Europe at a glance, with each city's name and temperature clearly visible in a compact, easy-to-read format. The weather icons are mapped to local weather svg files.

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <script src="https://cdn.smartmaps.cloud/packages/smartmaps/smartmaps-gl/v2/umd/smartmaps-gl.min.js"></script>
        <style>
            body {
                margin: 0;
                padding: 0;
            }

            html,
            body,
            #map {
                height: 100%;
            }

            #loading {
                position: absolute;
                top: 50%;
                left: 50%;
                transform: translate(-50%, -50%);
                background: rgba(255, 255, 255, 0.8);
                padding: 10px;
                border-radius: 5px;
                display: none;
                z-index: 999;
            }

            .city-label {
                width: 110px;
                height: 50px;
                background: rgba(255, 255, 255);
                box-shadow: 0 2px 4px rgba(0, 0, 0, 0.16), 0 2px 4px rgba(0, 0, 0, 0.23);
                display: flex;
                flex-direction: row;
                justify-content: space-around;
                align-items: center;
                font-family: 'Noto Sans', sans-serif;
                font-weight: bold;
                font-size: 12px;
                padding: 5px;
                pointer-events: none;
            }

            .weather-icon {
                width: 32px;
                height: 32px;
                margin-right: 5px;
            }

            .city-info {
                display: flex;
                flex-direction: column;
                align-items: flex-start;
            }
        </style>
    </head>

    <body>
        <div id="map"></div>
        <div id="loading">Loading...</div>
        <script>
            const apiKey = 'INSERT API-KEY';
            const map = new smartmapsgl.Map({
                apiKey,
                container: "map",
                center: { lat: 50.0, lng: 10.0 },
                zoom: 4,
                style: smartmapsgl.MapStyle.AUTO
            });

            const capitals = [
                { name: "YellowMap", lat: 49.0069, lng: 8.4037 },
                { name: "Amsterdam", lat: 52.3676, lng: 4.9041 },
                { name: "Athens", lat: 37.9838, lng: 23.7275 },
                { name: "Belgrade", lat: 44.7866, lng: 20.4489 },
                { name: "Berlin", lat: 52.5200, lng: 13.4050 },
                { name: "Bern", lat: 46.9480, lng: 7.4474 },
                { name: "Brussels", lat: 50.8503, lng: 4.3517 },
                { name: "Bucharest", lat: 44.4268, lng: 26.1025 },
                { name: "Budapest", lat: 47.4979, lng: 19.0402 },
                { name: "Copenhagen", lat: 55.6761, lng: 12.5683 },
                { name: "Dublin", lat: 53.3498, lng: -6.2603 },
                { name: "Helsinki", lat: 60.1699, lng: 24.9384 },
                { name: "Lisbon", lat: 38.7223, lng: -9.1393 },
                { name: "London", lat: 51.5074, lng: -0.1278 },
                { name: "Madrid", lat: 40.4168, lng: -3.7038 },
                { name: "Oslo", lat: 59.9139, lng: 10.7522 },
                { name: "Paris", lat: 48.8566, lng: 2.3522 },
                { name: "Prague", lat: 50.0755, lng: 14.4378 },
                { name: "Riga", lat: 56.9496, lng: 24.1052 },
                { name: "Rome", lat: 41.9028, lng: 12.4964 },
                { name: "Sofia", lat: 42.6977, lng: 23.3219 },
                { name: "Stockholm", lat: 59.3293, lng: 18.0686 },
                { name: "Tallinn", lat: 59.4370, lng: 24.7536 },
                { name: "Vienna", lat: 48.2082, lng: 16.3738 },
                { name: "Vilnius", lat: 54.6872, lng: 25.2797 },
                { name: "Warsaw", lat: 52.2297, lng: 21.0122 },
                { name: "Zagreb", lat: 45.8150, lng: 15.9819 }
            ];

                    const iconMapping = {
            0: 'ic_day_sunny',          // Clear
            1: 'ic_day_sunny',          // Mostly Clear
            2: 'ic_day_partlycloudy',   // Partly Cloudy
            3: 'ic_day_cloudy',         // Overcast

            45: 'ic_day_fog',            // Fog
            48: 'ic_day_fog',            // Icy Fog 

            51: 'ic_day_sprinkle',       // Light Drizzle
            53: 'ic_day_sprinkle',       // Drizzle
            55: 'ic_day_sprinkle',       // Heavy Drizzle

            80: 'ic_day_showers',        // Light Showers
            81: 'ic_day_showers',        // Showers
            82: 'ic_day_showers',        // Heavy Showers

            61: 'ic_day_rain',           // Light Rain
            63: 'ic_day_rain',           // Rain
            65: 'ic_day_rain',           // Heavy Rain

            56: 'ic_day_rain_mix',      // Light Freezing Drizzle
            57: 'ic_day_rain_mix',      // Freezing Drizzle
            66: 'ic_day_rain_mix',      // Light Freezing Rain
            67: 'ic_day_rain_mix',      // Freezing Rain

            71: 'ic_day_snow',           // Light Snow
            73: 'ic_day_snow',           // Snow
            75: 'ic_day_snow',           // Heavy Snow

            77: 'ic_day_snowflake_cold',  // Snow Grains

            85: 'ic_day_snow',           // Light Snow Showers
            86: 'ic_day_snow',           // Snow Showers

            95: 'ic_day_thunderstorm',   // Thunderstorm

            96: 'ic_day_storm_showers',  // Light T-storm w/ Hail
            99: 'ic_day_storm_showers'   // T-storm w/ Hail
        };

            function getWeatherData(lat, lng) {
                const url = `https://weather.smartmaps.cloud/api/v2/weather/point?Latitude=${lat}&Longitude=${lng}&ApiKey=${apiKey}`;
                return fetch(url)
                    .then(response => response.json())
                    .then(data => {
                        if (data.features && data.features.length > 0) {
                            const currently = data.features[0].properties.currently;
                            return {
                                temp: currently.temperature2Meters,
                                icon: currently.weatherCode
                            };
                        }
                        throw new Error('No weather data available');
                    });
            }

            function addRectangles() {
                document.getElementById('loading').style.display = 'block';

                Promise.all(capitals.map(capital =>
                    getWeatherData(capital.lat, capital.lng)
                        .then(weather => ({ ...capital, ...weather }))
                ))
                    .then(capitalsWithWeather => {
                        capitalsWithWeather.forEach((capital, index) => {
                            const el = document.createElement('div');
                            el.className = 'city-label';
                            const localIcon = iconMapping[capital.icon] || 'ic_day_sunny';
                            el.innerHTML = `
                            <img src="/assets/images/weatherImages/${localIcon}.svg" class="weather-icon" alt="Weather icon">
                            <div class="city-info">
                                <span>${capital.name}</span>
                                <span>${capital.temp.toFixed(1)}°C</span>
                            </div>
                        `;

                            new smartmapsgl.Marker({
                                element: el,
                                anchor: 'center'
                            })
                                .setLngLat([capital.lng, capital.lat])
                                .addTo(map);
                        });
                    })
                    .catch(error => {
                        console.error('Error loading weather data:', error);
                        alert('Error loading weather data. Please try again later.');
                    })
                    .finally(() => {
                        document.getElementById('loading').style.display = 'none';
                    });
            }

            map.on('load', addRectangles);
        </script>
    </body>
</html>