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
。