计算两点之间的距离。我可以信任 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 时,只需切换纬度和经度的顺序即可
我想用 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 时,只需切换纬度和经度的顺序即可