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
ST_LineInterpolatePoint() și ST_LineInterpolatePoints(): Returnează punctul aflat la o fracțiune din lungimea unei linii (de exemplu la jumătatea drumului) sau punctele la intervale egale.ST_Length(): Returnează lungimea unei linii (sau suma lungimilor dintr-un MULTILINESTRING); pe SRID 4326, în metri.ST_StartPoint() și ST_EndPoint(): Returnează primul, respectiv ultimul punct al unei linii (LINESTRING).