Ce face ST_Within()
ST_Within(g1, g2) este inversul lui ST_Contains(): răspunde la întrebarea „este g1 în g2?”. Cel mai des se folosește pentru „punct în poligon”: este clientul în zona de livrare?
Ca și la ST_Contains(), un punct aflat exact pe marginea zonei nu este considerat „în interior”.
Parametri
| Parametru | Descriere |
|---|---|
g1 |
Geometria verificată. |
g2 |
Zona în care ar trebui să se afle. |
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));
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: Magazine aflate în cartierul Tătărași
SELECT m.nume
FROM magazine m, cartiere c
WHERE c.nume = 'Tătărași' AND ST_Within(m.loc, c.forma)
ORDER BY m.id;
Rezultat
+-----------------+
| nume |
+-----------------+
| Brutăria Ioana |
| Cafeneaua Mara |
+-----------------+
Exemplul 2: Orașe în zona Moldovei (SRID 4326)
SET @moldova = ST_GeomFromText('POLYGON((45.5 26,48.3 26,48.3 28.3,45.5 28.3,45.5 26))', 4326);
SELECT nume, ST_Within(loc, @moldova) AS in_moldova
FROM orase
ORDER BY id;
Rezultat
+-------------+------------+
| nume | in_moldova |
+-------------+------------+
| Iași | 1 |
| Cluj-Napoca | 0 |
| București | 0 |
| Timișoara | 0 |
| Constanța | 0 |
+-------------+------------+
Greșeli frecvente
- Inversezi argumentele:
ST_Within(zona, punct). Rezultatul este 0, pentru că zona nu este în punct; ordinea corectă esteST_Within(punct, zona).
Comenzi înrudite
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).