好,我已搜查SO和谷歌,但还没有真正找到一个明确的答案,以便把它扔在那里的SO社区。从MSSQL数据库表中获取最近的经度和纬度?
基本上我有一个关于特定兴趣点的经度和纬度表,sql查询会知道你当前位于哪个位置(哪个位置是表中的那个位置,作为参数传入),因此它那么需要计算并返回最接近经纬度的一行到传入的一行。
我需要这一切都在MSSQL(2012 /存储过程)而不是在调用应用程序(这是.NET),因为我听说SQL处理此类查询通常比.NET更快?
编辑:
我已经找到了STDistance功能赋予英里的诸如位置之间的数字:
DECLARE @NWI geography, @EDI geography
SET @NWI = geography::Point(52.675833,1.282778,4326)
SET @EDI = geography::Point(55.95,-3.3725,4326)
SELECT @NWI.STDistance(@EDI)/1000
但是我不希望有通过所有的纬度/迭代当然,这对表演会很糟糕吗?
我还试图转换在下面评论链接之一(这是MYSQL不MSSQL)但是我得到一个错误的一个例子所指出的,代码如下:
DECLARE @orig_lat decimal(6,2), @orig_long decimal(6,2), @bounding_distance int
set @orig_lat=52.056736;
set @orig_long=1.14822;
set @bounding_distance=1;
SELECT *,((ACOS(SIN(@orig_lat * PI()/180) * SIN('lat' * PI()/180) + COS(@orig_lat * PI()/180) * COS('lat' * PI()/180) * COS((@orig_long - 'lon') * PI()/180)) * 180/PI()) * 60 * 1.1515) AS 'distance'
FROM [DB1].[dbo].[LatLons]
WHERE
(
'lat' BETWEEN (@orig_lat - @bounding_distance) AND (@orig_lat + @bounding_distance)
AND 'lon' BETWEEN (@orig_long - @bounding_distance) AND (@orig_long + @bounding_distance)
)
ORDER BY 'distance' ASC
误差收到的是:
Msg 8114,Level 16,State 5,Line 6将数据类型varchar 转换为数字时出错。
任何人都能解决上述问题或想出更好的解决方案吗?
这可能是你在找什么http://stackoverflow.com/questions/592209/find-closest-numeric-value-in-database – makciook
看起来像你的答案在这里http://stackoverflow.com/questions/5826430/great-circle-distance-formula-t-sql – jeffo
如果建议的主题不能帮助你,请发布你的样本数据。 –