ST_DWithin — ジオメトリが指定したジオメトリから指定した距離内にある場合にTRUEを返します。ジオメトリについては、距離は空間参照系で定義されている単位になります。ジオグラフィについては、メートル単位で、デフォルトではuse_spheroid=true (回転楕円体を使った計算)となり、速いチェックをするにはuse_spheroid=falseとして球面を使って計算します。
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を返します。
geometry: 距離の単位は空間参照系で定義される単位です。引数のジオメトリは全て同じ座標投影、すなわち同じSRIDでなければ、この関数の意味がありません。
geography: メートル単位で計測のデフォルトはuse_spheroid
=trueです。早いチェックを行うにはuse_spheroid
=falseとして球面での計測を行います。
![]() | |
この関数の呼び出しによって、ジオメトリで使用可能なインデクスを使用したバウンディングボックスの比較が自動的に行われます。 |
![]() | |
1.3より前では、ST_Expandは一般的に&&とST_Distanceとを併用して、同じ効果を得ていました。1.3.4より前では、この関数は、基本的にこのやり方の短縮版でした。1.3.4から、ST_DWithinは、大きなバッファ領域について前の版より効果的になる、より短縮した距離関数を使っています。 |
![]() | |
3次元ジオメトリの場合にはST_3DDWithinを使います。 |
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);