2017-10-18 8 views
1

私はPostGIS空間データベースの関数をテストしています:ST_DWithin。エッジの場合、私は時々trueと時々falseを得る。PostGIS精度のST_DWithin結果

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) 

計算された距離の両方が不正確であることがわかります。さらに、浮動小数点等価比較は常に精度を考慮する必要があります。行われていない場合、我々はあなたがfloats上でPostgreSQLのドキュメントを読み、浮動小数点比較

グーグルことができ、予期しない結果(のような d1 > .01 and d2 < .1

を取得します