PostgreSQL (PostGIS) 和 SQL Server (Spatial) 的结果差异

San*_*mar 1 postgresql sql-server spatial postgis

我有两点,我必须计算它们之间的差异。

我在 SQL Server 中使用以下查询。

SELECT geography::Point(27.185425, 88.124582, 4326)
       .STDistance(geography::Point(27.1854258, 88.124500, 4326));
Run Code Online (Sandbox Code Playgroud)

它运行良好,结果是:

8.12599260290125
Run Code Online (Sandbox Code Playgroud)

现在,当我在 PostgreSQL 中运行以下查询时,同样的情况。

SELECT ST_Distance(ST_GeomFromText('POINT(27.185425 88.124582)',4326),
                   ST_GeomFromText('POINT(27.1854258 88.124500)', 4326));
Run Code Online (Sandbox Code Playgroud)

现在结果是:

8.20039023523232
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么计算两点之间的距离时结果存在差异?

Mic*_*kyT 5

有几件事让你知道了。

在使用 Point 的 SQL Server 版本中,坐标的顺序是 Lat Lon,例如 Y X。OGC 点构造是 XY 或 Lon Lat。

接下来是您发布的 PostGIS 查询实际上返回8.20039023523232e-005,虽然看起来与 SQL Server 结果相似,但要小得多。

最后一个问题是 PostGIS 查询将对象视为几何图形并对它们进行笛卡尔距离。您需要明确地使它们成为地理。

以下是执行 PostGIS 查询的几种方法。我已经交换了坐标顺序

SELECT ST_Distance(ST_GeomFromText('POINT(88.124582 27.185425)',4326)::geography,
                   ST_GeomFromText('POINT(88.124500 27.1854258)',4326)::geography);

SELECT ST_Distance(ST_GeogFromText('SRID=4326;POINT(88.124582 27.185425)'),
                   ST_GeogFromText('SRID=4326;POINT(88.124500 27.1854258)'));

-- Adapted from the PostGIS Manual
SELECT ST_Distance(gg1, gg2) As spheroid_dist, ST_Distance(gg1, gg2, false) As sphere_dist 
FROM (SELECT
    ST_GeogFromText('SRID=4326;POINT(88.124582 27.185425)') As gg1,
    ST_GeogFromText('SRID=4326;POINT(88.124500 27.1854258)') As gg2
    ) As foo  ; 
Run Code Online (Sandbox Code Playgroud)