如何将OpenWeatherMap API的windSpeed数据接入Chart.js折线图?
思路提示:从OpenWeatherMap API获取风速数据并接入Chart.js折线图
这里给你几个关键方向来推进你的实现,一步步拆解问题:
先搞定API数据的分组与提取
OpenWeatherMap的forecast接口返回的是每3小时一条的数据(data.list),你需要把这些数据按日期分组,提取每天的风速值。比如:- 遍历
data.list,用new Date(item.dt_txt)把时间字符串转成Date对象 - 按日期(比如
getDate())把同一天的风速数据归为一组 - 对每组数据做处理:可以取当天的平均风速、最大风速,或者固定取某一个时段(比如中午12点)的数据,确保最终得到7个对应一周每天的风速值
- 遍历
更新Chart.js的数据集并刷新图表
你已经创建了myLineChart实例,在AJAX的success回调里拿到整理好的风速数组后:- 找到对应风速的数据集(你的代码里是
datasets[1]),把它的data属性替换成你整理好的数组:myLineChart.data.datasets[1].data = processedWindData - 调用
myLineChart.update()让图表重新渲染,这样新数据就会显示出来了
- 找到对应风速的数据集(你的代码里是
确保数据与标签的一致性
现在你的labels是固定的瑞典语星期,要保证你提取的7天风速数据和这些标签的顺序完全对应。如果想让标签动态匹配API返回的日期,可以从分组后的日期里生成对应的星期名称(用toLocaleDateString('sv-SE', {weekday: 'long'})就能得到瑞典语的星期),然后更新myLineChart.data.labels = dynamicLabels再调用update调试与验证每一步
每一步都用console.log()输出结果:比如先打印data.list确认数据结构,再打印分组后的每天风速,最后打印替换后的myLineChart.data.datasets[1].data,确保数据长度和格式都正确,再去看图表的变化
附你的当前代码参考:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <title>GrafIndex</title> <!-- Font Awesome --> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.0/css/all.css"> <!-- Bootstrap core CSS --> <link href="css/bootstrap.min.css" rel="stylesheet"> <!-- Material Design Bootstrap --> <link href="css/mdb.min.css" rel="stylesheet"> <!-- Your custom styles (optional) --> <link href="css/style.css" rel="stylesheet"> </head> <body> <canvas id="lineChart"></canvas> <!-- SCRIPTS --> <!-- JQuery --> <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script> <!-- Bootstrap tooltips --> <script type="text/javascript" src="js/popper.min.js"></script> <!-- Bootstrap core JavaScript --> <script type="text/javascript" src="js/bootstrap.min.js"></script> <!-- MDB core JavaScript --> <script type="text/javascript" src="js/mdb.js"></script> <script> $(document).ready(function() { var apiPrt1 = "https://api.openweathermap.org/data/2.5/forecast?id="; var apiKey = "mykey"; var city = "2673730"; //Stockholm-ID var ctxL = document.getElementById("lineChart").getContext('2d'); var myLineChart = new Chart(ctxL, { type: 'line', data: { labels: ["Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag", "Söndag"], datasets: [{ label: "Celsius", data: [65, 59, 80, 81, 56, 55, 40], backgroundColor: [ 'rgba(105, 0, 132, .2)', ], borderColor: [ 'rgba(200, 99, 132, .7)', ], borderWidth: 2 }, { label: "Vindstyrka m/s", data: [, 48, 40, 19, 86, 27, 10], backgroundColor: [ 'rgba(0, 137, 132, .2)', ], borderColor: [ 'rgba(0, 10, 130, .7)', ], borderWidth: 2 } ] }, options: { responsive: true } }); $.ajax({ url: apiPrt1 + city + apiKey, method: "GET", dataType: "JSON", data: "{}", success: function(data) { console.log(data.list) var windSpeed = data.list[0].wind.speed; console.log(windSpeed) } }) }) </script> </body> </html>
内容的提问来源于stack exchange,提问作者Ivan Jugo Zujovic
相关产品推荐
相关产品推荐

