ST_PointN() și ST_NumPoints() în MySQL

ST_PointN() returnează al n-lea punct al unei linii, iar ST_NumPoints() numărul de puncte.

Sintaxă
ST_PointN(linie, n)
ST_NumPoints(linie)

Ce face ST_PointN() și ST_NumPoints()

Punctele unei linii sunt numerotate de la 1. ST_NumPoints() spune câte sunt, iar ST_PointN() extrage unul anume. Pentru un n mai mare decât numărul de puncte, rezultatul este NULL.

Împreună, cele două funcții permit parcurgerea tuturor punctelor unui traseu, de exemplu cu un tabel de numere sau cu o interogare recursivă.

Parametri

Parametru Descriere
linie Un LINESTRING.
n Poziția punctului, de la 1.

Ce returnează

ST_PointN(): un POINT sau NULL; ST_NumPoints(): un număr întreg.

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: Numărul de puncte și al doilea punct

SELECT nume, ST_NumPoints(linie) AS puncte, ST_AsText(ST_PointN(linie, 2)) AS al_doilea
FROM trasee
ORDER BY id;

Rezultat

+------------------+--------+------------+
| nume             | puncte | al_doilea  |
+------------------+--------+------------+
| Autobuz 28       |      4 | POINT(3 0) |
| Tramvai 3        |      3 | POINT(1 2) |
| Pistă biciclete  |      4 | POINT(2 2) |
+------------------+--------+------------+

Exemplul 2: Toate punctele unui traseu, rând cu rând

WITH RECURSIVE nr (n) AS (SELECT 1 UNION ALL SELECT n + 1 FROM nr WHERE n < 10)
SELECT n, ST_AsText(ST_PointN(t.linie, n)) AS punct
FROM trasee t JOIN nr ON n <= ST_NumPoints(t.linie)
WHERE t.id = 1
ORDER BY n;

Rezultat

+------+------------+
| n    | punct      |
+------+------------+
|    1 | POINT(0 0) |
|    2 | POINT(3 0) |
|    3 | POINT(3 4) |
|    4 | POINT(6 4) |
+------+------------+

Greșeli frecvente

  • Numerotezi punctele de la 0. Primul punct este ST_PointN(linie, 1); cu 0 primești NULL.

Comenzi înrudite

  • ST_StartPoint() și ST_EndPoint(): Returnează primul, respectiv ultimul punct al unei linii (LINESTRING).
  • LineString(): Construiește o linie frântă (LINESTRING) din două sau mai multe puncte.
  • ST_Length(): Returnează lungimea unei linii (sau suma lungimilor dintr-un MULTILINESTRING); pe SRID 4326, în metri.