ST_Crosses() în MySQL

Verifică dacă o geometrie o traversează pe alta: o linie care trece printr-un poligon sau două linii care se încrucișează.

Sintaxă
ST_Crosses(g1, g2)

Ce face ST_Crosses()

Pentru două linii, ST_Crosses() returnează 1 dacă se încrucișează în puncte izolate (nu au segmente comune). Pentru o linie și un poligon, returnează 1 dacă linia este parțial în interior și parțial în afară.

Rezultatul este NULL dacă primul argument este poligon sau dacă al doilea este punct, pentru că atunci relația nu are sens.

Parametri

Parametru Descriere
g1 Geometria care traversează (punct, linie).
g2 Geometria traversată.

Ce returnează

1, 0 sau NULL.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE cartiere (
  id INT PRIMARY KEY,
  nume VARCHAR(20),
  forma POLYGON NOT NULL
);

INSERT INTO cartiere VALUES
  (1, 'Centru',   ST_GeomFromText('POLYGON((0 0,4 0,4 4,0 4,0 0))')),
  (2, 'Copou',    ST_GeomFromText('POLYGON((0 4,4 4,4 8,0 8,0 4))')),
  (3, 'Tătărași', ST_GeomFromText('POLYGON((3 1,7 1,7 5,3 5,3 1))')),
  (4, 'Galata',   ST_GeomFromText('POLYGON((10 0,13 0,13 3,10 3,10 0))'));

CREATE TABLE trasee (
  id INT PRIMARY KEY,
  nume VARCHAR(20),
  linie LINESTRING NOT NULL
);

INSERT INTO trasee VALUES
  (1, 'Autobuz 28',  ST_GeomFromText('LINESTRING(0 0,3 0,3 4,6 4)')),
  (2, 'Tramvai 3',   ST_GeomFromText('LINESTRING(1 6,1 2,5 2)')),
  (3, 'Pistă biciclete', ST_GeomFromText('LINESTRING(0 0,2 2,0 4,0 0)'));

Exemplul 1: Trasee care traversează Tătărași

SELECT t.nume, ST_Crosses(t.linie, c.forma) AS traverseaza
FROM trasee t JOIN cartiere c ON c.nume = 'Tătărași'
ORDER BY t.id;

Rezultat

+------------------+-------------+
| nume             | traverseaza |
+------------------+-------------+
| Autobuz 28       |           1 |
| Tramvai 3        |           1 |
| Pistă biciclete  |           0 |
+------------------+-------------+

Exemplul 2: Linii care se încrucișează

SELECT a.nume, b.nume AS cu, ST_Crosses(a.linie, b.linie) AS se_incruciseaza
FROM trasee a JOIN trasee b ON a.id < b.id
ORDER BY a.id, b.id;

Rezultat

+------------+------------------+-----------------+
| nume       | cu               | se_incruciseaza |
+------------+------------------+-----------------+
| Autobuz 28 | Tramvai 3        |               1 |
| Autobuz 28 | Pistă biciclete  |               0 |
| Tramvai 3  | Pistă biciclete  |               1 |
+------------+------------------+-----------------+

Greșeli frecvente

  • Pui poligonul primul: ST_Crosses(cartier, traseu). Rezultatul este NULL; linia trebuie să fie primul argument.

Comenzi înrudite

  • ST_Intersects(): Verifică dacă două geometrii au măcar un punct comun (inclusiv pe margine).
  • ST_Overlaps(): Verifică dacă două geometrii de aceeași dimensiune se suprapun parțial (zona comună nu este niciuna dintre ele).
  • ST_Intersection(): Returnează partea comună a două geometrii (intersecția lor).