我想找到两组坐标之间的距离。首先我使用内置函数:
declare @lat1 real = 33.1, @lon1 real =-117.1, @lat1 real = 39.6, @lon1 real =-98.7
declare @source geography = geography::Point(@lat1, @long1, 4326);
declare @target geography = geography::Point(@lat2, @long2, 4326);
select @source.STDistance(@target)
现在我使用手动计算来做同样的事情:
-- Kilometers to Miles: 0.621371, Earth Radius: 6378.137
select 0.621371 * 6378.137 * ACOS(ROUND(
(SIN(PI() * @lat2 /180) * SIN(PI() * @lat1/180))
+ (COS(PI() * @lat2 /180) * COS(PI() * @lat1/180) * COS(PI() * @lon1/180 - PI() * @lon2 /180)), 12))
在我对 SQL Server 2014 的测试中,手动功能比内置功能快 4 倍左右。这是正常的还是我错过了一些基本的东西?
SQL Server 2016 对性能有所改进,但基本原因是 STDistance 准确,但如果您了解它们产生的错误,更简单的公式可以更快。
参见例如Geographic distance can be simple and fast,以及 STDistance 中使用的算法的描述:
椭球地球模型上的几何算法
例如
输出