我已经查看了许多与我的类似的 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
Location 表包含三列,Latitude、Longitude 和 Id。每个位置行都属于我需要从中获取信息的另一个表地址。我在存储过程中尝试做的是:
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 调用的结果传递给另一个选择。这目前不返回任何结果,而我的其他方式返回 39 个结果。谁能看到我做错了什么?我并不是一个真正的数据库专家,但作为一个项目的唯一开发人员迫使我学习如何绕过它们。如果重要的话,我会使用 NHibernate 从 C# MVC3 应用程序调用存储过程。
我很感激任何帮助。