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ă).