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