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șteST_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).