Languages: English简体中文繁體中文

SensorThings API -同一图表多个数据流(Datastreams)

第一部分教程中,我们依据一个DatastreamObservation数据绘制了图表。在这次教程中,为使对比更明显。我们将会在同一图表中绘制多个Datastreams

我们将首先取回ThingDatastream, 然后是每个DatastreamObservation。最后将这些Observation添加到图表中。

首先让我们先取回Thing。如前所示,从SensorThings API取回一个实体(entity)和发送一个HTTP GET请求一样简单。

GET https://toronto-bike-snapshot.sensorup.com/v1.0/Things(1501)

先取回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) {});
    });
  });
});

与上一个教程相同,在取回一个DatastreamObservations数据后,就可以显示在图表上了。因为,我们每次在"$ .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
});

其他的代码与先前的教程完全相同,结果如下:

在 SensorThings Share 上查看代码

如何提升?

之前我们使用了多次HTTP GET请求来获取数据,实际上,可以只在一个请求中通过$expand来获取所有的ThingDatastreamsObservations。这是SensorThings API的强大功能之一,即,不仅可以在响应中嵌入直接相关的实体,也可在使用$expand后的响应中嵌入多级的实体。 举例来说,对于教程中的情况,我们只需下面这句请求即可。 /Thing(<id>)?$expand=Datastreams/Observations

GET https://toronto-bike-snapshot.sensorup.com/v1.0/Things(1504)?$exapnd=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后的结果如下:
在 SensorThings Share 上查看代码

下一步?

我们的下一部分教程将向您介绍如何取回一个Datastream在特定日期的Observations,这部分内容将帮助您了解SensorThings API的过滤(filtering)功能。此外 ,SensorThings服务器支援分页(pagination),所以也会介绍如何依照@iot.nextLink去取回下一页的Observations

第三部分 - 过滤观测值(Observations)并显示图表