我有一个应用程序,它从移动设备接收GPS数据,以及接收坐标数据,它还提供来自GSM网络的信号强度。我正在尝试绘制地图上的点,以显示信号强度较好的区域和信号强度较差的区域。当我有几个点的时候,一切都很好,这些点是从数据库中检索出来的,并且在离点0.5公里的左上角的点周围建立了一个正方形。然后我在VE地图上使用颜色编码来显示信号强度的正方形形状。问题是,可能有成千上万的读数,我需要一种方法来求出这些读数的平均值,这些读数彼此之间的距离小于0.5公里,或者我需要在SQL Server中构建正方形(或者可能是圆),然后求出交叉点的平均值。我不知道从哪里开始,所以任何指向像样的文章或一些技巧的指针都会非常感谢。谢谢。
发布于 2009-04-16 04:55:30
要做到这一点,一种简单但有些不准确的方法是减小数据粒度。它甚至可能不是不准确的,这取决于你的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()来做同样的事情。
整个要点是将一组附近的测量值折叠为一个“测量值”,然后取折叠后的值的平均值。
发布于 2009-04-15 12:45:58
您可能希望查看Delaunay Triangulation,在其中可以将X、Y、Z坐标绘制到图形中。在不确切知道点是什么的情况下,可以使用X,Y作为位置,然后绘制Z作为信号强度,并创建尖峰图。我只见过SQL CodePlex sample,但是你可以为它写一个c++函数。
发布于 2009-04-16 13:54:46
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 AvgSignalReadingshttps://stackoverflow.com/questions/750787
复制相似问题