Name

ST_DWithin — Prüft, ob zwei Geometrien innerhalb eines bestimmten Abstands liegen

Synopsis

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);

Beschreibung

Gibt true zurück, wenn die Geometrien innerhalb eines bestimmten Abstands liegen

Für geometry: Der Abstand wird in Einheiten angegeben, die durch das räumliche Bezugssystem der Geometrien definiert sind. Damit diese Funktion sinnvoll ist, müssen sich die Ausgangsgeometrien im selben Koordinatensystem befinden (denselben SRID haben).

Für Geografie: Die Einheiten sind in Metern und die Entfernungsmessung ist standardmäßig auf use_spheroid = true eingestellt. Für eine schnellere Auswertung verwenden Sie use_spheroid = false, um auf der Kugel zu messen.

[Note]

Verwenden Sie ST_3DDWithin für 3D-Geometrien.

[Note]

Dieser Funktionsaufruf beinhaltet einen Bounding-Box-Vergleich, der alle für die Geometrien verfügbaren Indizes verwendet.

Diese Methode implementiert die OGC Simple Features Implementation Specification for SQL 1.1.

Verfügbarkeit: Mit Version 1.5.0 wurde die Unterstützung für Geografie eingeführt.

Verbessert: 2.1.0 verbesserte die Geschwindigkeit für Geographie. Siehe Geografie schneller machen für Details.

Verbessert: 2.1.0 Unterstützung für gekrümmte Geometrien wurde eingeführt.

Vor 1.3 wurde ST_Expand üblicherweise in Verbindung mit && und ST_Distance verwendet, um den Abstand zu testen, und vor 1.3.4 verwendete diese Funktion diese Logik. Ab 1.3.4 verwendet ST_DWithin eine schnellere Kurzschluss-Abstandsfunktion.

Beispiele

-- 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);