为什么 st_distance('polygon from north pole', 'point in italy') 结果给我“0”?

Why st_distance('polygon from north pole', 'point in italy') gives me '0' as a result?

我正在开发一个使用 PostgreSQL 作为数据库的应用程序;我的目标是以地理格式存档多边形数据,以便在进行查询时使用 pgAdmin OpenStreetMap 集成轻松可视化它们。我的问题是,当我尝试显示大约在北极定居的多边形与在意大利定居的点之间的距离(以米为单位)时,距离给我的结果是“0”,我知道当多边形时距离为零本身包含点...但这不是我们的情况。 下面的代码是我在这个例子中使用的查询:

SELECT 
  ST_Distance('POLYGON((88.20524 80.31286,89.30506 88.84312,83.62463 89.51824,88.20524 80.31286))'::geography, 
  ST_MakePoint(14.295750, 40.898207)::geography)

你能帮我解决这个问题吗?谢谢。

我认为 PostGIS 3.0 在坐标中的小数位数方面存在一些问题。

将小数精度降低一位,例如ST_MakePoint(14.29575, 40.89820),它应该可以工作。这不是我引以为豪的解决方案,但假设它是 ST_Distance 中的一个错误,我相信它是一个可以接受的解决方法。

SELECT 
  ST_Distance('POLYGON((88.20524 80.31286,89.30506 88.84312,83.62463 89.51824,88.20524 80.31286))'::geography, 
  ST_MakePoint(14.29575, 40.89820)::geography);

   st_distance    
------------------
 5250149.46929165
(1 Zeile)

测试环境

SELECT version();
                                                                   version                                                                   
---------------------------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 12.1 (Ubuntu 12.1-1.pgdg16.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609, 64-bit
(1 Zeile)

SELECT postgis_full_version();
                                                                                        postgis_full_version                                                                                         
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 POSTGIS="3.0.0 r17983" [EXTENSION] PGSQL="120" GEOS="3.7.1-CAPI-1.11.1 27a5e771" PROJ="Rel. 4.9.2, 08 September 2015" LIBXML="2.9.3" LIBJSON="0.11.99" LIBPROTOBUF="1.2.1" WAGYU="0.4.3 (Internal)"
(1 Zeile)

我试图弄清楚这个结果集,但似乎 ST_Distance 无法处理点和多边形之间的特定小数点组合。对于给定的多边形,如果该点具有 多于 5 个小数位 :

,则它将不起作用
WITH j (p1,p2) AS (
  VALUES ('POLYGON((88.20524 80.31286,89.30506 88.84312,83.62463 89.51824,88.20524 80.31286))',
          'POINT(14.295750 40.898207)')
) 
SELECT 
  ST_Distance(ST_AsText(p1,5)::GEOGRAPHY,
              ST_AsText(p2,5)::GEOGRAPHY) AS five_digits,
  ST_Distance(ST_AsText(p1,6)::GEOGRAPHY,
              ST_AsText(p2,6)::GEOGRAPHY) AS six_digits
FROM j;

   five_digits    | six_digits 
------------------+------------
 5250148.38625588 |          0
(1 Zeile)

进一步阅读: