2010-02-19 46 views
1

集团,2D绑定箱查询

我有表列ProductID, latitude,longitude,timestampGMT,寻找查询数的多少标识此边框或信封内。

任何有帮助的建议。

+3

我不认为我曾经这样说过,但这个话题不应该是一个维基。 – 2010-02-19 17:52:26

+1

同意,这是**不是**维基的主题。 – casperOne 2010-02-19 17:55:47

+0

没有MS Server 2003 R2这样的东西。 什么是“弧度位置搜索”? – VladV 2010-04-30 13:59:59

回答

3

SQL Server 2008支持GEOGRAPHY数据类型。

,可以储存lat, lon在此数据类型的一列,在它创建一个SPATIAL索引和查询中使用它:

SELECT m.* 
FROM mytable 
ON  coords.STDistance(@mypoint) <= @mydistance 
+0

乍得正在研究2003年,它没有空间索引。 – 2010-02-20 00:03:32

+1

@Byron:好像我错过了'SQL Server 2003'的发布:) :) – Quassnoi 2010-02-20 07:11:10

+0

是的。我也是如此。:)我的意思是2005年,但现在我读了这个问题,他使用的是Windows Server 2003,并且从未提及他的SQL版本号。 – 2010-04-30 13:24:29

1

此问题不应该是社区wiki。如果可以的话,切换它。无论哪种方式,这是你的答案。

@Quassnoi为SQL 2008提供了一个很好的解决方案,但你要求的是2003,对吗? 2003年的地理支持与2008年不一样。您必须像我一样推出自己的产品。这并不难,这取决于您所需的准确性水平。下面是我想出了基于流行的公式两套坐标之间计算距离的标量函数:

-- ===================================================================== 
-- Author:  Byron Sommardahl 
-- Create date: June 15, 2007 
-- Description: Calculates the distance between two sets of coordinates. 
-- ====================================================================== 
CREATE FUNCTION [dbo].[Distance] 
(
@lat1 float, 
@long1 float, 
@lat2 float, 
@long2 float 
) 
RETURNS float 
AS 
BEGIN 

RETURN (3958*3.1415926*sqrt((@[email protected])*(@[email protected]) + cos(@lat2/57.29578)*cos(@lat1/57.29578)*(@[email protected])*(@[email protected]))/180); 
END 
GO 

要使用此功能,只需使用SELECT养活你的坐标:

SELECT dbo.Distance(MyPlace.Lat, MyPlace.Long, TheirPlace.Lat, TheirPlace.Long); 

然后,您可以检查产品是否位于焦点的某个半径范围内。不完全包围盒子,但它会让你朝着正确的方向前进。

+0

没有SQL Server 2003 – Chris 2010-04-29 05:00:23

+0

@Chris:我的错误。我的意思是2005年。确保我的版本号码混淆! – 2010-04-30 13:21:53