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 cuST_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.