MBRContains() și MBRWithin() în MySQL

Verifică dacă dreptunghiul de încadrare al unei geometrii îl conține pe al celeilalte; un test rapid, aproximativ.

Sintaxă
MBRContains(g1, g2)
MBRWithin(g1, g2)

Ce face MBRContains() și MBRWithin()

Funcțiile MBR nu folosesc forma exactă, ci dreptunghiul minim de încadrare (MBR) al fiecărei geometrii, adică rezultatul lui ST_Envelope(). Testul este foarte rapid și se potrivește cu felul în care lucrează indexul spațial, așa că se folosește ca filtru grosier: „toate punctele din acest dreptunghi”.

MBRContains(g1, g2) este 1 dacă dreptunghiul lui g1 conține dreptunghiul lui g2; MBRWithin(g1, g2) testează relația inversă. Ca la ST_Contains(), un punct aflat pe marginea dreptunghiului nu este conținut.

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 orase (
  id INT PRIMARY KEY,
  nume VARCHAR(20),
  loc POINT NOT NULL SRID 4326,
  SPATIAL INDEX (loc)
);

INSERT INTO orase VALUES
  (1, 'Iași',        ST_GeomFromText('POINT(47.1585 27.6014)', 4326)),
  (2, 'Cluj-Napoca', ST_GeomFromText('POINT(46.7712 23.6236)', 4326)),
  (3, 'București',   ST_GeomFromText('POINT(44.4268 26.1025)', 4326)),
  (4, 'Timișoara',   ST_GeomFromText('POINT(45.7489 21.2087)', 4326)),
  (5, 'Constanța',   ST_GeomFromText('POINT(44.1598 28.6348)', 4326));

Exemplul 1: Orașe dintr-un dreptunghi (folosește indexul spațial)

SET @zona = ST_GeomFromText('POLYGON((44 23,47.5 23,47.5 29,44 29,44 23))', 4326);

SELECT nume FROM orase WHERE MBRContains(@zona, loc) ORDER BY id;
SELECT nume FROM orase WHERE MBRWithin(loc, @zona) ORDER BY id;

Rezultat

+-------------+
| nume        |
+-------------+
| Iași        |
| Cluj-Napoca |
| București   |
| Constanța   |
+-------------+
+-------------+
| nume        |
+-------------+
| Iași        |
| Cluj-Napoca |
| București   |
| Constanța   |
+-------------+

Exemplul 2: Forma exactă comparată cu dreptunghiul

SET @triunghi = ST_GeomFromText('POLYGON((0 0,4 0,0 4,0 0))');

SELECT ST_Contains(@triunghi, Point(3, 3)) AS forma_exacta,
       MBRContains(@triunghi, Point(3, 3)) AS dreptunghi,
       MBRWithin(Point(3, 3), @triunghi) AS within_dreptunghi;

Rezultat

+--------------+------------+-------------------+
| forma_exacta | dreptunghi | within_dreptunghi |
+--------------+------------+-------------------+
|            0 |          1 |                 1 |
+--------------+------------+-------------------+

Greșeli frecvente

  • Folosești doar MBRContains() pe forme neregulate. Poate include puncte din afara formei (colțurile dreptunghiului); filtrează apoi cu ST_Contains().

Comenzi înrudite

  • ST_Contains(): Verifică dacă prima geometrie o conține complet pe a doua (de exemplu un punct în interiorul unui poligon).
  • ST_Within(): Verifică dacă prima geometrie se află complet în interiorul celei de-a doua (de exemplu un punct într-o zonă).
  • MBRCovers() și MBRCoveredBy(): Ca MBRContains() și MBRWithin(), dar includ și marginea dreptunghiului: un punct de pe contur este „acoperit”.
  • ST_Envelope(): Returnează dreptunghiul minim de încadrare (MBR) al unei geometrii, ca poligon.