Ce face ST_Intersects()
ST_Intersects() este relația cea mai largă: returnează 1 dacă geometriile se ating, se suprapun sau una o conține pe cealaltă. Este opusul lui ST_Disjoint().
Spre deosebire de ST_Contains(), un punct aflat pe marginea unui poligon îl intersectează.
Parametri
| Parametru | Descriere |
|---|---|
g1, g2 |
Geometriile comparate. |
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: Ce cartiere traversează fiecare traseu
SELECT t.nume AS traseu, GROUP_CONCAT(c.nume ORDER BY c.id) AS cartiere
FROM trasee t
JOIN cartiere c ON ST_Intersects(t.linie, c.forma)
GROUP BY t.id, t.nume
ORDER BY t.id;
Rezultat
+------------------+--------------------------+
| traseu | cartiere |
+------------------+--------------------------+
| Autobuz 28 | Centru,Copou,Tătărași |
| Tramvai 3 | Centru,Copou,Tătărași |
| Pistă biciclete | Centru,Copou |
+------------------+--------------------------+
Exemplul 2: Marginea contează
SET @centru = ST_GeomFromText('POLYGON((0 0,4 0,4 4,0 4,0 0))');
SELECT ST_Intersects(@centru, Point(4, 2)) AS intersecteaza,
ST_Contains(@centru, Point(4, 2)) AS contine;
Rezultat
+---------------+---------+
| intersecteaza | contine |
+---------------+---------+
| 1 | 0 |
+---------------+---------+
Greșeli frecvente
- Folosești
ST_Intersects()când vrei să excluzi geometriile care doar se ating pe margine. Pentru acel caz foloseșteST_Overlaps()sauST_Contains().
Comenzi înrudite
ST_Disjoint(): Verifică dacă două geometrii nu au niciun punct comun (sunt complet separate).ST_Contains(): Verifică dacă prima geometrie o conține complet pe a doua (de exemplu un punct în interiorul unui poligon).ST_Intersection(): Returnează partea comună a două geometrii (intersecția lor).MBRIntersects() și MBRDisjoint(): Verifică dacă dreptunghiurile de încadrare a două geometrii se intersectează, respectiv dacă sunt separate.