Languages: English • 简体中文 • 繁體中文
SensorThings API -同一图表多个数据流(Datastreams)
第一部分教程中,我们依据一个Datastream
的Observation
数据绘制了图表。在这次教程中,为使对比更明显。我们将会在同一图表中绘制多个Datastreams
。
我们将首先取回Thing
和Datastream
, 然后是每个Datastream
的Observation
。最后将这些Observation
添加到图表中。
首先让我们先取回Thing
。如前所示,从SensorThings API取回一个实体(entity)和发送一个HTTP GET
请求一样简单。
先取回Thing
,然后依据@iot.navigationLink
取回Datastreams
,接着继续依据这些的Datastreams
的@iot.navigationLink
取回Observations
。
var thingURI = "https://toronto-bike-snapshot.sensorup.com/v1.0/Things(1501)";
$.getJSON(thingURI , function(thing) {
$.getJSON(thing["Datastreams@iot.navigationLink"] , function(datastreams) {
$.each(datastreams.value, function(i, datastream) {
$.getJSON(datastream["Observations@iot.navigationLink"] , function(observations) {});
});
});
});
与上一个教程相同,在取回一个Datastream
的Observations
数据后,就可以显示在图表上了。因为,我们每次在"$ .each
"循环中调用"addSeries
"函数,就在图表中可以添加多个Datastreams
。
不同的是,这次我们在同一个图表上有不同的数据集,为了增加可读性,可以为每个Datastream
增加Y轴。对此,我们使用Highcharts的"addAxis
"函式。为使图表看起来更整洁,我们将Y轴放在图表的不同侧。
代码如下:
//Change position of YAxis every time we go to "$.each" loop
flag = !flag;
chart.addAxis({
id: datastream.unitOfMeasurement.name,
title: {
text: datastream.unitOfMeasurement.name + " (" + datastream.unitOfMeasurement.symbol + ")"
},
opposite: flag
});
var series = chart.addSeries({
name: datastream.name,
data: data,
tooltip: {
valueSuffix: " " + datastream.unitOfMeasurement.symbol
},
yAxis: datastream.unitOfMeasurement.name
});
其他的代码与先前的教程完全相同,结果如下:
如何提升?
之前我们使用了多次HTTP GET
请求来获取数据,实际上,可以只在一个请求中通过$expand
来获取所有的Thing
、Datastreams
和Observations
。这是SensorThings API的强大功能之一,即,不仅可以在响应中嵌入直接相关的实体,也可在使用$expand
后的响应中嵌入多级的实体。
举例来说,对于教程中的情况,我们只需下面这句请求即可。
/Thing(<id>)?$expand=Datastreams/Observations
。
$expand
:
var thingURI = "https://toronto-bike-snapshot.sensorup.com/v1.0/Things(1501)?$expand=Datastreams/Observations";
$.getJSON(thingURI , function(thing) {
$.each(thing.Datastreams, function(i, datastream) {
var data = $.map(datastream.Observations, function(observation) {
var timestamp = moment(observation.phenomenonTime).valueOf();
return [[timestamp, parseFloat(observation.result)]];
});
data.sort(function(a, b) {
return a[0] - b[0];
});
});
});
$expand
后的结果如下:
下一步?
我们的下一部分教程将向您介绍如何取回一个Datastream
在特定日期的Observations
,这部分内容将帮助您了解SensorThings API的过滤(filtering)功能。此外
,SensorThings服务器支援分页(pagination),所以也会介绍如何依照@iot.nextLink
去取回下一页的Observations
。