MBRTouches() și MBROverlaps() în MySQL

Verifică dacă dreptunghiurile de încadrare se ating doar pe margine, respectiv dacă se suprapun parțial.

Sintaxă
MBRTouches(g1, g2)
MBROverlaps(g1, g2)

Ce face MBRTouches() și MBROverlaps()

MBRTouches() returnează 1 dacă dreptunghiurile au în comun doar puncte de pe contur. MBROverlaps() returnează 1 dacă dreptunghiurile se suprapun parțial: au o zonă comună, dar niciunul nu îl conține pe celălalt. Sunt variantele aproximative ale lui ST_Touches() și ST_Overlaps().

Parametri

Parametru Descriere
g1, g2 Geometriile ale căror dreptunghiuri se compară.

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 dreptunghiurilor cartierelor

SELECT a.nume, b.nume AS cu,
       MBRTouches(a.forma, b.forma) AS se_ating,
       MBROverlaps(a.forma, b.forma) AS se_suprapun
FROM cartiere a JOIN cartiere b ON a.id < b.id
WHERE a.id = 1
ORDER BY b.id;

Rezultat

+--------+-------------+----------+-------------+
| nume   | cu          | se_ating | se_suprapun |
+--------+-------------+----------+-------------+
| Centru | Copou       |        1 |           0 |
| Centru | Tătărași    |        0 |           1 |
| Centru | Galata      |        0 |           0 |
+--------+-------------+----------+-------------+

Greșeli frecvente

  • Folosești funcțiile MBR pe forme rotite sau neregulate și tragi concluzii exacte. Dreptunghiurile pot să se suprapună chiar dacă formele doar se ating; confirmă cu funcțiile ST_.

Comenzi înrudite

  • ST_Touches(): Verifică dacă două geometrii se ating doar pe margine, fără ca interioarele lor să se suprapună.
  • ST_Overlaps(): Verifică dacă două geometrii de aceeași dimensiune se suprapun parțial (zona comună nu este niciuna dintre ele).
  • MBRIntersects() și MBRDisjoint(): Verifică dacă dreptunghiurile de încadrare a două geometrii se intersectează, respectiv dacă sunt separate.