ST_PointAtDistance() în MySQL

Operații spațiale MySQL 8.0+

Returnează punctul aflat la o distanță dată de la începutul unei linii (de exemplu la kilometrul 100 al unui drum).

Sintaxă
ST_PointAtDistance(linie, distanta)

Ce face ST_PointAtDistance()

Funcția (din MySQL 8.0.24) seamănă cu ST_LineInterpolatePoint(), dar primește distanța absolută, nu o fracțiune. Distanța este în unitatea SRID-ului: unitățile coordonatelor pentru SRID 0, metri pentru 4326.

Distanța trebuie să fie între 0 și ST_Length(linie); altfel primești eroare. Acceptă doar LINESTRING.

Parametri

Parametru Descriere
linie Un LINESTRING.
distanta Distanța de la începutul liniei.

Ce returnează

Un POINT.

Exemple

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

CREATE TABLE trasee (
  id INT PRIMARY KEY,
  nume VARCHAR(20),
  linie LINESTRING NOT NULL
);

INSERT INTO trasee VALUES
  (1, 'Autobuz 28',  ST_GeomFromText('LINESTRING(0 0,3 0,3 4,6 4)')),
  (2, 'Tramvai 3',   ST_GeomFromText('LINESTRING(1 6,1 2,5 2)')),
  (3, 'Pistă biciclete', ST_GeomFromText('LINESTRING(0 0,2 2,0 4,0 0)'));

Exemplul 1: Stație la fiecare 2 km pe traseul autobuzului

SELECT ST_AsText(ST_PointAtDistance(linie, 2)) AS km_2,
       ST_AsText(ST_PointAtDistance(linie, 4)) AS km_4,
       ST_AsText(ST_PointAtDistance(linie, 6)) AS km_6
FROM trasee
WHERE id = 1;

Rezultat

+------------+------------+------------+
| km_2       | km_4       | km_6       |
+------------+------------+------------+
| POINT(2 0) | POINT(3 1) | POINT(3 3) |
+------------+------------+------------+

Exemplul 2: Punctul de la 100 km de Iași, spre Cluj-Napoca

SET @drum = ST_GeomFromText('LINESTRING(47.1585 27.6014, 46.7712 23.6236)', 4326);

SELECT ST_AsText(ST_PointAtDistance(@drum, 100000)) AS km_100,
       ROUND(ST_Length(@drum) / 1000) AS km_total;

Rezultat

+---------------------------------------------+----------+
| km_100                                      | km_total |
+---------------------------------------------+----------+
| POINT(47.04706189648392 26.294183495766415) |      306 |
+---------------------------------------------+----------+

Greșeli frecvente

  • Dai o distanță mai mare decât lungimea liniei. Primești eroare; limitează valoarea cu LEAST(d, ST_Length(linie)).

Comenzi înrudite