【发布时间】:2015-07-28 15:53:14
【问题描述】:
我在 SQL Server 中有一个函数可以计算两个指定点之间的距离。
该函数使用在 T-SQL 中编写为函数的 Haversine 公式的实现:
CREATE FUNCTION dbo.mpl_geo_distance
(
@LAT1 FLOAT ,
@LON1 FLOAT ,
@LAT2 FLOAT ,
@LON2 FLOAT
)
RETURNS FLOAT
WITH ENCRYPTION
AS
BEGIN
DECLARE @A AS FLOAT
DECLARE @C AS FLOAT
DECLARE @L1 AS FLOAT
DECLARE @L2 AS FLOAT
DECLARE @R1 AS FLOAT
DECLARE @R2 AS FLOAT
SET @R1 = RADIANS(@LAT1)
SET @R2 = RADIANS(@LAT2)
SET @L1 = RADIANS(@LAT2 - @LAT1)
SET @L2 = RADIANS(@LON2 - @LON1)
SET @A = SIN(@L1 / 2) * SIN(@L1 / 2) + COS(@R1) * COS(@R2) * SIN(@L2 / 2) * SIN(@L2 / 2)
SET @C = 2 * ATN2(SQRT(@A), SQRT(1 - @A))
RETURN 6371000 * @C
END
根据我在 SO 上阅读的一些答案,我决定尝试使用 GEOGRAPHY 类型和 STDistance。然而,这两种方法的结果是不同的(虽然差别不大):
-- Distance between London and Eiffel Tower
DECLARE @X GEOGRAPHY = 'POINT(51.5000 -0.1300)'
DECLARE @Y GEOGRAPHY = 'POINT(48.858093 2.294694)'
PRINT @X.STDistance(@Y)
PRINT dbo.mpl_geo_distance (51.5000, -0.1300, 48.858093, 2.294694)
产量:
397909
340704
哪个值更准确,我应该使用哪个?
【问题讨论】:
-
我认为你的纬度和经度倒数了。打印 dbo.mpl_geo_distance(-0.1300, 51.5000, 2.294694, 48.858093)
标签: sql-server-2008 tsql geolocation