ST_DWithin ドキュメントには、最初の関数シグネチャがジオメトリタイプではなくジオメトリタイプを受け入れると記載されています:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
(location、ST_SetSRID(ST_MakePoint(20、-30)、4326))はすべてジオメトリであるため、関数の実行が煩雑であることは理にかなっています。実行していたのはこの署名であったため、2番目の関数は正しく機能していたと思います。 :
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
また、列タイプをGeometryではなくGeographyに切り替えると、問題が解決します。これにより、:
が正しく実行されます。boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters);
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
これが少し役立つことを願っています。
編集:
この部分は
これは、PostgresがST_DWithin()の最初の呼び出しを受け入れた理由を説明できます。これは、postgisがST_DWithin()を地理にキャストするように見えるためです。また、キャストするたびにインデックスが作成されない新しいオブジェクトが生成されるため、実行に時間がかかり、インデックスが無視される理由も説明できます。元の列。