ST_GeomFromText() în MySQL

Creează o geometrie de orice tip din textul ei WKT („Well-Known Text”), opțional cu SRID.

Sintaxă
ST_GeomFromText(wkt [, srid [, optiuni]])

Ce face ST_GeomFromText()

WKT este formatul text standard pentru geometrii: POINT(1 2), LINESTRING(0 0,3 4), POLYGON((0 0,4 0,4 4,0 0)). ST_GeomFromText() citește un astfel de text și returnează geometria. ST_GeometryFromText() este sinonim.

Al doilea argument este SRID-ul (sistemul de coordonate). Fără el, SRID-ul este 0 (plan cartezian). Cu 4326 (WGS 84, sistemul GPS), coordonatele sunt grade, iar distanțele și ariile se calculează pe glob, în metri. Atenție la ordinea coordonatelor: pentru SRID 4326, textul WKT se scrie POINT(latitudine longitudine) (ordinea din definiția sistemului EPSG), iar GeoJSON și funcțiile ca Point(x, y) folosesc longitudine, latitudine.

Al treilea argument poate schimba ordinea: 'axis-order=long-lat' înseamnă că textul are longitudinea pe primul loc. Un text WKT greșit produce eroare, iar o latitudine în afara intervalului [-90, 90] produce eroare de tip „out of range”.

Parametri

Parametru Descriere
wkt Textul geometriei, de exemplu 'POINT(47.1585 27.6014)'.
srid Opțional: sistemul de coordonate (0 implicit, 4326 pentru GPS).
optiuni Opțional: 'axis-order=lat-long', 'axis-order=long-lat' sau 'axis-order=srid-defined'.

Ce returnează

Geometria corespunzătoare textului; NULL dacă textul sau SRID-ul este NULL.

Exemple

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

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: Geometrii de tipuri diferite

SELECT ST_GeometryType(ST_GeomFromText('POINT(1 2)')) AS t1,
       ST_GeometryType(ST_GeomFromText('LINESTRING(0 0,3 4)')) AS t2,
       ST_GeometryType(ST_GeometryFromText('POLYGON((0 0,4 0,4 4,0 0))')) AS t3,
       ST_Length(ST_GeomFromText('LINESTRING(0 0,3 4)')) AS lungime;

Rezultat

+-------+------------+---------+---------+
| t1    | t2         | t3      | lungime |
+-------+------------+---------+---------+
| POINT | LINESTRING | POLYGON |       5 |
+-------+------------+---------+---------+

Exemplul 2: Orașe cu SRID 4326 și distanța reală dintre ele

SELECT a.nume AS de_la, b.nume AS pana_la,
       ROUND(ST_Distance(a.loc, b.loc) / 1000) AS km
FROM orase a JOIN orase b ON a.id = 1 AND b.id > 1
ORDER BY km;

Rezultat

+-------+-------------+------+
| de_la | pana_la     | km   |
+-------+-------------+------+
| Iași  | Cluj-Napoca |  306 |
| Iași  | București   |  325 |
| Iași  | Constanța   |  343 |
| Iași  | Timișoara   |  515 |
+-------+-------------+------+

Exemplul 3: Ordinea axelor: lat-long implicit, long-lat cu opțiune

SET @iasi1 = ST_GeomFromText('POINT(47.1585 27.6014)', 4326);
SET @iasi2 = ST_GeomFromText('POINT(27.6014 47.1585)', 4326, 'axis-order=long-lat');

SELECT ST_Latitude(@iasi1) AS lat1, ST_Latitude(@iasi2) AS lat2,
       ST_Equals(@iasi1, @iasi2) AS acelasi_punct;

Rezultat

+---------+---------+---------------+
| lat1    | lat2    | acelasi_punct |
+---------+---------+---------------+
| 47.1585 | 47.1585 |             1 |
+---------+---------+---------------+

Greșeli frecvente

  • Scrii coordonatele GPS ca în Google Maps, dar inversate: POINT(27.6014 47.1585) cu SRID 4326. MySQL citește 27.6 ca latitudine, deci punctul ajunge în Arabia Saudită. Fie scrii POINT(47.1585 27.6014), fie adaugi 'axis-order=long-lat'.
  • Salvezi puncte GPS fără SRID (adică cu SRID 0). Distanțele ies în „grade”, nu în metri; folosește SRID 4326.

Comenzi înrudite

  • ST_AsText(): Transformă o geometrie în text WKT, ușor de citit: POINT(1 2), LINESTRING(…), POLYGON(…).
  • ST_PointFromText(), ST_LineFromText(), ST_PolyFromText(): Creează un punct, o linie sau un poligon din text WKT și verifică totodată că textul are tipul cerut.
  • ST_SRID(): Returnează sistemul de coordonate (SRID) al unei geometrii sau, cu al doilea argument, îl schimbă fără a muta coordonatele.
  • ST_Distance(): Returnează distanța minimă dintre două geometrii; pentru SRID 4326, în metri, calculată pe elipsoidul Pământului.