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)並顯示圖表