Рассмотрим следующую функцию для вычисления расстояния между 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
Результаты я получаю немного отличаются друг от друга. Может кто-нибудь объяснить
- Какая функция выше, точнее?
- Как бы я мог заставить их вернуть равный результат?
Номера очень близки. Возможно, sqlgeorraphy не делает предположения, что Земля - идеальная сфера? – dasblinkenlight