使用空间功能进行Sql Server 2008半径搜索

时间:2013-04-10 19:26:42

标签: sql-server-2008 spatial-query

我看过许多类似于我的SO问题,但在我的具体案例中,我似乎无法做任何事情。我有一个基于半径的搜索的实现,使用邮政编码和半径可以正常工作,但准确性有点低,因为人们可以住在他们的邮政编码的边缘,它限制应用程序到达只有邮政编码的地方。所以我要做的是使用用户位置的纬度和经度,并使用sql server空间功能,从我的Locations表中返回一个id列表,其中纬度和经度在用户定义的半径内。以下是我到目前为止的情况:

SELECT Id FROM Location WHERE (GetDistanceBetween(39.0997, 94.5783, Latitude,     
Longitude)<=5)

GetDistanceBetween定义如下:

 FUNCTION [GetDistanceBetween]
(
@Lat1 float,
@Long1 float,
@Lat2 float,
@Long2 float
)
RETURNS float
AS
BEGIN

DECLARE @RetVal float;
DECLARE @startPoint geography;
DECLARE @endPoint geography;
SET @startPoint = geography::Point(@Lat1, @Long1, 4326)
SET @endPoint = geography::Point(@Lat2, @Long2, 4326)
SET @RetVal = (SELECT @startPoint.STDistance(@endPoint) / 3959 );


RETURN @RetVal;


END

“位置”表包含三列,纬度,经度和ID。每个Location行都属于另一个表我需要信息的地址。我在存储过程中尝试做的是:

PROCEDURE [dbo].[GetGeoObjectsInRange](
@startLat as float (10),
@startLong as float(10), 
@range  as numeric (15) 
)

AS
BEGIN


Select * from dbo.Address WHERE geolocation_id in (SELECT Id from Location          
WHERE GetDistanceBetween(@startLat, @startLong, Latitude, Longitude)<=@range)
RETURN
END

正如您所看到的,我正在尝试将GetDistanceBetween调用的结果传递给另一个select。这当前返回没有结果,而我的另一种方式返回39结果。谁能看到我做错了什么?我不是一个真正的数据库人,但只是一个项目的开发人员迫使我学习我的方式。 如果重要,我使用NHibernate从C#MVC3应用程序调用存储过程。

我感谢任何帮助。

0 个答案:

没有答案