我正在使用Azure Stream Analytics。我有数据进入事件中心。进入的数据如下:
[
{
"id": "a2b8bcd8-ff79-4bb7-a86f-615556104c1f",
"mechanism": "geo",
"datetimereporting": "2017-07-23 11:08:00",
"geometry": {
"type": "Point",
"coordinates": [-85.78378, 38.68679]
}
},
{
"id": "a2b8bcd8-ff79-4bb7-a86f-615556104c1f",
"mechanism": "geo",
"datetimereporting": "2017-07-23 11:09:00",
"geometry": {
"type": "Point",
"coordinates": [-85.79378, 38.68679]
}
},
{
"id": "a2b8bcd8-ff79-4bb7-a86f-615556104c1f",
"mechanism": "geo",
"datetimereporting": "2017-07-24 14:08:00",
"geometry": {
"type": "Point",
"coordinates": [-85.78378, 38.68679]
}
},
{
"id": "a2b8bcd8-ff79-4bb7-a86f-615556104c1f",
"mechanism": "geo",
"datetimereporting": "2017-07-24 14:09:00",
"geometry": {
"type": "Point",
"coordinates": [-85.79378, 38.68679]
}
},
{
"id": "a2b8bcd8-ff79-4bb7-a86f-615556104c1f",
"mechanism": "geo",
"datetimereporting": "2017-07-24 14:10:00",
"geometry": {
"type": "Point",
"coordinates": [-85.80378, 38.68679]
}
},
{
"id": "8bb76874-5b91-400d-b0cb-04c8e6c48d26",
"mechanism": "geo",
"datetimereporting": "2017-07-24 14:09:00",
"geometry": {
"type": "Point",
"coordinates": [-115.17281, 36.11464]
}
},
{
"id": "31453016-067f-4664-ade9-244a1d7b769c",
"mechanism": "geo",
"datetimereporting": "2017-07-24 14:10:00",
"geometry": {
"type": "Point",
"coordinates": [-85.76477, 38.32873]
}
}
]
Stream Analytics任务是查看数据并查明进入的坐标是否在特定的多边形中。我已经有ST_WITHIN查询工作了。我有一个包含我想要的所有多边形的参考blob。麻烦就是这个。我需要检测坐标在多边形中的时间以及它在多边形中的长度。
数据每分钟流一次。我每分钟都得到一个新坐标。我知道如何检测它最初是在多边形中。我的斗争是如何判断它在多边形中的长度?我试过LAST,LAG,ISFIRST,但无济于事。目标如下:
答案 0 :(得分:1)
我只是不知道如何构建查询以找出我在多边形中的时间以及持续时间。有人可以帮忙吗?
您需要的是从一组分散的数据中获取线性结果。我建议你通过日期时间desc查询该人是否在最近期间的多边形中。数据可能如下。
| id | Is in polygon | date time |
|-----------------------------|---------------|-------------------- |
| a2b8bcd8-ff79-4bb7-a86f-xxx | true | 2017-07-23 11:08:00 |
| a2b8bcd8-ff79-4bb7-a86f-xxx | true | 2017-07-23 11:07:00 |
| a2b8bcd8-ff79-4bb7-a86f-xxx | false | 2017-07-23 11:06:00 |
获取数据后,您可以将其存储在任何位置(Azure Redis或Blob存储)。最后,您可以使用Azure Function处理临时数据。以下示例代码供您参考。
var totalMinutes = 0;
foreach (var data in collection)
{
if (data.IsInPolygon)
{
totalMinutes++;
}
else
{
break;
}
}
有关如何将数据输出到Azure Function,以下链接供您参考。
How to store data from Azure Stream Analytics in an Azure Redis Cache using Azure Functions
答案 1 :(得分:1)
您还可以将所有逻辑放在Stream Analytics中,以实时获取此信息。 我会使用类似于“典型查询模式”here中描述的查询。您的情况类似于“检测条件的持续时间”示例。 下面是一些快速修改示例来计算多边形中的总持续时间:
WITH SelectPreviousEvent AS
(
SELECT
*,
LAG([time]) OVER (LIMIT DURATION(hour, 24)) as previousTime,
LAG(ST_WITHIN(mypoint,mypolygon)) OVER (LIMIT DURATION(hour, 24)) as previousST_WITHIN
FROM input TIMESTAMP BY [time]
)
SELECT
LAG(time) OVER (LIMIT DURATION(hour, 24) WHEN ST_WITHIN(mypoint,mypolygon) = 0 ) [StartFault],
previousTime [EndFault]
FROM SelectPreviousEvent
WHERE
ST_WITHIN(mypoint,mypolygon) = 0
AND previousST_WITHIN = 1
您需要对此查询进行一些自定义。让我知道它是怎么回事。
谢谢,
JS