【问题标题】:trouble plotting multiple series of data on highstock在 highstock 上绘制多个系列数据时遇到问题
【发布时间】:2013-07-16 23:53:18
【问题描述】:

有一个个人温度监控项目,将家中不同房间的所有温度记录到 mysql 数据库中,前几天我遇到了 highstock/charts 并一直在使用它,但我似乎无法让它与多个一系列数据。

数据如何记录到表中;

datetime

位置

温度

mysql 中的记录是什么样子的; 2013-07-18 15:52:26 / 大师 / 12.34

我已经设法让这一切都适用于一组数据,但我不确定我需要做什么以及最好的方法是如何格式化 json 和 mysql 查询,以便 highcharts 可以读取 json/mysq 数据并将所有 6 个位置的温度数据绘制在一张图表上。

完整的代码;主要的 highstock 图表文件。 http://pastebin.com/XWkThfc8 这是从 mysql 数据库生成 JSON 的文件。 http://pastebin.com/RXBFr24P

这是使用上述查询的一组数据当前的样子.... [1374593356000,17.31],[1374593427000,17.25],[1374593497000,17.31],[1374593567000,17.31],[1374593638000, 17.31],[1374593708000,17.25],[1374593778000,17.25],[1374593849000,17.25],[1374593919000,17.25],[1374593989000,17.25],[1374594060000,17.25],[1374594130000,17.25] ....等

所以我的问题是;

什么是最好的方法来改变它所以它绘制所有数据,目前它似乎不起作用;

mysql_select_db("mqtt", $con);

$return_arr = array();

$fetch = mysql_query("SELECT timeof, message FROM temperatures WHERE DATE(timeof) BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE() AND locationmap = 'master'");
$i=0;
while ($row = mysql_fetch_array($fetch, MYSQL_ASSOC)) {
$rows[$i]=array(strtotime($row[timeof])*1000 ,(float)$row[message]);
$i++;
}

echo json_encode($rows);

我假设它需要采用这种格式的多组数据。

[{name:'kitchen',dat‌​a:[[date,temp],[date,temp],[date,temp]]},{name:'lounge',dat‌​a:[[date ,temp],[date,temp],[date,temp]]}]

不确定如何更改我的查询,以便将所有位置的数据提取出来,然后正确编码。

UPDATE-1

最新代码,

$return_arr = array();

$fetch = mysql_query("SELECT timeof, locationmap AS location, message AS temp FROM temperatures WHERE DATE(timeof) BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND CURDATE() ORDER BY location, timeof ASC");
$i=0;
while ($row = mysql_fetch_array($fetch, MYSQL_ASSOC)) {
$rows[$i]=array(strtotime($row[timeof])*1000 ,(float)$row[temp],$row[location]);
$i++;
}

echo json_encode($rows);   

但是它没有返回上述正确的格式。

结果是这样的。 (显然有 1000 个整体。)

[1375272426000,22.63,"cupboard"],[1375272496000,22.69,"cupboard"],[1375272566000,22.75,"cupboard"],[1375272637000,22.75,"cupboard"],[1375272707000,22.69,"cupboard"],[1375272777000,22.63,"cupboard"],[1375106429000,17.69,"kitchen"],[1375106500000,17.69,"kitchen"],[1375106570000,17.63,"kitchen"],[1375106640000,17.63,"kitchen"],[1375106711000,17.63,"kitchen"],[1375106781000,17.63,"kitchen"],[1375106851000,17.63,"kitchen"],[1375106921000,17.56,"kitchen"],[1375106992000,17.56,"kitchen"],[1375107062000,17.56,"kitchen"],[1375107132000,17.56,"kitchen"],[1375107203000,17.56,"kitchen"],[1375107273000,17.5,"kitchen"],[1375107343000,17.5,"kitchen"],[1375107413000,17.5,"kitchen"]

我认为我的查询现在是正确的!??只是需要一些关于 json 输出的帮助!

UPDATE-2 感谢 highcharts 论坛,这是我需要 JSON 的格式,只需要 php/mysql 方面的帮助...

[{
  name: 'kitchen',
  data: [
    [time, value],
    [time, value]
  ]
}, {
  name: 'attic',
  data: [
    [time, value],
    [time, value]
  ]
}]

UPDATE-3 让它与多个系列数据一起工作,我不必多次调用我的 json php 脚本,已将这两个文件放在 GIST 上,以供遇到类似问题的任何人使用。

https://gist.github.com/matbor/8854385 https://gist.github.com/matbor/8853902

【问题讨论】:

  • 大家好,任何人都可以帮助我使用正确的语法,对于查询和 json 输出,我认为它只需要一些调整,但我是其中的一些新手,并且一直在谷歌搜索并尝试不同的东西运气不好。

标签: mysql json highstock


【解决方案1】:

我认为最好的方法是遵循“比较演示”并让您的 php 代码仅生成一个数组,具体取决于指定房间的 url 参数:

json.php?room=attic
json.php?room=cupboard

你只输出房间的数据

然后,highstocks 使用以下命令调用单独的 php 文件:

names = ['attic', 'cupboard', '...'],

$.each(names, function(i, name) {

    $.getJSON('jsonp.php?room='+ name.toLowerCase() +'-c.json&callback=?',  function(data) {
...

但老实说,我仍在寻找一种方法来避免多次 http 调用/sql 查询 :-) 特别是对于像 [date1,value1,value1,value3],[date2,value1,value1,value3] 这样的数据。 ..

【讨论】:

  • 这似乎是一个有趣的想法,会试一试并回复您。
  • 感谢您终于修复了它,现在绘制了我所有的温度数据。
【解决方案2】:

是的,它应该是您所包含的格式,而且日期应该是时间戳(以毫秒为单位的时间)并且 temp 需要数值。

【讨论】:

  • 是的,按照您的描述 [datetime,temp],[1374598278000,16.75],[1374598348000,16.75] 设置了日期时间和温度,因为我目前可以一次绘制一个位置。我认为我最大的可能是编写查询,以便将数据提取出来,以便为多个位置格式化 json,例如 [{name:'kitchen',dat‌​a:[[date,temp],[date,temp],[ date,temp]]},{name:'lounge',dat‌​a:[[date,temp],[date,temp],[date,temp]]}] 尝试了一些事情,但似乎无法得到正确的查询。
  • 这个结构看起来不错,但它是系列对象。
  • 已用我的最新查询和输出更新了我的问题,但现在 json 输出出现问题。
  • 这是错误的,因为你有 addtiioanl 参数 "cupboard" [1375272426000,22.63,"cupboard"] 所以请离开 [1375272426000,22.63] 并告诉我们是否有效。
  • 这会起作用,就像我在顶部显示的图表一样,但我需要绘制多个位置:橱柜、阁楼、室外、主人、厨房,所以我可以比较多个系列与此演示一类似,highcharts.com/stock/demo/compare
【解决方案3】:

我已经使用这个项目大约 6 个月了,我想我会分享一些其他人可能会觉得方便的小窍门。
一切都运行得非常好,我有 5 个树莓派将温度数据记录到 CentOS 服务器上的 MYSQL 数据库中,但它突然坏了。该页面根本不会显示任何内容,但在“网络”选项卡下的 Firefox 开发人员工具控制台中,我可以看到 5 个数据库查询中有 3 个导致 500 内部服务器错误。
这看起来很奇怪,因为我没有修改任何东西,一些故障排除最终导致我访问 httpd error_log。有一个 php 错误,表明最大内存分配已用尽。

PHP 致命错误:允许的内存大小为 134217728 字节已用尽 (试图分配 757 个字节)在 /var/www/html/temperatures/json_hs_temps.php

我在 json_hs_temps.php 文件中添加了以下代码行,以将内存从默认的 128Mb 增加到 1Gb。

ini_set('memory_limit', '1024M');

这立即解决了问题,并且图表再次正常加载。

此外,由于以下时区错误,httpd error_log 也变得很大(千兆字节):

PHP 警告:strtotime():依赖系统的时区设置是不安全的。您需要使用 date.timezone 设置或 date_default_timezone_set() 函数。如果您使用了这些方法中的任何一种,但仍然收到此警告,您很可能拼错了时区标识符。我们现在选择时区“UTC”,但请设置 date.timezone 以选择您的时区。在 /var/www/html/temperatures/json_hs_temps.php 第 27 行,引用者:http://192.168.178.49/temperatures/index_hs_temps_multi.php

解决方法是在 json_hs_temps.php 文件中添加以下代码行来设置时区。

date_default_timezone_set("Australia/Hobart");

我认为使用此代码的其他人可能会发生这种情况,所以我希望它可以帮助其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    相关资源
    最近更新 更多