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știNULL.
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.