MBRCovers() și MBRCoveredBy() în MySQL

Ca MBRContains() și MBRWithin(), dar includ și marginea dreptunghiului: un punct de pe contur este „acoperit”.

Sintaxă
MBRCovers(g1, g2)
MBRCoveredBy(g1, g2)

Ce face MBRCovers() și MBRCoveredBy()

Diferența dintre „conține” și „acoperă” este marginea. MBRContains() cere ca punctele să fie strict în interior, pe când MBRCovers() acceptă și punctele de pe contur. MBRCoveredBy(g1, g2) este relația inversă: dreptunghiul lui g1 este acoperit de dreptunghiul lui g2.

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

CREATE TABLE magazine (
  id INT PRIMARY KEY,
  nume VARCHAR(20),
  loc POINT NOT NULL
);

INSERT INTO magazine VALUES
  (1, 'Librăria Ana',   Point(1, 1)),
  (2, 'Florăria Dan',   Point(2, 6)),
  (3, 'Brutăria Ioana', Point(5, 3)),
  (4, 'Cafeneaua Mara', Point(4, 2)),
  (5, 'Atelierul Radu', Point(12, 1));

Exemplul 1: Punct pe margine: conținut sau acoperit

SELECT m.nume,
       MBRContains(c.forma, m.loc) AS contine,
       MBRCovers(c.forma, m.loc) AS acopera,
       MBRCoveredBy(m.loc, c.forma) AS acoperit_de
FROM magazine m JOIN cartiere c ON c.nume = 'Centru'
WHERE m.id IN (1, 4, 5)
ORDER BY m.id;

Rezultat

+----------------+---------+---------+-------------+
| nume           | contine | acopera | acoperit_de |
+----------------+---------+---------+-------------+
| Librăria Ana   |       1 |       1 |           1 |
| Cafeneaua Mara |       0 |       1 |           1 |
| Atelierul Radu |       0 |       0 |           0 |
+----------------+---------+---------+-------------+

Greșeli frecvente

  • Inversezi argumentele la MBRCoveredBy(). Primul argument este geometria mică, al doilea zona: MBRCoveredBy(punct, zona).

Comenzi înrudite

  • MBRContains() și MBRWithin(): Verifică dacă dreptunghiul de încadrare al unei geometrii îl conține pe al celeilalte; un test rapid, aproximativ.
  • ST_Contains(): Verifică dacă prima geometrie o conține complet pe a doua (de exemplu un punct în interiorul unui poligon).
  • ST_Intersects(): Verifică dacă două geometrii au măcar un punct comun (inclusiv pe margine).