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