ST_Intersection() în MySQL

Operații spațiale MySQL 5.6+

Returnează partea comună a două geometrii (intersecția lor).

Sintaxă
ST_Intersection(g1, g2)

Ce face ST_Intersection()

ST_Intersection() returnează punctele care sunt în ambele geometrii: zona în care se suprapun două cartiere, porțiunea dintr-un traseu aflată într-o zonă sau punctul în care se încrucișează două linii. Dacă geometriile nu au nimic comun, rezultatul este o geometrie goală.

Din MySQL 8.0.27 funcția acceptă și SRID geografic.

Parametri

Parametru Descriere
g1, g2 Geometriile intersectate.

Ce returnează

O geometrie (posibil goală).

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: Zona comună dintre Centru și Tătărași

SELECT ST_AsText(ST_Intersection(a.forma, b.forma)) AS zona_comuna,
       ST_Area(ST_Intersection(a.forma, b.forma)) AS arie
FROM cartiere a JOIN cartiere b ON a.nume = 'Centru' AND b.nume = 'Tătărași';

Rezultat

+--------------------------------+------+
| zona_comuna                    | arie |
+--------------------------------+------+
| POLYGON((3 4,3 1,4 1,4 4,3 4)) |    3 |
+--------------------------------+------+

Exemplul 2: Cât din fiecare traseu trece prin Centru

SELECT t.nume,
       ST_AsText(ST_Intersection(t.linie, c.forma)) AS portiune,
       ROUND(ST_Length(ST_Intersection(t.linie, c.forma)), 2) AS km_in_centru
FROM trasee t JOIN cartiere c ON c.nume = 'Centru'
WHERE t.id <= 2
ORDER BY t.id;

Rezultat

+------------+-----------------------------+--------------+
| nume       | portiune                    | km_in_centru |
+------------+-----------------------------+--------------+
| Autobuz 28 | LINESTRING(0 0,3 0,3 4,4 4) |            8 |
| Tramvai 3  | LINESTRING(1 4,1 2,4 2)     |            5 |
+------------+-----------------------------+--------------+

Exemplul 3: Punctul în care se încrucișează două linii

SELECT ST_AsText(ST_Intersection(
         ST_GeomFromText('LINESTRING(1 1,3 3)'),
         ST_GeomFromText('LINESTRING(1 3,3 1)'))) AS intersectie;

Rezultat

+-------------+
| intersectie |
+-------------+
| POINT(2 2)  |
+-------------+

Greșeli frecvente

  • Folosești ST_Intersection() doar ca să afli dacă două geometrii se ating. Calculul formei este scump; pentru un răspuns da/nu folosește ST_Intersects().

Comenzi înrudite

  • ST_Intersects(): Verifică dacă două geometrii au măcar un punct comun (inclusiv pe margine).
  • ST_Union(): Unește două geometrii într-una singură (reuniunea mulțimilor de puncte).
  • ST_Difference(): Returnează partea din prima geometrie care nu se află în a doua (diferența).