计算两点之间的距离。我可以信任 sql 服务器的 GeoLocation.STDistance 功能吗?

Calculating distance between 2 points. Can I trust in GeoLocation.STDistance function of sql server?

我想用 SQL 服务器计算两点之间的距离。问题是我得到的结果不准确。

Create table #auxdist
(    idempr                 int identity(1,1)
,emp_desc               varchar(60) 
,longitud               float
,latitud                float
,geolocation            geography
)

insert into #auxdist values ('TIng',-55.769,-34.768,NULL)
insert into #auxdist values ('CComp',-55.74132,-34.19647,NULL)

Update  #auxdist
SET  [GeoLocation] = geography::STPointFromText('POINT(' + cast( CAST(cs.latitud   AS decimal(30,20)) as varchar(30)) + ' ' + 
        cast( CAST(cs.longitud AS decimal(30,20)) as varchar(30))+ ')', 4326) 
 from  #auxdist cs 

select   com1.idempr,com2.idempr,           com1.GeoLocation.STDistance(com2.GeoLocation) as dist
 from    #auxdist com1
 join    #auxdist com2 on com1.idempr <> com2.idempr  and com1.idempr=1

使用这个查询我得到两点之间的距离是 36016 米。 然后我使用 http://www.onlineconversion.com/map_greatcircle_distance.htm 检查结果 我找到了一个不同的答案:63673mts(Haversine 公式)

这个问题看起来是你转换为 decimal(30,20),真的需要吗?将下面的结果插入 URL 也会给出截然不同的结果。

select 'POINT(' + cast( CAST(latitud AS decimal(30,20)) as varchar(30)) + ' ' + 
    cast( CAST(longitud AS decimal(30,20)) as varchar(30))+ ')'
from auxdist

Returns:

POINT(-34.76800000000000100000 -55.76899999999999800000)
POINT(-34.19646999999999800000 -55.74132000000000200000)

如果您删除十进制转换,看起来您得到了正确的坐标:

select 'POINT(' + cast(latitud as varchar(30)) + ' ' + 
    cast(longitud as varchar(30))+ ')'
from auxdist

returns

POINT(-34.768 -55.769)
POINT(-34.1965 -55.7413)

您已经向后指定了您的积分。 运行 下面的查询你就会明白我的意思了。

select *, geolocation.Lat as Lat, geolocation.Long as Long
from #auxdist

修复非常简单:当您通过字符串连接创建 WKT 时,只需切换纬度和经度的顺序即可