ST_Intersects() în MySQL

Verifică dacă două geometrii au măcar un punct comun (inclusiv pe margine).

Sintaxă
ST_Intersects(g1, g2)

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ște ST_Overlaps() sau ST_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.