ST_Transform() în MySQL

Transformă coordonatele unei geometrii dintr-un sistem de coordonate în altul (de exemplu din GPS în Stereo 70).

Sintaxă
ST_Transform(geometrie, srid_tinta)

Ce face ST_Transform()

Spre deosebire de ST_SRID(), ST_Transform() recalculează coordonatele. De exemplu, din WGS 84 (SRID 4326, grade) în Stereo 70 (SRID 3844, sistemul oficial de proiecție din România, în metri) sau în Web Mercator (SRID 3857, folosit de hărțile web).

Funcția a apărut în MySQL 8.0.13 doar pentru sisteme geografice; din 8.0.32 suportă aproape toate sistemele EPSG. Dacă sistemul de pornire sau cel țintă nu poate fi folosit, primești o eroare.

Parametri

Parametru Descriere
geometrie Valoarea spațială de transformat.
srid_tinta SRID-ul sistemului în care vrei coordonatele.

Ce returnează

Geometria de același tip, cu coordonatele transformate și noul SRID.

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: Iași în trei sisteme de coordonate

SET @iasi = ST_GeomFromText('POINT(47.1585 27.6014)', 4326);

SELECT ST_AsText(@iasi) AS wgs84,
       ST_AsText(ST_Transform(@iasi, 3844)) AS stereo70,
       ST_AsText(ST_Transform(@iasi, 3857)) AS web_mercator;

Rezultat

+------------------------+-------------------------------------------+--------------------------------------------+
| wgs84                  | stereo70                                  | web_mercator                               |
+------------------------+-------------------------------------------+--------------------------------------------+
| POINT(47.1585 27.6014) | POINT(697339.5854853657 632037.618904249) | POINT(3072573.793181458 5967983.789878253) |
+------------------------+-------------------------------------------+--------------------------------------------+

Exemplul 2: Distanța în plan Stereo 70, comparată cu cea pe elipsoid

SELECT ROUND(ST_Distance(a.loc, b.loc)) AS m_wgs84,
       ROUND(ST_Distance(ST_Transform(a.loc, 3844), ST_Transform(b.loc, 3844))) AS m_stereo70
FROM orase a JOIN orase b ON a.id = 1 AND b.id = 2;

Rezultat

+---------+------------+
| m_wgs84 | m_stereo70 |
+---------+------------+
|  305745 |     305712 |
+---------+------------+

Greșeli frecvente

  • Transformi în Web Mercator (3857) ca să măsori distanțe. Proiecția deformează mult distanțele la latitudinea României; pentru distanțe reale folosește SRID 4326 cu ST_Distance().

Comenzi înrudite

  • 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.
  • ST_GeomFromText(): Creează o geometrie de orice tip din textul ei WKT („Well-Known Text”), opțional cu SRID.