SQL Server的GEOGRAPHY STDistance函数返回的结果与其他测试结果相差很大

4
我正在计算两个经纬度值之间的距离,单位为米 - 40.1844441 -77.2252771 和
40.319166 -76.7880552

我在以下两个网站上测试了这两点之间的距离 - http://www.nhc.noaa.gov/gccalc.shtmlhttp://www.movable-type.co.uk/scripts/latlong.html
这两个网站都返回大约40014米。

所以,我再次使用SQL Server的GEOGRAPHY数据类型来计算这两点之间的距离,它返回48927米。对我来说这是一个巨大的差异。
下面是我的代码,欢迎提出任何建议。

declare @latlong1 GEOGRAPHY
declare @latlong2 GEOGRAPHY
DECLARE @distance float

set @latlong1 = GEOGRAPHY::STGeomFromText('POINT(40.1844441 -77.2252771)', 4326)
set @latlong2 = GEOGRAPHY::STGeomFromText('POINT(40.319166 -76.7880552)', 4326)

SET @distance = @latlong1.STDistance(@latlong2)
SELECT @distance -- this returns 48927 meters
2个回答

2

我也注意到一些奇怪的结果,所以我倾向于使用 geography::Point(),它似乎生成更干净的结果。即便如此,选项2距离UDF还有80米的偏差,而UDF似乎是非常准确的。

示例

declare @latlong1 GEOGRAPHY
declare @latlong2 GEOGRAPHY

Set @latlong1 = GEOGRAPHY::STGeomFromText('POINT(40.1844441 -77.2252771)',4326)
Set @latlong2 = GEOGRAPHY::STGeomFromText('POINT(40.319166  -76.7880552)',4326)

Select VeryOdd = @latlong1.STDistance(@latlong2)
      ,SQLGeo  = geography::Point(40.1844441, -77.2252771, 4326).STDistance(geography::Point(40.319166,-76.7880552, 4326)) 
      ,UDFGeo  = [dbo].[udf-Geo-Meters](40.1844441,-77.2252771,40.319166,-76.7880552)

返回值

VeryOdd             SQLGeo              UDFGeo
48927.1485292471    40093.8055001913    40014.8833526855

UDF感兴趣

CREATE Function [dbo].[udf-Geo-Meters](@Lat1 FLOAT, @Lng1 FLOAT, @Lat2 FLOAT, @Lng2 FLOAT)
Returns Float as
Begin
    Return ACOS(SIN(PI()*@Lat1/180.0)*SIN(PI()*@Lat2/180.0)+COS(PI()*@Lat1/180.0)*COS(PI()*@Lat2/180.0)*COS(PI()*@Lng2/180.0-PI()*@Lng1/180.0)) * 6371008.8
    -- 6.371 mean radius of earth in meters
End

John C:我可以确认你的UDFGEO结果是正确的,精确到12个有效数字,基于地球半径为6371008.8米。 - John Machin
@JohnMachin 感谢您额外的努力和确认。 - John Cappelletti
@JohnCappelletti - 谢谢您。我也确认了使用“球面余弦定理”计算出的结果与您计算的完全相同,返回值为40014.8833526855米。是的,我使用了地球半径6371008.8。 - Shwe
使用WGS84椭球体的半长轴和半短轴的平均值,可以得到更接近的结果,因此建议使用R=6367444.6。 - Hossein Narimani Rad

0

尝试在“VeryOdd”情况下颠倒经度和纬度,即使用POINT(-77.2252771 40.1844441)POINT(-76.7880552 40.319166)

我的离线“余弦定理”结果为48733米,与原始的VeryOdd 48927米仅相差约0.4%。

我建议尝试使用不同的纬度和经度进行更多测试,并检查相关函数/方法的文档。

最新消息: STGeomFromText('POINT(longitude latitude)'等--与更常见的协议进行比较:先是纬度,然后是经度

请参阅此问题的选定答案: 从纬度和经度字段(SQL Server)创建几何/地理字段

为了消除剩余的差异,有人需要搜索由4326魔法调用的半径/半径是什么...


使用WGS84椭球体的半长轴和半短轴的平均值,可以得到更接近实际的结果,建议使用 R=6367444.6。 - Hossein Narimani Rad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接