ST_Difference() în MySQL

Operații spațiale MySQL 5.6+

Returnează partea din prima geometrie care nu se află în a doua (diferența).

Sintaxă
ST_Difference(g1, g2)

Ce face ST_Difference()

ST_Difference(g1, g2) „decupează” din g1 tot ce se suprapune cu g2. Ordinea contează: ST_Difference(a, b) nu este același lucru cu ST_Difference(b, a).

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

Parametri

Parametru Descriere
g1 Geometria din care se decupează.
g2 Geometria decupată.

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))'));

Exemplul 1: Partea din Centru care nu este în Tătărași

SELECT ST_AsText(ST_Difference(a.forma, b.forma)) AS centru_ramas,
       ST_Area(ST_Difference(a.forma, b.forma)) AS arie_ramasa,
       ST_Area(ST_Difference(b.forma, a.forma)) AS arie_invers
FROM cartiere a JOIN cartiere b ON a.nume = 'Centru' AND b.nume = 'Tătărași';

Rezultat

+----------------------------------------+-------------+-------------+
| centru_ramas                           | arie_ramasa | arie_invers |
+----------------------------------------+-------------+-------------+
| POLYGON((3 4,0 4,0 0,4 0,4 1,3 1,3 4)) |          13 |          13 |
+----------------------------------------+-------------+-------------+

Exemplul 2: Punct care nu este acoperit

SELECT ST_AsText(ST_Difference(Point(1, 1), Point(2, 2))) AS ramane,
       ST_AsText(ST_Difference(Point(1, 1), Point(1, 1))) AS dispare;

Rezultat

+------------+--------------------------+
| ramane     | dispare                  |
+------------+--------------------------+
| POINT(1 1) | GEOMETRYCOLLECTION EMPTY |
+------------+--------------------------+

Greșeli frecvente

  • Inversezi argumentele. Primul argument este geometria din care tai, al doilea este „foarfeca”.

Comenzi înrudite

  • ST_SymDifference(): Returnează punctele care sunt într-una dintre geometrii, dar nu în amândouă (diferența simetrică).
  • ST_Intersection(): Returnează partea comună a două geometrii (intersecția lor).
  • ST_Union(): Unește două geometrii într-una singură (reuniunea mulțimilor de puncte).