ST_LineInterpolatePoint() și ST_LineInterpolatePoints() în MySQL

Operații spațiale MySQL 8.0+

Returnează punctul aflat la o fracțiune din lungimea unei linii (de exemplu la jumătatea drumului) sau punctele la intervale egale.

Sintaxă
ST_LineInterpolatePoint(linie, fractiune)
ST_LineInterpolatePoints(linie, fractiune)

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.