Consider the following function to calculate the distance between 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
And the following simplified version using a geography type:
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
When i started
SELECT dbo.CoordinateDistanceMiles(50.73521,-1.96958,50.75822,-2.07768)
it returns 4.99171837612563
but
SELECT dbo.GetDistanceInMiles(50.73521,-1.96958,50.75822,-2.07768)
returns 5.0005149496216
The results that I get are slightly different from each other. Can someone explain
- Which function above is more accurate?
- How can I make them return an equal result?
Mhoos source share