2015-07-09 23 views
0

我想用SQL服务器计算两点之间的距离。问题是我得到的结果不准确。计算2点之间的距离。我可以信任SQL服务器的GeoLocation.STDistance函数吗?

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公式)

Distance

回答

1

你指定

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

回报你的观点倒退。运行以下查询,你会明白我的意思。

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

修复的方法是很容易的:当你通过字符串连接创建WKT,只需切换的latitud顺序和longitud

+0

我忘了提及有一个更简单的方法来创建你的观点:https://msdn.microsoft.com/en-us/library/bb933811.aspx –

+0

你是对的。 @本丘尔非常感谢你。 – EAguirre

0

问题看起来是你投以十进制(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 

返回:

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

如果删除投为十进制,看起来像你得到正确的坐标:

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

感谢@格雷格您的回复。不需要转换为十进制(30,20)。根据您的建议,查询距离为36014 mts。问题是这个数字并不接近63673 mts。 – EAguirre