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 scriiPOINT(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.