Languages: English • 简体中文 • 繁體中文
SensorThings API - 可視化更多位置(Location)
在 第二部分 中, 我們:
- 從每個
Location
的Observation
中取回最新可用自行車數據。 -
在地圖上顯示每個
Location
,並設定顏色區分自行車數量。
Locations
。 在這部分,我們會從SensorThings服務器取回所有的Locations
並顯示在地圖上。
加入更多的站點
我們再來看一次之前是如何從SensorThings取回Locations
的。
響應中第一行@iot.count
表示總共有多少Locations
符合這次的查詢。下一行的@iot.nextLink
則表示如何取回下一頁的結果。
假如我們取回所有的結果,地圖會看起來像下面這樣子。
有點擁擠,對吧?不管怎麼樣,讓我們來看看我們是如何取回所有的Locations
的。
首先,我們將向/Locations
的請求封裝到followNextLink
函數中
followNextLink(
axios.get('https://toronto-bike-snapshot.sensorup.com/v1.0/Locations', {
params: {
'$expand': "Things/Datastreams($filter=ObservedProperty/name eq 'available_bikes'),Things/Datastreams/Observations($orderby=phenomenonTime desc;$top=1)"
}
})
)
followNextLink
函數通過遞歸的方式獲取value
,並對所有value
進行拼接,拼接後的完整結果以一個數組的形式返回,當@iot.nextLink
為空時,遞歸結束。如果您好奇具體這個函數是如何完成這個功能的,您可以參考學習JavaScript的遞歸的相關知識。由于這已超出這個教程的學習範圍,因此在此就不再赘述。
function followNextLink(responsePromise) {
return responsePromise.then(function(lastSuccess) {
if(lastSuccess.data['@iot.nextLink']) {
return followNextLink(axios.get(lastSuccess.data['@iot.nextLink'])).then(function(nextLinkSuccess) {
nextLinkSuccess.data.value = lastSuccess.data.value.concat(nextLinkSuccess.data.value);
return nextLinkSuccess;
});
}
else {
return lastSuccess;
}
});
}
聚類
它有效減少了我們地圖上的混亂,但是現在我們無法得知站點是否還有可用的自行車。當然,只要我們放大地圖,這些資訊依然會出現。這個功能在我們只想快速瀏覽地圖時較為實用。
還有一種簡單的方法
radius
和 weight
(stroke 寬度),我們可以適當縮小標記。
return L.circleMarker(latlng, {
color: availableBikes > 5 ? enoughBikeColor : fewBikesColor,
radius: 5,
weight: 2
});
下一步?
目前為止,我們已經從服務器獲取最新的自行車數據並顯示出來。但如果我們可以顯示歷史數據將會更好。比如一小時前有多少可用的自行車? 是不是通常周五晚上9點有很多可用的自行車? 自行車在冬天和夏天的平均使用率的對比? 只要有數據,SensorThings就可以解決,當然還是要一步步進行。下一部分中,我們將展示如何查詢特定時間的可用自行車情況。
讓我們開始時間旅行吧。