¿Cómo puedo transformar polilíneas en puntos cada n metros en PostGIS?

14

Pregunta en casi lo mismo que esto , pero necesito usar PostGIS.

Tengo varias polilíneas y quiero transformarlas en puntos cada n metros a lo largo de estas líneas.

editar: Muchas gracias a Stefan. Mi consulta final fue un poco diferente, probablemente debido a la versión anterior de PostGIS (1.5), pero al final obtuve lo que necesitaba. Los puntos se combinaron en un mapa de calor de densidad de carreteras. ingrese la descripción de la imagen aquí

culebrón
fuente

Respuestas:

17

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
  1. Al principio, selecciona las distintas cadenas lineales de su columna de polilínea con ST_Dump

  2. 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_seriescrea una serie sobre esta medida en el paso de 10. Aquí puede definir "n metres"(en este ejemplo, 10 metros). El ivalor comienza de nuevo para cada cadena lineal.

  3. Con ST_LocateAlongy ST_GeometryNcrea una geometría de punto multidimensional.

  4. 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í: ingrese la descripción de la imagen aquí

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.

Stefan
fuente
¿Puedes aclarar, b / c? No estoy familiarizado con estas construcciones SQL: ¿dónde WITH line ASse usa? No veo 'línea' en otro lado.
culebrón
2
@ culebrón The WITH Queryproporciona el uso de tablas temporales para consultas más grandes. Aquí hay alguna información: postgresql.org/docs/8.4/static/queries-with.html . linese usa en la siguiente subconsulta linemeasure. Los datos seleccionados en esta subconsulta se basan en las selecciones realizadas en la linesubconsulta. Se construyen uno sobre el otro. Espero que haya ayudado!
Stefan
En PostGIS anterior a 2.0 la función es st_locate_along_measure.
culebrón