平均与SQL Server 2008紧密相邻的点的数据

时间:2009-04-15 08:31:43

标签: sql-server sql-server-2008

我有一个应用程序,它从移动设备接收GPS数据以及接收坐标数据,它还提供来自GSM网络的信号强度。 我试图在地图上绘制点来显示信号强度好的区域和信号强度差的区域。 当我有几个点时它一切运行良好,从数据库中检索点,并在距离点0.5km的左上角的点周围建立一个正方形。然后,我使用颜色编码信号强度在VE地图上显示方形。 问题是可能有成千上万的读数,我需要一种方法来平均那些彼此小于0.5km的读数,或者我需要在SQL Server中构建正方形(或者可能是圆形)并平均交叉点。 我不知道从哪里开始,所以任何指向体面的文章或一些技巧的指针将非常感激。 感谢。

3 个答案:

答案 0 :(得分:1)

执行此操作的一种简单且有些不准确的方法是降低数据的粒度。它甚至可能不准确,具体取决于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()来执行相同的操作。

重点是将一堆附近的测量值折叠一个“测量值”,然后取出折叠值的平均值。

答案 1 :(得分:0)

您可能需要查看Delaunay Triangulation,您可以在其中将X,Y,Z坐标绘制到图表中。有可能,不知道你对点的确切含义,使用X,Y作为位置,然后将Z绘制为信号强度并创建一个尖峰图。我只看过c ++示例CodePlex sample,但它可能是你可以编写SQL函数的东西。

答案 2 :(得分:0)

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