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。