Усреднение данных для точек в непосредственной близости с SQL Server 2008 - PullRequest
1 голос
/ 15 апреля 2009

У меня есть приложение, которое получает данные GPS от мобильного устройства, а также получает данные координат, оно также обеспечивает уровень сигнала из сети GSM. Я пытаюсь нанести точки на карту для отображения областей с хорошим уровнем сигнала и областей с низким уровнем сигнала. Когда у меня есть несколько точек, все работает хорошо, точки извлекаются из базы данных, и вокруг точки строится квадрат с верхним левым углом в 0,5 км от точки. Затем я отображаю квадратные формы на карте VE, используя цветовое кодирование для силы сигнала. Проблема в том, что могут быть тысячи и тысячи показаний, и мне нужен способ усреднить те показания, которые находятся на расстоянии менее 0,5 км друг от друга, или мне нужно построить квадрат (или кружок) в SQL Server и усреднить пересечения. Я понятия не имею, с чего начать, поэтому любые ссылки на достойные статьи или некоторые советы будут высоко оценены. Спасибо.

Ответы [ 3 ]

1 голос
/ 16 апреля 2009

Один простой и несколько неточный способ сделать это - уменьшить степень детализации ваших данных. Это может быть даже неточно, в зависимости от того, насколько точны ваши измерения 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(), чтобы сделать то же самое.

Весь смысл в том, чтобы свернуть связку соседних измерений в одно "измерение", а затем взять среднее из свернутых значений.

0 голосов
/ 16 апреля 2009
SELECT
geography::STPointFromText('POINT(' + CONVERT(varchar, AvgSignalReadings.rect_lngmin / 100) + ' ' + CONVERT(varchar, AvgSignalReadings.rect_latmin / 100) + ')', 4326) as Location,
AvgSignalReadings.lat / 100 as Latitude,
AvgSignalReadings.lng / 100 as Longitude,
AvgSignalReadings.SignalStrength
FROM
(
SELECT 
    FLOOR(l.Latitude * 100) as lat, 
    FLOOR(l.Longitude * 100) as lng, 
    AVG(l.SignalStrength) as SignalStrength,
    COUNT(*) as NumberOfReadings
FROM SignalLog l
WHERE l.SignalStrength IS NOT NULL AND l.SignalStrength <> 0 AND l.Location IS NOT NULL 
AND l.[Timestamp] > DATEADD(month, -1, GETDATE())
GROUP BY FLOOR(l.Latitude * 100), FLOOR(l.Longitude * 100))
AS AvgSignalReadings
0 голосов
/ 15 апреля 2009

Возможно, вы захотите взглянуть на Триангуляция Делоне , где вы можете построить координаты X, Y, Z в виде графика. Возможно, не зная точно, что у вас есть для точек, можно использовать X, Y для местоположения, а затем отобразить Z в качестве силы сигнала и создать график всплесков. Я видел только примеры c ++ Пример CodePlex , но это может быть то, для чего вы можете написать функцию SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...