Name

ST_Crosses — Prüft, ob zwei Geometrien einige, aber nicht alle, innere Punkte gemeinsam haben

Übersicht

boolean ST_Crosses(geometry g1, geometry g2);

Beschreibung

Vergleicht zwei Geometrieobjekte und gibt true zurück, wenn sich ihre Schnittpunkte "räumlich kreuzen"; das heißt, die Geometrien haben einige, aber nicht alle Innenpunkte gemeinsam. Die Schnittmenge der Innenräume der Geometrien darf nicht leer sein und muss eine Dimension haben, die kleiner ist als die maximale Dimension der beiden Eingabegeometrien, und die Schnittmenge der beiden Geometrien darf keiner der beiden Geometrien entsprechen. Andernfalls gibt es false zurück. Die Kreuzungsbeziehung ist symmetrisch und irreflexiv.

Mathematisch ausgedrückt: ST_Crosses(A, B) ⇔ (dim( Int(A) ⋂ Int(B) ) < max( dim( Int(A) ), dim( Int(B) ) )) ∧ (A ⋂ B ≠ A) ∧ (A ⋂ B ≠ B)

Geometrien kreuzen sich, wenn ihre DE-9IM Schnittpunktmatrix übereinstimmt:

  • T*T****** für die Situationen Punkt/Linie, Punkt/Fläche und Linie/Fläche

  • T*****T** für die Situationen Linie/Punkt, Bereich/Punkt und Bereich/Linie

  • 0******** für Line/Line-Situationen

  • das Ergebnis ist falsch für Punkt/Punkt und Bereich/Fläche Situationen

[Anmerkung]

Die OpenGIS Simple Features Specification definiert dieses Prädikat nur für die Situationen Punkt/Linie, Punkt/Fläche, Linie/Linie und Linie/Fläche. JTS / GEOS erweitert die Definition so, dass sie auch für die Situationen Linie/Punkt, Fläche/Punkt und Fläche/Linie gilt. Dadurch wird die Beziehung symmetrisch.

[Anmerkung]

Diese Funktion beinhaltet automatisch einen Bounding-Box-Vergleich, der alle räumlichen Indizes verwendet, die für die Geometrien verfügbar sind.

Verbessert: 3.0.0 ermöglicht die Unterstützung von GEOMETRYCOLLECTION

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

Diese Methode setzt die SQL/MM-Spezifikation um. SQL-MM 3: 5.1.29

Beispiele

Die folgenden Situationen ergeben alle true.

A LineString crosses a MultiPoint when some, but not all, points lie on the line.

Code
SELECT ST_Crosses(a, b)
FROM (SELECT
  'LINESTRING (10 190,60 80,130 120,190 10)'::geometry AS a,
  'MULTIPOINT (80 170,120 13,130 120,181 142)'::geometry AS b
) AS example;
Ausgabe von Rastern
t
Figure
Geometry figure for visual-st-crosses-01

A Polygon crosses a MultiPoint when some, but not all, points lie in its interior.

Code
SELECT ST_Crosses(a, b)
FROM (SELECT
  'POLYGON ((30 190,10 100,10 10,90 20,110 70,80 130,30 190))'::geometry AS a,
  'MULTIPOINT (56 60,120 13,130 119,181 142)'::geometry AS b
) AS example;
Ausgabe von Rastern
t
Figure
Geometry figure for visual-st-crosses-02

A LineString crosses a Polygon when part of the line lies inside and part outside.

Code
SELECT ST_Crosses(a, b)
FROM (SELECT
  'POLYGON ((30 190,10 100,10 10,90 20,110 70,80 130,30 190))'::geometry AS a,
  'LINESTRING (30 40,70 50,120 150,190 190)'::geometry AS b
) AS example;
Ausgabe von Rastern
t
Figure
Geometry figure for visual-st-crosses-03

Two LineStrings cross when they share an interior point.

Code
SELECT ST_Crosses(a, b)
FROM (SELECT
  'LINESTRING (10 190,60 80,130 120,190 10)'::geometry AS a,
  'LINESTRING (10 10,70 30,110 120,190 190)'::geometry AS b
) AS example;
Ausgabe von Rastern
t
Figure
Geometry figure for visual-st-crosses-04

Stellen Sie sich eine Situation vor, in der ein Benutzer zwei Tabellen hat: eine Tabelle mit Straßen und eine Tabelle mit Autobahnen.

Code
CREATE TABLE roads (
  id serial NOT NULL,
  geom geometry,
  CONSTRAINT roads_pkey PRIMARY KEY (road_id)
);

Code
CREATE TABLE highways (
  id serial NOT NULL,
  the_gem geometry,
  CONSTRAINT roads_pkey PRIMARY KEY (road_id)
);

Um eine Liste von Straßen zu ermitteln, die eine Autobahn kreuzen, verwenden Sie eine Abfrage, die der folgenden ähnelt:

Code
SELECT roads.id
FROM roads, highways
WHERE ST_Crosses(roads.geom, highways.geom);

Siehe auch

ST_Contains, ST_Overlaps