2017-10-18 234 views
1

我正在测试PostGIS空间数据库中的函数:ST_DWithin。在边缘情况下,我有时会得到true,有时会得到falsePostGIS的ST_D结果精度

SELECT ST_DWithin(
    ST_GeomFromText('POINT(-90.01 30)','4326'), 
    ST_GeomFromText('POINT(-90 30)','4326'), 
    '0.01' 
) 
st_dwithin -> false 

SELECT ST_DWithin(
    ST_GeomFromText('POINT(-90.1 30)','4326'), 
    ST_GeomFromText('POINT(-90 30)','4326'), 
    '0.1' 
) 
st_dwithin -> true 

不应同时无论是真的还是假的?有人可以向我解释结果吗?

回答

1

这是由底层计算使用双精度而不是确切的数值类型造成的。因此,计算出的点之间的距离只能精确到15位。

Select ST_Distance(ST_GeomFromText('POINT(-90.01 30)','4326'), 
     ST_GeomFromText('POINT(-90 30)','4326')) d1, 
    ST_Distance(ST_GeomFromText('POINT(-90.1 30)','4326'), 
     ST_GeomFromText('POINT(-90 30)','4326')) d2; 
==> 
     d1   |   d2 
--------------------+-------------------- 
0.0100000000000051 | 0.0999999999999943 
(1 row) 

我们可以看到两个计算距离都是不精确的。而且,浮点相等比较应该始终考虑精度。如果不这样做,我们得到意想不到的结果(如d1 > .01 and d2 < .1

您可以阅读floats DOC PostgreSQL的和google 浮点比较