Ce face ST_LineInterpolatePoint() și ST_LineInterpolatePoints()
ST_LineInterpolatePoint(linie, 0.5) răspunde la întrebarea „unde este jumătatea traseului?”. Fracțiunea este între 0.0 (începutul) și 1.0 (sfârșitul), măsurată după lungimea liniei, nu după numărul de puncte.
ST_LineInterpolatePoints(linie, 0.25) returnează un MULTIPOINT cu punctele de la 25%, 50%, 75% și 100% din lungime. Ambele funcții (din MySQL 8.0.24) acceptă doar LINESTRING și lucrează și pe SRID geografic. O fracțiune în afara intervalului [0, 1] produce eroare.
Parametri
| Parametru | Descriere |
|---|---|
linie |
Un LINESTRING. |
fractiune |
Un număr între 0 și 1. |
Ce returnează
Un POINT, respectiv un MULTIPOINT.
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: Punctele de pe traseul autobuzului
SELECT ST_Length(linie) AS km,
ST_AsText(ST_LineInterpolatePoint(linie, 0.5)) AS la_jumatate,
ST_AsText(ST_LineInterpolatePoints(linie, 0.25)) AS din_sfert_in_sfert
FROM trasee
WHERE id = 1;
Rezultat
+------+-------------+-----------------------------------------+
| km | la_jumatate | din_sfert_in_sfert |
+------+-------------+-----------------------------------------+
| 10 | POINT(3 2) | MULTIPOINT((2.5 0),(3 2),(3.5 4),(6 4)) |
+------+-------------+-----------------------------------------+
Exemplul 2: Jumătatea drumului Iași – Cluj-Napoca pe glob
SET @drum = ST_GeomFromText('LINESTRING(47.1585 27.6014, 46.7712 23.6236)', 4326);
SELECT ST_AsText(ST_LineInterpolatePoint(@drum, 0.5)) AS mijloc,
ROUND(ST_Distance(ST_StartPoint(@drum), ST_LineInterpolatePoint(@drum, 0.5)) / 1000, 1) AS km_de_la_iasi;
Rezultat
+---------------------------------------------+---------------+
| mijloc | km_de_la_iasi |
+---------------------------------------------+---------------+
| POINT(46.98212861171739 25.605323430191547) | 152.9 |
+---------------------------------------------+---------------+
Greșeli frecvente
- Dai fracțiunea în procente:
ST_LineInterpolatePoint(linie, 50). Primești eroare; scrie 0.5.
Comenzi înrudite
ST_PointAtDistance(): Returnează punctul aflat la o distanță dată de la începutul unei linii (de exemplu la kilometrul 100 al unui drum).ST_Length(): Returnează lungimea unei linii (sau suma lungimilor dintr-un MULTILINESTRING); pe SRID 4326, în metri.ST_PointN() și ST_NumPoints(): ST_PointN() returnează al n-lea punct al unei linii, iar ST_NumPoints() numărul de puncte.