Esta consulta deve fazer o truque:
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
Inicialmente, você seleciona as cadeias de linhas distintas da coluna cadeia de polilinhas com ST_Dump
É necessário definir os elementos de medida com ST_AddMeasure
, começando com 0 (início da cadeia de linhas) e o final da cadeia de linhas (o mesmo que o comprimento da cadeia de linhas). Generate_series
cria uma série sobre essa medição na etapa 10. Aqui você pode definir "n metres"
(neste exemplo, 10 metros). O i
valor começa de novo para cada cadeia de linhas.
Com ST_LocateAlong
e ST_GeometryN
você cria uma geometria de ponto multidimensional.
Finalmente, você precisa extrair os valores X e Y dessa geometria e criar um ponto a partir dela.
O resultado pode ser assim:
EDITAR
Para ser justo, quero adicionar essas informações: A idéia e a consulta nesta resposta são extraídas de uma consulta que estou usando para criar linhas de cortina de DEMs no PostGIS. A excelente implementação disso é explicada neste artigo por Mathieu Leplatre.