Цей запит повинен зробити фокус:
WITH line AS
(SELECT
your_polylinestring_id,
(ST_Dump(geom)).geom AS geom
FROM your_polylinestring_table),
linemeasure AS
(SELECT
ST_AddMeasure(line.geom, 0, ST_Length(line.geom)) AS linem,
generate_series(0, ST_Length(line.geom)::int, 10) AS i
FROM line),
geometries AS (
SELECT
i,
(ST_Dump(ST_GeometryN(ST_LocateAlong(linem, i), 1))).geom AS geom
FROM linemeasure)
SELECT
i,
ST_SetSRID(ST_MakePoint(ST_X(geom), ST_Y(geom)), 31468) AS geom
FROM geometries
Спочатку ви вибираєте окремі рядки з стовпця полілінійних рядків ST_Dump
Потім потрібно визначити елементи вимірювання з ST_AddMeasure
, починаючи з 0 (початок рядкової рядки) і кінця рядкової рядки (те саме, що і довжина рядкової лінії). Generate_series
створює ряд над цим вимірюванням на кроці 10. Тут ви можете визначити "n metres"
(у цьому прикладі 10 метрів). i
Значення починається заново для кожного LineString.
За допомогою ST_LocateAlong
і ST_GeometryN
ви створюєте багатовимірну геометрію точок.
Нарешті, ви повинні дістати значення X та Y цієї геометрії та створити з неї крапку.
Результат може виглядати приблизно так:
EDIT
Справедливості я хочу додати цю інформацію: Ідея та запит у цій відповіді витягнуті з запиту, який я використовую для створення ліній драпірування з DEM в PostGIS. Відмінна реалізація цього пояснюється в цій статті Матьє Леплатре.