比较 SQL 中的地理值时的距离不正确
Incorrect Distances When Comparing geography values in SQL
我有一个 SQL 数据库设置,其中包含许多字段,其中之一是名为坐标的地理字段。我需要搜索一定半径内的所有行,为此我正在使用查询
DECLARE @CurrentLocation geography;
SET @CurrentLocation = geography::Point(-84.505562, 39.137706, 4326)
SELECT * , Coordinates.STDistance(@CurrentLocation) AS Distance FROM tParkingLot
WHERE Coordinates.STDistance(@CurrentLocation )<= 200000
这给了我以下结果
第一行按预期返回,因为我使用这些坐标作为我的中心。但是,在 google 地图上测量其他两批时,我发现第 2 行的结果应该更接近 1133.246,第 3 行的结果应该更接近 74673.56
我可以从其他 Whosebug 结果中看出,一个常见的错误是将数据插入 lat/lon 而不是 lon/lat 但是我已经犯了这个错误并更正了我无法确定我为什么得到与实际测量结果相差甚远的距离结果。
问题的原因是纬度和经度的顺序。地理世界传统上使用(lat, lon)
阶,SQL世界定义(x, y)
阶,通常表示(lon, lat)
阶。
Microsoft SQL Server Point 构造函数做出了令人困惑的妥协:他们对几何使用 (x, y)
顺序,但对地理使用 (lat, lon)
顺序:
Point ( Lat, Long, SRID ) [1]
因为你的点在辛辛那提而不是南极洲,交换参数顺序。
我有一个 SQL 数据库设置,其中包含许多字段,其中之一是名为坐标的地理字段。我需要搜索一定半径内的所有行,为此我正在使用查询
DECLARE @CurrentLocation geography;
SET @CurrentLocation = geography::Point(-84.505562, 39.137706, 4326)
SELECT * , Coordinates.STDistance(@CurrentLocation) AS Distance FROM tParkingLot
WHERE Coordinates.STDistance(@CurrentLocation )<= 200000
这给了我以下结果
第一行按预期返回,因为我使用这些坐标作为我的中心。但是,在 google 地图上测量其他两批时,我发现第 2 行的结果应该更接近 1133.246,第 3 行的结果应该更接近 74673.56
我可以从其他 Whosebug 结果中看出,一个常见的错误是将数据插入 lat/lon 而不是 lon/lat 但是我已经犯了这个错误并更正了我无法确定我为什么得到与实际测量结果相差甚远的距离结果。
问题的原因是纬度和经度的顺序。地理世界传统上使用(lat, lon)
阶,SQL世界定义(x, y)
阶,通常表示(lon, lat)
阶。
Microsoft SQL Server Point 构造函数做出了令人困惑的妥协:他们对几何使用 (x, y)
顺序,但对地理使用 (lat, lon)
顺序:
Point ( Lat, Long, SRID ) [1]
因为你的点在辛辛那提而不是南极洲,交换参数顺序。