如何根据位置接近度平均值

时间:2012-04-30 12:55:05

标签: sql database google-maps gps

我有一个带有地理标记值(经度,纬度,值)的SQL表。该表快速累积,有数千个条目。因此,在表中查询某些区域中的值会返回非常大的数据集。

我想知道平均价值的方式,靠近一个值的位置接近,这是一个例子:

表:

Long            lat           value
10.123001       53.567001      10
10.123002       53.567002      12
10.123003       53.567003      18
10.124003       53.568003      13

假设我当前的位置是10.123004,53.567004。如果我要查询附近的值,我将得到值为10,12,18和13的四个原始数据。如果数据集相对较小,则可以使用。如果数据很大我想查询sql的舍入位置(10.123,53.567)并需要sql返回类似

的内容
Long            lat           value
10.123       53.567      10 (this is the average of 10, 12, and 18)
10.124       53.568      13

这可能吗?我们如何根据位置平均大数据集?

sql数据库首先是正确的选择吗?

3 个答案:

答案 0 :(得分:2)

GROUP BY舍入的列,AVG聚合函数应该可以正常工作:

SELECT ROUND(Long, 3) Long, 
       ROUND(Lat, 3) Lat, 
       AVG(value) 
 FROM Table
 GROUP BY ROUND(Long, 3), ROUND(Lat, 3) 

根据需要添加WHERE子句进行过滤。

答案 1 :(得分:1)

这是一些粗略的伪代码,可能是一个开始。您需要为您正在为项目使用的SQL方言中的round函数提供正确的精度参数,因此请理解我提供的3作为Round的第二个参数是数字舍入的精度小数位数,如你原来的帖子所示。

选择round(lat,3),round(long,3),avg(value) 分组(lat,3),round(long,3)

答案 2 :(得分:1)

舍入方法的问题是边界条件 - 当点接近边界时会发生什么。

然而,对于给定点的邻域,最好使用类似的东西:

select *
from table
where long between @MyLong - @DeltaLong and @MyLong + @DeltaLong and
      lat between @MyLat - @DeltaLat and @MyLat + @DeltaLat

为此,您需要定义@DeltaLong和@DeltaLat。

如果这是你的问题,舍入对于摘要工作正常。