首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对与SQL Server 2008接近的点的数据求平均值

对与SQL Server 2008接近的点的数据求平均值
EN

Stack Overflow用户
提问于 2009-04-15 08:31:43
回答 3查看 180关注 0票数 1

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-04-16 04:55:30

要做到这一点,一种简单但有些不准确的方法是减小数据粒度。它甚至可能不是不准确的,这取决于你的x,y测量的精确度。

假设我们有以下数据:

代码语言:javascript
复制
x    y   signal_strenth
10.2 5.1 10
10.1 5.3 12
10.3 5.5 8

如果我们将x和y值设为底值,我们会得到:

代码语言:javascript
复制
x    y   signal_strenth    
10   5   10
10   5   12
10   5   9

然后我们可以用平底的x和y对这些值进行平均,以表明我们在矩形(10,5)到(11,6)中具有平均信号强度。

下面是SQL语句:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2009-04-15 12:45:58

您可能希望查看Delaunay Triangulation,在其中可以将X、Y、Z坐标绘制到图形中。在不确切知道点是什么的情况下,可以使用X,Y作为位置,然后绘制Z作为信号强度,并创建尖峰图。我只见过SQL CodePlex sample,但是你可以为它写一个c++函数。

票数 0
EN

Stack Overflow用户

发布于 2009-04-16 13:54:46

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/750787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档