ST_Buffer() în MySQL

Operații spațiale MySQL 5.6+

Returnează zona formată din toate punctele aflate la cel mult o distanță dată de o geometrie (o „zonă tampon”).

Sintaxă
ST_Buffer(geometrie, distanta [, strategie1 [, strategie2 [, strategie3]]])

Ce face ST_Buffer()

ST_Buffer() desenează o zonă în jurul unei geometrii: un cerc în jurul unui punct, o „bandă” de-a lungul unei linii, un poligon mărit. Exemple: zona de livrare de 2 km din jurul unui magazin, culoarul de 100 m de-a lungul unui drum.

Cercul este aproximat printr-un poligon (implicit cu 32 de puncte pe cerc), deci aria este puțin mai mică decât πr². Pentru poligoane, distanța poate fi negativă (micșorare). Pentru SRID 4326 (din MySQL 8.0.26) sunt acceptate doar puncte, distanța este în metri și nu se pot da strategii. Strategiile, create cu ST_Buffer_Strategy(), schimbă forma (pătrat în loc de cerc, capete drepte etc.).

Parametri

Parametru Descriere
geometrie Geometria din jurul căreia se construiește zona.
distanta Raza zonei, în unitățile SRID-ului (metri pentru 4326).
strategie1-3 Opțional: rezultate ale lui ST_Buffer_Strategy().

Ce returnează

Un poligon (sau o colecție de poligoane).

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

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: Zona de livrare: un pătrat și un cerc

SELECT ST_AsText(ST_Buffer(Point(1, 1), 2, ST_Buffer_Strategy('point_square'))) AS patrat,
       ROUND(ST_Area(ST_Buffer(Point(1, 1), 2)), 3) AS arie_cerc,
       ROUND(PI() * 2 * 2, 3) AS pi_r_patrat;

Rezultat

+--------------------------------------+-----------+-------------+
| patrat                               | arie_cerc | pi_r_patrat |
+--------------------------------------+-----------+-------------+
| POLYGON((-1 -1,3 -1,3 3,-1 3,-1 -1)) |    12.486 |      12.566 |
+--------------------------------------+-----------+-------------+

Exemplul 2: Magazine aflate în zona de 4 km a Librăriei Ana

SELECT b.nume
FROM magazine a JOIN magazine b ON a.nume = 'Librăria Ana' AND b.id <> a.id
WHERE ST_Within(b.loc, ST_Buffer(a.loc, 4))
ORDER BY b.id;

Rezultat

+----------------+
| nume           |
+----------------+
| Cafeneaua Mara |
+----------------+

Exemplul 3: Cerc de 50 km în jurul Iașiului (SRID 4326)

SET @zona = ST_Buffer(ST_GeomFromText('POINT(47.1585 27.6014)', 4326), 50000);

SELECT ST_GeometryType(@zona) AS tip,
       ROUND(ST_Area(@zona) / 1000000) AS km2,
       ST_Within(ST_GeomFromText('POINT(47.0 27.2)', 4326), @zona) AS punct_inclus;

Rezultat

+---------+------+--------------+
| tip     | km2  | punct_inclus |
+---------+------+--------------+
| POLYGON | 7804 |            1 |
+---------+------+--------------+

Greșeli frecvente

  • Dai distanța în kilometri pentru SRID 4326. Unitatea este metrul: pentru 50 km scrie 50000.

Comenzi înrudite

  • ST_Buffer_Strategy(): Creează o „strategie” pentru ST_Buffer(): forma colțurilor, a capetelor de linie sau a zonei din jurul punctelor.
  • ST_Distance(): Returnează distanța minimă dintre două geometrii; pentru SRID 4326, în metri, calculată pe elipsoidul Pământului.
  • ST_Within(): Verifică dacă prima geometrie se află complet în interiorul celei de-a doua (de exemplu un punct într-o zonă).