Sql server 2008 多个地理值之间的距离

Sql server 2008 多个地理值之间的距离,sql-server-2008,tsql,sqlgeography,Sql Server 2008,Tsql,Sqlgeography,我们使用多个地理点的平均值来获得平均值,并将其指定为项目位置。 我现在需要追踪这些数据,并以某种方式识别出任何与其他点太远的原始点。 我想我需要使用STDistance,但我担心要做到这一点,我需要两个游标来循环并比较每个点与其他点 如果有一个例子可以帮助说明:我们需要锁定物品的GPS坐标,因此我们要求用户在物品的大致区域内按下按钮,并记录GPS坐标。然后我们取其中的5个,将项目的位置设置为AVG(location.Lat)+AVG(location.Long)。 当其中一个用户在几英里以外的地

我们使用多个地理点的平均值来获得平均值,并将其指定为项目位置。 我现在需要追踪这些数据,并以某种方式识别出任何与其他点太远的原始点。 我想我需要使用STDistance,但我担心要做到这一点,我需要两个游标来循环并比较每个点与其他点

如果有一个例子可以帮助说明:我们需要锁定物品的GPS坐标,因此我们要求用户在物品的大致区域内按下按钮,并记录GPS坐标。然后我们取其中的5个,将项目的位置设置为AVG(location.Lat)+AVG(location.Long)。 当其中一个用户在几英里以外的地方按下时,问题就出现了,把平均值扔掉了,所以现在需要识别其中的任何一个


关于仅在SQL中执行此操作的正确/有效方法,您有什么想法吗?(处理数以百万计的条目,担心每个条目循环使用2个游标会破坏数据库)

丢弃统计上无关紧要的数据对人类来说很容易,但对计算机来说可能有点麻烦。在你的情况下尤其如此,因为你在处理两个维度(纬度和经度)

我建议你看看我几年前写的这个博客:

对于纬度和经度,小数点后的每个数字表示距离。你可以做的是把经纬度四舍五入到小数点后的某个数字,找到模式。删除与模式不同的点,然后平均剩余的未舍入项

因为您是在二维中工作的,所以需要对纬度和经度值分别执行此操作,因为纬度可能会偏离,而经度则不会(这表示实际位置的北面或南面是一个不好的点)。同样地,经度可能很遥远,而纬度显然是正常的。如果任一值为“坏”,则应完全放弃该点

下面是我所说的一个例子:

Declare @Temp Table(Lat Decimal(9,6), Lon Decimal(9,6))

Insert Into @Temp Values(20.12341, 10.98731)
Insert Into @Temp Values(20.12342, 10.98732)
Insert Into @Temp Values(20.12343, 10.98733)
Insert Into @Temp Values(20.12344, 10.98734)
Insert Into @Temp Values(20.12344, 10.68734) -- Latitude OK, Longitude bad
Insert Into @Temp Values(20.32344, 10.98734) -- Longitude OK, Latitude bad
Insert Into @Temp Values(20.42340, 10.68730) -- Both are bad

Select  Avg(Lat), Avg(Lon)
From    @Temp

Select  Avg(T.Lat) As Latitude,
        Avg(T.Lon) As Longitude
From    @Temp T
        Inner Join (
            -- Calculate the mode for the latitude
            Select  Top 1 Convert(Decimal(9,4), Lat) As ModeOfLat
            From    @Temp
            Group By Convert(Decimal(9,4), Lat)
            Order By Count(*) DESC
            ) As Latitudes
            On Convert(Decimal(9,4), Lat) = Latitudes.ModeOfLat
        Inner Join (
            -- Calculate the mode for the longitude
            Select  Top 1 Convert(Decimal(9,4), Lon) As ModeOfLon
            From    @Temp
            Group By Convert(Decimal(9,4), Lon)
            Order By Count(*) DESC
            ) As Longitudes
            On Convert(Decimal(9,4), Lon) = Longitudes.ModeOfLon
如果在SQLServerManagementStudio窗口中运行上述查询,您将看到简单平均值与mode+average方法有很大不同


由于这是一种基于集合的方法,它应该比循环/游标方法快得多。

我认为SQL2008不支持空间函数。另外,创建空间索引有助于提高查询速度。我还应该提到,这种方法适用于任何版本的SQL Server。哇,非常全面的答案!我会和它玩一玩,看看我的进展如何,谢谢。我已经决定对最初的问题使用更简单的逻辑,但我用它来做类似的事情,它工作得很好。再次感谢。我只想回来说,在多个不同的场景中测试后,这是一个非常好的解决方案。再次感谢G。