Esta consulta debería hacer el truco:
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
Al principio, selecciona las distintas cadenas lineales de su columna de polilínea con ST_Dump
Luego debe definir los elementos de medida con ST_AddMeasure
, comenzando con 0 (comienzo de la cadena de líneas) y el final de la cadena de líneas (igual que la longitud de la cadena de líneas). Generate_series
crea una serie sobre esta medida en el paso de 10. Aquí puede definir "n metres"
(en este ejemplo, 10 metros). El i
valor comienza de nuevo para cada cadena lineal.
Con ST_LocateAlong
y ST_GeometryN
crea una geometría de punto multidimensional.
Finalmente, debe extraer los valores X e Y de esta geometría y crear un punto a partir de ella.
El resultado podría verse así:
EDITAR
Para ser justos, quiero agregar esta información: la idea y la consulta en esta respuesta se extraen de una consulta que estoy usando para crear líneas de cortina desde DEM en PostGIS. La excelente implementación de esto se explica en este artículo de Mathieu Leplatre.