Этот запрос должен сделать трюк:
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 этой геометрии и создать точку из нее.
Результат может выглядеть так:
РЕДАКТИРОВАТЬ
Чтобы быть справедливым, я хочу добавить эту информацию: идея и запрос в этом ответе извлечены из запроса, который я использую для создания линий драпировки из матрицы высот в PostGIS. Отличная реализация этого объясняется в этой статье от Матье Леплатре.