名前

ST_DWithin — 二つのジオメトリが与えらえれた距離内にある場合にはTRUEを返します。

概要

boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);

boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid = true);

説明

ジオメトリが与えられた距離内にある場合にはTRUEを返します。

geometry: 距離の単位は空間参照系で定義される単位です。この関数が意味のあるものにするためには、与えられるジオメトリは両方とも同じ座標系である (同じSRIDを持つ)必要があります。

geography: 単位はメートルで、距離の測定の既定値はuse_spheroid=trueです。より高速な評価のために、use_spheroid=falseとして球面で測定します。

[注記]

3次元ジオメトリではST_3DDWithinを使います。

[注記]

この関数の呼び出しによって、ジオメトリで使用可能なインデクスを使用したバウンディングボックスの比較が自動的に行われます。

[注記]

1.3以前では、距離を見るためにST_Expandと&&とST_Distanceとを併用していて、1.3.4より前では、この関数はそのロジックを使用していました。1.3.4からST_DWithinは、早くなった短縮版の距離関数を使うようになりました。

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

Availability: 1.5.0 ジオグラフィが導入されました。

Enhanced: 2.1.0で、ジオグラフィでの速度が向上しました。詳細についてはMaking Geography fasterを参照して下さい。

Enhanced: 2.1.0 曲線ジオメトリ対応が導入されました。

-- 学校ごとに、3000単位以内の最も近い病院を見つけます。
-- ST_DWithinでインデックスを使用して検索リストの絞り込みを行い、
-- インデックスを使えないST_Distanceで処理します。
-- 空間参照系の単位がメートルならここで言う単位はメートルです。
SELECT DISTINCT ON (s.gid) s.gid, s.school_name, s.geom, h.hospital_name
        FROM schools s
                LEFT JOIN hospitals h ON ST_DWithin(s.the_geom, h.geom, 3000)
        ORDER BY s.gid, ST_Distance(s.geom, h.geom);

-- 病院が近くにない学校
-- 3000単位以内に病院が無い学校を全て見つけます。
-- 単位は空間参照系の単位です (メートル、フィート、度など)
SELECT s.gid, s.school_name
        FROM schools s
                LEFT JOIN hospitals h ON ST_DWithin(s.geom, h.geom, 3000)
        WHERE h.gid IS NULL;

-- 受信可能距離の制限を持つ受信機が受信できる放送塔を見つけます。
-- データは球面メルカトル (SRID=3857)のジオメトリで、範囲は近似的なものとしています。

-- ユーザから見て塔が制限範囲内かをチェックするジオメトリインデックスの生成。
CREATE INDEX ON broadcasting_towers using gist (geom);

-- 塔から見てユーザが制限範囲内かをチェックするジオメトリインデックスの生成。
CREATE INDEX ON broadcasting_towers using gist (ST_Expand(geom, sending_range));

-- ミンスクハケルスペイスにある受信機から4キロメートル以内にある塔の検索
-- ご注意: 二つの条件があります。より短い LEAST(b.sending_range, 4000) ではインデックスが使えません。
SELECT b.tower_id, b.geom
  FROM broadcasting_towers b
  WHERE ST_DWithin(b.geom, 'SRID=3857;POINT(3072163.4 7159374.1)', 4000)
          AND ST_DWithin(b.geom, 'SRID=3857;POINT(3072163.4 7159374.1)', b.sending_range);

                          

関連情報

ST_Distance, ST_Expand, ST_3DDWithin