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, но безрезультатно. Цель заключается в следующем:

  1. Данные поступают в
  2. Вы в многоугольнике?
  3. Да? Как долго вы были в полигоне? Я знаю здесь, что мне нужно понять, когда это было впервые в многоугольнике. Однако, как видно из приведенных выше данных, данные могли быть в многоугольнике 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

Другие вопросы по тегам