名称

ST_DWithin — 测试两个几何图形是否在给定距离内

概要

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 在球面上进行测量。

[Note]

对于 3D 几何图形,请使用 ST_3DDWithin

[Note]

此函数调用包括一个边界框比较,它利用几何图形上可用的任何索引。

此方法实现了OGC 简单要素 SQL 1.1 实现规范。

可用性:1.5.0 版本引入了对 geography 的支持

增强:2.1.0 版本提高了 geography 的速度。有关详细信息,请参阅使 Geography 更快

增强:2.1.0 版本引入了对弯曲几何图形的支持。

在 1.3 之前的版本中,ST_Expand 通常与 && 和 ST_Distance 结合使用以测试距离,并且在 1.3.4 之前的版本中,此函数使用了该逻辑。从 1.3.4 开始,ST_DWithin 使用了更快的短路距离函数。

示例

-- Find the nearest hospital to each school
-- that is within 3000 units of the school.
--  We do an ST_DWithin search to utilize indexes to limit our search list
--  that the non-indexable ST_Distance needs to process
-- If the units of the spatial reference is meters then units would be meters
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.geom, h.geom, 3000)
  ORDER BY s.gid, ST_Distance(s.geom, h.geom);

-- The schools with no close hospitals
-- Find all schools with no hospital within 3000 units
-- away from the school.  Units is in units of spatial ref (e.g. meters, feet, degrees)
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;

-- Find broadcasting towers that receiver with limited range can receive.
-- Data is geometry in Spherical Mercator (SRID=3857), ranges are approximate.

-- Create geometry index that will check proximity limit of user to tower
CREATE INDEX ON broadcasting_towers using gist (geom);

-- Create geometry index that will check proximity limit of tower to user
CREATE INDEX ON broadcasting_towers using gist (ST_Expand(geom, sending_range));

-- Query towers that 4-kilometer receiver in Minsk Hackerspace can get
-- Note: two conditions, because shorter LEAST(b.sending_range, 4000) will not use index.
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_3DDWithin