gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:31:52 24 4
gpt4 key购买 nike

考虑以下函数来计算 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

我得到的结果彼此略有不同。谁能解释一下

  1. 以上哪个函数更准确?
  2. 我怎样才能让它们返回相同的结果?

最佳答案

来自 MSDN

Point (geography Data Type)

Constructs a geography instance representing a Point instance from its latitude and longitude values and a spatial reference ID (SRID)

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

Spatial Reference Identifiers (SRIDs)

Each spatial instance has a spatial reference identifier (SRID). The SRID corresponds to a spatial reference system based on the specific ellipsoid used for either flat-earth mapping or round-earth mapping.

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

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

<小时/>

为了使两种方法返回相同的结果,您需要选择与您的代码具有相同球体的近似地球的 SRID。您需要在其他地方查找它。我对此了解不多。

关于sql - 计算两点之间的距离时出现轻微不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34309139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com