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

标签 sql postgresql gis postgis

我正在开发一个使用 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)

进一步阅读:

关于sql - 为什么 st_distance ('polygon from north pole' , 'point in italy' ) 结果给我 '0' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59820228/

相关文章:

java - 使用给定经纬度的谷歌地图计算距离

python - 如何使用 python/BeautifulSoup 或类似工具将 kml 文件解析为 csv?

python - “模块”对象没有属性 'OSMGeoAdmin'

java - SQL JAVA JDBC deleteForCustomerID

java - 如何从 Hibernate/JPA 流式传输结果并在处理后释放资源?

php - SQL查询不读取变量

mysql - SQL查询以查找连接表行的计数作为每行的摘要

sql - 在值 PostgreSQL 之间选择最大值

mysql - 返回 "name"列来代替 mysql 中的 ID

mysql - SQL:当表 B 中可能缺少行时连接表 A 和表 B