Один простой и несколько неточный способ сделать это - уменьшить степень детализации ваших данных. Это может быть даже неточно, в зависимости от того, насколько точны ваши измерения x, y.
допустим, у нас есть следующие данные:
x y signal_strenth
10.2 5.1 10
10.1 5.3 12
10.3 5.5 8
Если мы напишем значения x и y, мы получим:
x y signal_strenth
10 5 10
10 5 12
10 5 9
Затем мы можем усреднить эти значения по напольным x и y, чтобы показать, что мы имеем средний уровень сигнала в прямоугольнике (10, 5) - (11, 6).
Вот SQL:
select
floor(x) as rectangle_xmin,
floor(y) as rectangle_ymin,
floor(x) + 1 as rectangle_xmax,
floor(y) + 1 as rectangle_ymax,
avg(signal_strength) as signal_strength
from table
group by floor(x), floor(y);
Теперь, по общему признанию, вы в идеале хотели бы сгруппировать точки данных по расстоянию от точки к точке, и это группирует их по максимальному расстоянию, которое варьируется от 1 до square_root (2) = ~ 1,44, разбивая их на прямоугольные блоки , Так что это меньше чем идеально . Но это может сработать для вас достаточно хорошо, особенно если напольное покрытие / группировка меньше погрешности измерения положения.
Если floor()
недостаточно детализирован, вы можете использовать floor( x *
someweight ) /
someweight, чтобы настроить его на желаемую гранулярность. И, конечно, вы можете использовать ceil()
или round()
, чтобы сделать то же самое.
Весь смысл в том, чтобы свернуть связку соседних измерений в одно "измерение", а затем взять среднее из свернутых значений.