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就可以解决,当然还是要一步步进行。下一部分中,我们将展示如何查询特定时间的可用自行车情况。
让我们开始时间旅行吧。