PostGIS准确性为ST_DWithin结果

时间:2017-10-18 10:05:45

标签: postgis

我在PostGIS空间数据库中测试一个函数:ST_DWithin。在边缘情况下,我有时会得到true,有时会false

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 个答案:

答案 0 :(得分: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和google 浮点比较

上阅读Postgresql文档