SQL服务器地理STDistance函数返回比其他测试结果

SQL服务器地理STDistance函数返回比其他测试结果

问题描述:

我计算两个纬度长值之间米的距离很大的区别 - 40.1844441 -77.2252771和
40.319166 -76.7880552SQL服务器地理STDistance函数返回比其他测试结果

我测试了这两者之间的距离点在两个以下网站 - 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距离UDF有80米远,似乎正在发挥作用。

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 
+0

约翰·C:我可以证实你的UDFGE O的结果对12位有效数字是正确的,基于地球半径为6371008.8米的球体。 –

+0

@JohnMachin感谢您的额外努力和确认 –

+0

@JohnCappelletti - 谢谢。 我也确认使用“Cosines的球形法”,这正是你计算出来的,它返回40014.8833526855米。是。我用地球的半径为6371008.8。 – Shwe

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

我的离线“余弦球形法”结果是48733米,与原来的VeryOdd 48927米仅有约0.4%的差异。

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

最新新闻:STGeomFromText( 'POINT(经纬度)'等 - 与更频繁的协议相比:第一个纬度经度然后

看到所选的这个问题的答案: Create Geometry/Geography Field from Latitude & Longitude fields (SQL Server)

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