Azure Stream Analytics - Запрос вдоль потока
Я использую 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, но безрезультатно. Цель заключается в следующем:
- Данные поступают в
- Вы в многоугольнике?
- Да? Как долго вы были в полигоне? Я знаю здесь, что мне нужно понять, когда это было впервые в многоугольнике. Однако, как видно из приведенных выше данных, данные могли быть в многоугольнике 24 часа назад, а теперь они снова там. Я просто не знаю, как структурировать запрос, чтобы узнать, когда я нахожусь в многоугольнике и как долго. Кто-нибудь может помочь?
2 ответа
Вы также можете поместить всю логику в Stream Analytics, чтобы получить это в режиме реального времени. Я бы использовал какой-то запрос, похожий на тот, который описан в наших "типовых шаблонах запросов". Ваш случай похож на пример "Определить продолжительность условия". Ниже приведена небольшая модификация примера для расчета общей длительности в многоугольнике:
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
Я просто не знаю, как структурировать запрос, чтобы узнать, когда я нахожусь в многоугольнике и как долго. Кто-нибудь может помочь?
Что вам нужно, так это получить линейный результат из набора разбросанных данных. Я предлагаю ваш вопрос о том, находится ли человек в многоугольнике для последнего периода, упорядоченного по дате и времени. Данные могут быть следующими.
| 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 Storage). Наконец, вы можете обработать временные данные с помощью функции Azure. Пример кода ниже для вашей справки.
var totalMinutes = 0;
foreach (var data in collection)
{
if (data.IsInPolygon)
{
totalMinutes++;
}
else
{
break;
}
}
Сведения о том, как выводить данные в функцию Azure, приведены ниже.
Как сохранить данные из Azure Stream Analytics в кэше Redis Azure с использованием функций Azure