2015-12-16 7 views
5

Рассмотрим следующую функцию для вычисления расстояния между 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. Как бы я мог заставить их вернуть равный результат?
+2

Номера очень близки. Возможно, sqlgeorraphy не делает предположения, что Земля - ​​идеальная сфера? – dasblinkenlight

ответ

2

Из MSDN

Point (geography Data Type)

конструирует географии экземпляра, представляющая экземпляр точки от значений широты и долготы и пространственная привязка ID (SRID)

в вашем код, который вы использовали SRID = 4326.

Spatial Reference Identifiers (SRIDs)

Каждый пространственный экземпляр имеет пространственный эталонный идентификатор (SRID). SRID соответствует пространственной системе отсчета, основанной на конкретном эллипсоиде , используемом как для плоского, так и для картирования с плоской землей.

Очевидно, ваш выбранный SRID 4326 определяет эллиптическую форму Земли, а не идеальную сферу. Ваш код, который вычисляет расстояние с помощью sin/cos, должен предполагать, что Земля - ​​идеальная сфера.

Существует хороший вопрос по этой теме: Geometry column: STGeomFromText and SRID (what is an SRID?)


Для того, чтобы оба метода возвращают тот же результат, что вам нужно выбрать SRID, которая аппроксимирует Землю с одной и той же сфере, что и ваш код. Вам нужно искать его где-то в другом месте. Я мало знаю об этом.