ST_IsValid() în MySQL

Verifică dacă o geometrie este validă după regulile OGC (de exemplu un poligon care nu se autointersectează).

Sintaxă
ST_IsValid(geometrie)

Ce face ST_IsValid()

O geometrie poate fi scrisă corect (MySQL o acceptă), dar să nu aibă sens geometric: un poligon în formă de „fundiță”, cu laturile încrucișate, sau o linie cu toate punctele identice. ST_IsValid() returnează 1 pentru geometriile valide și 0 pentru cele invalide.

Funcțiile de calcul (arie, intersecție, relații) dau rezultate nedefinite pe geometrii invalide, deci merită verificat înainte. Colecția goală este considerată validă. Pentru SRID geografic, coordonatele trebuie să fie în interval.

Parametri

Parametru Descriere
geometrie Valoarea spațială.

Ce returnează

1 sau 0.

Exemple

Exemplul 1: Poligon corect și poligon „fundiță”

SELECT ST_IsValid(ST_GeomFromText('POLYGON((0 0,4 0,4 4,0 4,0 0))')) AS patrat,
       ST_IsValid(ST_GeomFromText('POLYGON((0 0,4 4,4 0,0 4,0 0))')) AS fundita,
       ST_IsValid(ST_GeomFromText('LINESTRING(0 0,0 0)')) AS linie_punct;

Rezultat

+--------+---------+-------------+
| patrat | fundita | linie_punct |
+--------+---------+-------------+
|      1 |       0 |           0 |
+--------+---------+-------------+

Exemplul 2: Găsirea zonelor invalide dintr-un tabel

CREATE TABLE zone_livrare (nume VARCHAR(20), forma POLYGON);
INSERT INTO zone_livrare VALUES
  ('Nord', ST_GeomFromText('POLYGON((0 0,4 0,4 4,0 4,0 0))')),
  ('Sud', ST_GeomFromText('POLYGON((0 0,4 4,4 0,0 4,0 0))'));

SELECT nume FROM zone_livrare WHERE NOT ST_IsValid(forma);

Rezultat

+------+
| nume |
+------+
| Sud  |
+------+

Greșeli frecvente

  • Calculezi aria unui poligon invalid fără verificare. Rezultatul poate fi orice număr; filtrează mai întâi cu ST_IsValid().

Comenzi înrudite

  • ST_Validate(): Returnează geometria dacă este validă și NULL dacă este invalidă; util pentru a filtra datele greșite.
  • ST_IsSimple(): Verifică dacă o geometrie este „simplă”: de exemplu o linie care nu se intersectează cu ea însăși.
  • ST_Area(): Returnează aria unui poligon sau a unui MULTIPOLYGON; pentru SRID 4326, în metri pătrați.