Como transformar polilinhas em pontos a cada n metro no PostGIS?

14

Pergunta praticamente da mesma forma que isso , mas eu preciso usar o PostGIS.

Eu tenho várias polilinhas e quero transformá-las em pontos a cada n metros, ao longo dessas linhas.

editar: Muito obrigado a Stefan. Minha consulta final foi um pouco diferente, provavelmente devido à versão mais antiga do PostGIS (1.5), mas no final consegui o que era necessário. Os pontos foram combinados em um mapa de calor da densidade das estradas. insira a descrição da imagem aqui

culebrón
fonte

Respostas:

17

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
  1. Inicialmente, você seleciona as cadeias de linhas distintas da coluna cadeia de polilinhas com ST_Dump

  2. É 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_seriescria uma série sobre essa medição na etapa 10. Aqui você pode definir "n metres"(neste exemplo, 10 metros). O ivalor começa de novo para cada cadeia de linhas.

  3. Com ST_LocateAlonge ST_GeometryNvocê cria uma geometria de ponto multidimensional.

  4. Finalmente, você precisa extrair os valores X e Y dessa geometria e criar um ponto a partir dela.

O resultado pode ser assim: insira a descrição da imagem aqui

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.

Stefan
fonte
Você pode esclarecer, porque eu não estou familiarizado com essas construções SQL: onde WITH line ASé usado? Não vejo 'linha' em outro lugar.
1/14
2
@ culebrón O WITH Queryfornece o uso de tabelas temporárias para consultas maiores. Aqui estão algumas informações: postgresql.org/docs/8.4/static/queries-with.html . lineé usado na próxima subconsulta linemeasure. Os dados selecionados nesta subconsulta são baseados nas seleções feitas na linesubconsulta. Eles são construídos um sobre o outro. Espero que tenha ajudado!
Stefan
No PostGIS com mais de 2,0, a função é st_locate_along_measure.
culebrón