ST_Touches() în MySQL

Verifică dacă două geometrii se ating doar pe margine, fără ca interioarele lor să se suprapună.

Sintaxă
ST_Touches(g1, g2)

Ce face ST_Touches()

Două geometrii „se ating” dacă au puncte comune doar pe contur: două cartiere vecine cu o stradă comună, sau un traseu care începe exact pe marginea unei zone. Dacă interioarele se suprapun, rezultatul este 0.

Pentru două puncte (sau MULTIPOINT-uri) rezultatul este NULL, pentru că punctele nu au margine.

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

Exemplul 1: Relațiile dintre cartiere

SELECT a.nume, b.nume AS cu,
       ST_Touches(a.forma, b.forma) AS vecine,
       ST_Overlaps(a.forma, b.forma) AS suprapuse,
       ST_Disjoint(a.forma, b.forma) AS separate
FROM cartiere a JOIN cartiere b ON a.id < b.id
ORDER BY a.id, b.id;

Rezultat

+-------------+-------------+--------+-----------+----------+
| nume        | cu          | vecine | suprapuse | separate |
+-------------+-------------+--------+-----------+----------+
| Centru      | Copou       |      1 |         0 |        0 |
| Centru      | Tătărași    |      0 |         1 |        0 |
| Centru      | Galata      |      0 |         0 |        1 |
| Copou       | Tătărași    |      0 |         1 |        0 |
| Copou       | Galata      |      0 |         0 |        1 |
| Tătărași    | Galata      |      0 |         0 |        1 |
+-------------+-------------+--------+-----------+----------+

Greșeli frecvente

  • Folosești ST_Touches() pentru „la mai puțin de X km”. Funcția cere contact exact; pentru apropiere folosește ST_Distance().

Comenzi înrudite

  • ST_Overlaps(): Verifică dacă două geometrii de aceeași dimensiune se suprapun parțial (zona comună nu este niciuna dintre ele).
  • ST_Intersects(): Verifică dacă două geometrii au măcar un punct comun (inclusiv pe margine).
  • MBRTouches() și MBROverlaps(): Verifică dacă dreptunghiurile de încadrare se ating doar pe margine, respectiv dacă se suprapun parțial.