Я создал небольшой пример потенциального решения, возможно, не идеального, но он решает проблему в работе 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](https://i.stack.imgur.com/aJZFi.png)