{"id":7549,"date":"2022-12-07T23:25:04","date_gmt":"2022-12-08T04:25:04","guid":{"rendered":"https:\/\/weather.umd.edu\/wordpress\/?page_id=7549"},"modified":"2023-08-18T13:21:19","modified_gmt":"2023-08-18T17:21:19","slug":"data-request","status":"publish","type":"page","link":"https:\/\/weather.umd.edu\/wordpress\/micronet\/data-request\/","title":{"rendered":"Data Download"},"content":{"rendered":"\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\"><\/div>\n\n\n\n\n        <form name='data-request' onsubmit=\"return dataRequest()\">\r\n            <br>\r\n            <fieldset>\r\n                <label for=\"start_date\">Start Date:<\/label>\r\n                <input id=\"start_date\" type=\"Date\" name=\"start_date\"><br>\r\n                <label for=\"end_date\">End Date:<\/label>\r\n                <input id=\"end_date\" type=\"Date\" name=\"end_date\"><br>\r\n                <label for=\"time_format\">Time Format:<\/label>\r\n                <input id=\"unix\" type=\"radio\" name=\"time_format\" value=\"unix\" checked> Unix  \r\n                <input id=\"utc\" type=\"radio\" name=\"time_format\" value=\"UTC\"> UTC  \r\n                <input id=\"est\" type=\"radio\" name=\"time_format\" value=\"EST\"> EST\r\n            <\/fieldset>\r\n\r\n            <br>\r\n\r\n            <div>\r\n                <fieldset>\r\n                    <label>Select Stations to Include:<\/label><br>\r\n                    <table style=\"display:inline-block; margin-right: 30px; border: 0px;\">\r\n                        <tr>\r\n                            <td><label for=\"all1\"><b>Select All<\/b><\/label><\/td>\r\n                            <td><input id=\"all1\" type=\"checkbox\" name=\"master_station\" onclick=\"toggle(this, '1');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"Atlantic\">Atlantic<\/label><\/td>\r\n                            <td><input id=\"Atlantic\" type=\"checkbox\" name=\"checkbox1\" value=\"atlantic\" onclick=\"uncheckSelectAll('1');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"AV\">AV Williams<\/label><\/td>\r\n                            <td><input id=\"AV\" type=\"checkbox\" name=\"checkbox1\" value=\"williams\" onclick=\"uncheckSelectAll('1');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"Avrum\">Avrum Gudelsky<\/label><\/td>\r\n                            <td><input id=\"Avrum\" type=\"checkbox\" name=\"checkbox1\" value=\"avrum\" onclick=\"uncheckSelectAll('1');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"Chem\">Chemistry<\/label><\/td>\r\n                            <td><input id=\"Chem\" type=\"checkbox\" name=\"checkbox1\" value=\"chem\" onclick=\"uncheckSelectAll('1');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"Ches\">Chesapeake<\/label><\/td>\r\n                            <td><input id=\"Ches\" type=\"checkbox\" name=\"checkbox1\" value=\"ches\" onclick=\"uncheckSelectAll('1');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"ESSIC\">ESSIC<\/label><\/td>\r\n                            <td><input id=\"ESSIC\" type=\"checkbox\" name=\"checkbox1\" value=\"essic\" onclick=\"uncheckSelectAll('1');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"Golf\">Golf Course<\/label><\/td>\r\n                            <td><input id=\"Golf\" type=\"checkbox\" name=\"checkbox1\" value=\"golf\" onclick=\"uncheckSelectAll('1');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"Observ\">Observatory<\/label><\/td>\r\n                            <td><input id=\"Observ\" type=\"checkbox\" name=\"checkbox1\" value=\"observ\" onclick=\"uncheckSelectAll('1');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"VMH\">Van Munching<\/label><\/td>\r\n                            <td><input id=\"VMH\" type=\"checkbox\" name=\"checkbox1\" value=\"vmh\" onclick=\"uncheckSelectAll('1');\"><\/td>\r\n                        <\/tr>\r\n                    <\/table>\r\n                <\/fieldset>\r\n\r\n                <fieldset>\r\n                    <label>Select Data to Include:<\/label><br>\r\n                    <table style=\"display:inline-block; border: 0px;\">\r\n                        <tr>\r\n                            <td><label for=\"all2\"><b>Select All<\/b><\/label><\/td>\r\n                            <td><input id=\"all2\" type=\"checkbox\" name=\"master_vars\" onclick=\"toggle(this, '2');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"dewpoint\">Dewpoint (F)<\/label><\/td>\r\n                            <td><input id=\"dewpoint\" type=\"checkbox\" name=\"checkbox2\" value=\"dewpt\" onclick=\"uncheckExclusiveCheckbox('totalDailyRain', this); uncheckSelectAll('2');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"barometer\">Pressure (inHg)<\/label><\/td>\r\n                            <td><input id=\"barometer\" type=\"checkbox\" name=\"checkbox2\" value=\"barometer\" onclick=\"uncheckExclusiveCheckbox('totalDailyRain', this); uncheckSelectAll('2');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"rainRate\">Rain Rate (in\/hr)<\/label><\/td>\r\n                            <td><input id=\"rainRate\" type=\"checkbox\" name=\"checkbox2\" value=\"precip\" onclick=\"uncheckExclusiveCheckbox('totalDailyRain', this); uncheckSelectAll('2');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"outTemp\">Temperature (F)<\/label><\/td>\r\n                            <td><input id=\"outTemp\" type=\"checkbox\" name=\"checkbox2\" value=\"temp\" onclick=\"uncheckExclusiveCheckbox('totalDailyRain', this); uncheckSelectAll('2');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"totalDailyRain\">Total Daily Rain (in)<\/label><\/td>\r\n                            <td><input id=\"totalDailyRain\" type=\"checkbox\" name=\"checkbox2\" value=\"totalDailyRain\" onclick=\"checkExclusiveCheckbox('totalDailyRain', this); uncheckSelectAll('2');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"windDir\">Wind Direction (deg)<\/label><\/td>\r\n                            <td><input id=\"windDir\" type=\"checkbox\" name=\"checkbox2\" value=\"windDir\" onclick=\"uncheckExclusiveCheckbox('totalDailyRain', this); uncheckSelectAll('2');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"windGust\">Wind Gust (mph)<\/label><\/td>\r\n                            <td><input id=\"windGust\" type=\"checkbox\" name=\"checkbox2\" value=\"windGust\" onclick=\"uncheckExclusiveCheckbox('totalDailyRain', this); uncheckSelectAll('2');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"windSpeed\">Wind Speed (mph)<\/label><\/td>\r\n                            <td><input id=\"windSpeed\" type=\"checkbox\" name=\"checkbox2\" value=\"windSpeed\" onclick=\"uncheckExclusiveCheckbox('totalDailyRain', this); uncheckSelectAll('2');\"><\/td>\r\n                        <\/tr>\r\n                        <tr>\r\n                            <td><label for=\"rain\">1-min Rainfall (in)<\/label><\/td>\r\n                            <td><input id=\"rain\" type=\"checkbox\" name=\"checkbox2\" value=\"rain\" onclick=\"uncheckExclusiveCheckbox('totalDailyRain', this); uncheckSelectAll('2');\"><\/td>\r\n                        <\/tr>\r\n                    <\/table>\r\n                <\/fieldset>\r\n            <\/div>\r\n            <br>\r\n\r\n            <label for=\"output\">Choose Output File Type:<\/label>\r\n            <select id=\"output\" name=\"output\" style=\"-webkit-appearance: auto;\">\r\n                <option value=\"CSV\">CSV (separate files)<\/option>\r\n                <option value=\"XLSX\">XLSX (one file)<\/option>\r\n            <\/select><br>\r\n            <input type=\"submit\" value=\"Download Data\">\r\n        <\/form>\r\n\r\n        <script type=\"text\/javascript\" src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/xlsx\/0.18.5\/xlsx.full.min.js\"><\/script>\r\n        <script type=\"text\/javascript\">\r\n            (function($) {\r\n                var today = new Date();\r\n                var yesterday = new Date(new Date().getTime() - (24 * 60 * 60 * 1000));\r\n                \r\n                document.addEventListener('DOMContentLoaded', function() {\r\n                    document.getElementById('end_date').value = today.toISOString().slice(0,10);\r\n                    document.getElementById('start_date').value = yesterday.toISOString().slice(0,10);\r\n                });\r\n\r\n                const stationDbMap = {\r\n                    atlantic: 'mesoterp13DB',\r\n                    vmh: 'mesoterp1DB',\r\n                    williams: 'mesoterp8DB',\r\n                    golf: 'mesoterp6DB',\r\n                    chem: 'mesoterp3DB',\r\n                    observ: 'mesoterp2DB',\r\n                    avrum: 'mesoterp7DB',\r\n                    essic: 'mesoterp12DB',\r\n                    ches: 'mesoterp10DB',\r\n                };\r\n\r\n                window.uncheckSelectAll = function(num) {\r\n                    var allCheckbox = document.getElementById('all' + num);\r\n                    var checkboxes = document.querySelectorAll('input[name=\"checkbox' + num + '\"]');\r\n                    var allChecked = true;\r\n                    checkboxes.forEach(cb => {\r\n                        if (!cb.checked) allChecked = false;\r\n                    });\r\n                    if (allCheckbox) allCheckbox.checked = allChecked;\r\n                };\r\n\r\n                window.toggle = function(source, num) {\r\n                    var checkboxes = document.querySelectorAll('input[name=\"checkbox' + num + '\"]');\r\n                    checkboxes.forEach(cb => {\r\n                        if (cb.id !== 'totalDailyRain') {\r\n                            cb.checked = source.checked;\r\n                        }\r\n                    });\r\n                    if (num === '2' && source.checked) {\r\n                        document.getElementById('totalDailyRain').checked = false;\r\n                    }\r\n                };\r\n\r\n                window.checkExclusiveCheckbox = function(exclusiveId, source) {\r\n                    if (source.checked) {\r\n                        document.querySelectorAll('input[name=\"checkbox2\"]').forEach(cb => {\r\n                            if (cb.id !== exclusiveId) cb.checked = false;\r\n                        });\r\n                        document.getElementById('all2').checked = false;\r\n                    }\r\n                };\r\n\r\n                window.uncheckExclusiveCheckbox = function(exclusiveId, source) {\r\n                    if (source.checked) {\r\n                        document.getElementById(exclusiveId).checked = false;\r\n                    }\r\n                };\r\n\r\n                window.dataRequest = function() {\r\n                    console.log(\"Submit triggered\");\r\n                    const checkedStations = document.querySelectorAll('input[name=\"checkbox1\"]:checked');\r\n                    const stationValues = Array.from(checkedStations).map(cb => cb.value);\r\n                    \r\n                    if (stationValues.length === 0) {\r\n                        alert(\"Please select at least one station.\");\r\n                        return false;\r\n                    }\r\n\r\n                    let startdate = document.getElementById('start_date').value;\r\n                    let enddate = document.getElementById('end_date').value;\r\n                    let outputType = document.getElementById(\"output\").value;\r\n                    let timeFormat = document.querySelector('input[name=\"time_format\"]:checked').value;\r\n\r\n                    let startDt = new Date(startdate);\r\n                    let endDt = new Date(enddate);\r\n\r\n                    let cols = ['dateTime'];\r\n                    const colOptions = ['outTemp', 'dewpoint', 'barometer', 'windSpeed', 'windGust', 'windDir', 'rainRate', 'rain', 'totalDailyRain'];\r\n                    \r\n                    const wantTotalRain = document.getElementById('totalDailyRain').checked;\r\n                    let tops = [];\r\n\r\n                    if (wantTotalRain) {\r\n                        cols = ['dateTime', 'totalDailyRain'];\r\n                        tops = ['Date', 'Total Daily Rain (in)'];\r\n                    } else {\r\n                        colOptions.forEach(col => {\r\n                            let el = document.getElementById(col);\r\n                            if (el && el.checked) cols.push(col);\r\n                        });\r\n                        const topMap = {\r\n                            'dateTime': 'Date\/Time', 'outTemp': 'Temp (F)', 'dewpoint': 'Dewpt (F)',\r\n                            'barometer': 'Pressure (inHg)', 'windSpeed': 'Wind Spd (mph)',\r\n                            'windGust': 'Gust (mph)', 'windDir': 'Dir (deg)',\r\n                            'rainRate': 'Rate (in\/hr)', 'rain': '1-min (in)'\r\n                        };\r\n                        tops = cols.map(c => topMap[c]);\r\n                    }\r\n\r\n                    const apiCols = cols.filter(c => c !== 'totalDailyRain');\r\n                    if (wantTotalRain && !apiCols.includes('rain')) apiCols.push('rain');\r\n\r\n                    let wb = (outputType === \"XLSX\") ? XLSX.utils.book_new() : null;\r\n\r\n                    const fetchPromises = stationValues.map(station => {\r\n                        return fetch('https:\/\/weather.umd.edu\/wordpress\/wp-content\/plugins\/meso-fsct\/functions\/get-data.php', {\r\n                            method: 'POST',\r\n                            body: JSON.stringify({\r\n                                startms: startDt.getTime()\/1000,\r\n                                endms: endDt.getTime()\/1000,\r\n                                table: 'archive',\r\n                                cols: apiCols,\r\n                                db: stationDbMap[station]\r\n                            }),\r\n                            headers: { 'Content-Type': 'application\/json' }\r\n                        })\r\n                        .then(res => res.json())\r\n                        .then(data => {\r\n                            if (!data || !data.data) return { station, data: [] };\r\n                            let series = [];\r\n                            if (wantTotalRain) {\r\n                                let daily = {};\r\n                                data.data.forEach(r => {\r\n                                    let day = new Date(r.dateTime * 1000).toLocaleDateString();\r\n                                    daily[day] = (daily[day] || 0) + parseFloat(r.rain || 0);\r\n                                });\r\n                                for (let d in daily) series.push([d, daily[d].toFixed(3)]);\r\n                            } else {\r\n                                data.data.forEach(ob => {\r\n                                    let row = cols.map(c => {\r\n                                        if (c === 'dateTime') {\r\n                                            let d = new Date(ob.dateTime * 1000);\r\n                                            return timeFormat === 'unix' ? ob.dateTime : d.toLocaleString();\r\n                                        }\r\n                                        return ob[c] || '0';\r\n                                    });\r\n                                    series.push(row);\r\n                                });\r\n                                series.reverse();\r\n                            }\r\n                            return { station, data: series };\r\n                        });\r\n                    });\r\n\r\n                    Promise.all(fetchPromises).then(results => {\r\n                        let hasData = results.some(r => r.data.length > 0);\r\n                        if (!hasData) {\r\n                            alert(\"No data found for the selected range.\");\r\n                            return;\r\n                        }\r\n\r\n                        if (outputType === \"XLSX\") {\r\n                            results.forEach(r => {\r\n                                if (r.data.length > 0) {\r\n                                    let ws = XLSX.utils.aoa_to_sheet([tops].concat(r.data));\r\n                                    XLSX.utils.book_append_sheet(wb, ws, r.station);\r\n                                }\r\n                            });\r\n                            XLSX.writeFile(wb, `weather_data.xlsx`);\r\n                        } else {\r\n                            results.forEach(r => {\r\n                                if (r.data.length > 0) {\r\n                                    let csv = \"data:text\/csv;charset=utf-8,\" + tops.join(\",\") + \"\\n\" + r.data.map(row => row.join(\",\")).join(\"\\n\");\r\n                                    let link = document.createElement('a');\r\n                                    link.href = encodeURI(csv);\r\n                                    link.download = `${r.station}.csv`;\r\n                                    link.click();\r\n                                }\r\n                            });\r\n                        }\r\n                    });\r\n\r\n                    return false;\r\n                };\r\n            })(jQuery);\r\n        <\/script>\r\n        \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":82,"featured_media":0,"parent":7510,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-7549","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/weather.umd.edu\/wordpress\/wp-json\/wp\/v2\/pages\/7549","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/weather.umd.edu\/wordpress\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/weather.umd.edu\/wordpress\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/weather.umd.edu\/wordpress\/wp-json\/wp\/v2\/users\/82"}],"replies":[{"embeddable":true,"href":"https:\/\/weather.umd.edu\/wordpress\/wp-json\/wp\/v2\/comments?post=7549"}],"version-history":[{"count":9,"href":"https:\/\/weather.umd.edu\/wordpress\/wp-json\/wp\/v2\/pages\/7549\/revisions"}],"predecessor-version":[{"id":8016,"href":"https:\/\/weather.umd.edu\/wordpress\/wp-json\/wp\/v2\/pages\/7549\/revisions\/8016"}],"up":[{"embeddable":true,"href":"https:\/\/weather.umd.edu\/wordpress\/wp-json\/wp\/v2\/pages\/7510"}],"wp:attachment":[{"href":"https:\/\/weather.umd.edu\/wordpress\/wp-json\/wp\/v2\/media?parent=7549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}