SQL服务器GEOGRAPHY STDistance函数返回的差异大于其他测试结果

时间:2017-02-14 22:36:19

标签: sql-server geospatial distance latitude-longitude sqlgeography

我正在计算两个lat长值之间的距离 - 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服务器的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 个答案:

答案 0 :(得分:2)

我也注意到一些奇怪的结果,所以我倾向于使用 geography :: Point(),这似乎可以产生更清晰的结果。即便如此,选项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

答案 1 :(得分:0)

尝试在“VeryOdd”情况下反转lat和lon,即使用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魔法调用的半径/半径...