ST_Within() în MySQL

Verifică dacă prima geometrie se află complet în interiorul celei de-a doua (de exemplu un punct într-o zonă).

Sintaxă
ST_Within(g1, g2)

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