两点间距离计算时出现了轻微的不一致

5
考虑下面的函数来计算两个点之间的距离
CREATE FUNCTION CoordinateDistanceMiles(
@Latitude1 float,
@Longitude1 float,
@Latitude2 float,
@Longitude2 float
)
RETURNS float 
AS  
BEGIN 
-- CONSTANTS
DECLARE @EarthRadiusInMiles float;
SET @EarthRadiusInMiles = 3963.1
DECLARE @PI  float;
SET @PI = PI();
-- RADIANS conversion
DECLARE @lat1Radians float;
DECLARE @long1Radians float;
DECLARE @lat2Radians float;
DECLARE @long2Radians float;
SET @lat1Radians = @Latitude1 * @PI / 180;
SET @long1Radians = @Longitude1 * @PI / 180;
SET @lat2Radians = @Latitude2 * @PI / 180;
SET @long2Radians = @Longitude2 * @PI / 180;
RETURN Acos(
Cos(@lat1Radians) * Cos(@long1Radians) * Cos(@lat2Radians) * Cos(@long2Radians) + 
Cos(@lat1Radians) * Sin(@long1Radians) * Cos(@lat2Radians) * Sin(@long2Radians) + 
Sin(@lat1Radians) * Sin(@lat2Radians)
) * @EarthRadiusInMiles;
END

以下是使用地理类型的简化版本:

CREATE FUNCTION [dbo].[GetDistanceInMiles]( @lat1 FLOAT , @lon1 FLOAT , @lat2 FLOAT , @lon2 FLOAT)
RETURNS FLOAT
AS
BEGIN
    DECLARE @result FLOAT;

    DECLARE @source GEOGRAPHY = GEOGRAPHY::Point(@lat1, @lon1, 4326)

    DECLARE @target GEOGRAPHY = GEOGRAPHY::Point(@lat2, @lon2, 4326)

    SELECT @result = @source.STDistance(@target) / 1609.344

    RETURN @result
END 

当我运行时
SELECT dbo.CoordinateDistanceMiles(50.73521,-1.96958,50.75822,-2.07768)

它返回4.99171837612563

然而

SELECT dbo.GetDistanceInMiles(50.73521,-1.96958,50.75822,-2.07768)

返回5.0005149496216

我得到的结果略有不同。有人能解释一下吗?

  1. 哪个函数更准确?
  2. 如何使它们返回相等的结果?

2
这些数字非常接近。也许sqlgeorraphy没有假设地球是一个完美的球体? - Sergey Kalinichenko
1个回答

2

来自MSDN的信息

Point (geography数据类型)

使用纬度和经度的值以及空间参考ID (SRID) 构造表示一个点实例的地理实例。

在你的代码中,你使用了SRID=4326。

空间参考标识符(SRIDs)

每个空间实例都有一个空间参考标识符(SRID)。SRID 对应于基于用于平面映射或球面映射的特定椭圆体的空间参考系统。

显然,你选择的SRID 4326 定义了一个椭圆形的地球形状,而不是一个完美的球体。计算距离的代码使用sin/cos函数假设地球是完美的球体。

关于这个主题有一个好问题和答案:Geometry column: STGeomFromText and SRID (what is an SRID?)


为了使两种方法返回相同的结果,你需要选择适用于与你的代码相同球体的SRID。你需要在其他地方查找它。我不太熟悉这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接