Получите в режиме реального времени расстояние между бегущими машинами на Azure Stream Analytics - PullRequest
1 голос
/ 27 февраля 2020

Мы получим потоковые данные многих автомобилей по конкретному Stream Analytics. Каждый ряд будет иметь идентификатор транспортного средства, широту и долготу транспортного средства. Мне нужно поднять тревогу всякий раз, когда расстояние между ЛЮБЫМИ двумя автомобилями меньше, чем предполагаемые х метров.

Прямо сейчас мы можем рассмотреть радиальное расстояние, чтобы оно было простым. Следовательно, нам нужно рассчитать расстояние автомобилей НЕ от точки фиксации, а от других автомобилей (близлежащие автомобили могут постоянно изменяться). Следовательно, мы не можем точно указать идентификатор автомобиля в запросе.

У нас есть поддержка геопространственных функций https://docs.microsoft.com/en-us/stream-analytics-query/geospatial-functions ..

Я не уверен, что это можно сделать напрямую с помощью запроса Stream Analytics.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Я создал небольшой пример потенциального решения, возможно, не идеального, но он решает проблему в работе ASA.

По сути, я повторно использовал javascript функцию, которая ожидает простую широту и долготу и дает расстояние в метрах. Вы можете потенциально использовать встроенную геопространственную функцию - я не пытался поиграть с этим.

Итак, идея в том, чтобы объединить входные данные для всех входных сообщений (к сожалению, да, вы получаете дублированный результат, но он работает) , а затем вы применяете функцию расстояния и фильтруете на выходе только те, которые имеют расстояние меньше порогового значения. Следующий пример распространяется на выходные данные, только если расстояние не равно нулю (это означает, что оно сравнивается с самим собой) и если оно меньше 5 метров:

with inputData as (select * from input i1 inner join input i2 ON DATEDIFF(second,i1,i2) BETWEEN 0 AND 5),
    distances as (select *, udf.getGeoDistance(i1.lat,i1.long,i2.lat,i2.long) as distance from inputData)



select *
into output
from distances
where distance <> 0 and distance < 5

Функция UDF:

// Sample UDF which returns sum of two values.
function getDistanceFromLatLonInKm(lat1, lon1, lat2, lon2) {

    'use strict';
    var R = 6371; // Radius of the earth in km
    var dLat = deg2rad(lat2 - lat1);  // deg2rad below
    var dLon = deg2rad(lon2 - lon1);
    var a =
        Math.sin(dLat / 2) * Math.sin(dLat / 2) +
        Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
        Math.sin(dLon / 2) * Math.sin(dLon / 2)
        ;
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = R * c * 1000; // Distance in m
    return d;
}

function deg2rad(deg) {
    return deg * (Math.PI / 180);
}

Ввод:

[
    {
        "name" : "car1",
        "lat" : 59.3293371,
        "long" : 13.4877472
    },
    {
        "name" : "car2",
        "lat" : 59.293371,
        "long" : 13.2619422
    },
    {
        "name" : "car3",
        "lat" : 59.3293371,
        "long" : 13.4877040
    }
]

И результат (car1 и car3 близки друг к другу): enter image description here

1 голос
/ 27 февраля 2020

Следуйте за своим последним комментарием, вы используете акробатическое окно и устанавливаете 5-секундное время для получения фрагмента данных. Насколько мне известно, вы все еще не можете рассчитать расстояние друг от друга по sql и гео-пространственным функциям напрямую. упомянуть предупреждение.

Мне пришла в голову мысль, что вы можете использовать Azure Функция в качестве вывода задания ASA. Соберите фрагмент данных и отправьте их в Azure Функция в качестве json параметра. Внутри функции вы можете написать код, чтобы вычислять расстояния между автомобилями друг от друга, даже предупреждая об этом по другим направлениям.

...