考虑以下函数来计算two points
之间的距离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
我得到的结果彼此略有不同。有人可以解释
答案 0 :(得分:2)
来自MSDN
构造一个表示Point实例的地理实例 纬度和经度值以及空间参考ID(SRID)
在您的代码中,您使用了SRID = 4326。
Spatial Reference Identifiers (SRIDs)
每个空间实例都有一个空间参考标识符(SRID)。该 SRID对应于基于特定的空间参考系统 椭球用于平地映射或圆球映射。
显然,您选择的SRID 4326定义了地球的椭圆形状,而不是完美的球体。使用sin/cos
计算距离的代码必须假设地球是一个完美的球体。
关于这个主题有一个很好的问题和答案:Geometry column: STGeomFromText and SRID (what is an SRID?)
要使两个方法返回相同的结果,您需要选择与您的代码具有相同球体的近似地球的SRID。你需要在其他地方查找它。我不太了解它。