Как я могу преобразовать полилинии в точки каждые n метров в PostGIS?

14

Вопрос почти такой же, как этот , но мне нужно использовать PostGIS.

У меня есть несколько полилиний, и я хочу преобразовать их в точки через каждые n метров вдоль этих линий.

редактировать: большое спасибо Стефану. Мой последний запрос был немного другим, возможно, из-за более старой версии PostGIS (1.5), но в итоге я получил то, что было нужно. Точки были объединены в тепловую карту плотности дорог. введите описание изображения здесь

culebrón
источник

Ответы:

17

Этот запрос должен сделать трюк:

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. Сначала вы выбираете отдельные строки из столбца полилин ST_Dump

  2. Затем необходимо определить элементы меры с помощью ST_AddMeasure, начиная с 0 (начало строки строки) и конец строки строки (такой же, как длина строки строки). Generate_seriesсоздает серию над этим измерением с шагом 10. Здесь вы можете определить "n metres"(в этом примере 10 метров). iЗначение начинается заново для каждого LineString.

  3. С помощью ST_LocateAlongи ST_GeometryNвы создаете многомерную точечную геометрию.

  4. Наконец, вы должны извлечь значения X и Y этой геометрии и создать точку из нее.

Результат может выглядеть так: введите описание изображения здесь

РЕДАКТИРОВАТЬ

Чтобы быть справедливым, я хочу добавить эту информацию: идея и запрос в этом ответе извлечены из запроса, который я использую для создания линий драпировки из матрицы высот в PostGIS. Отличная реализация этого объясняется в этой статье от Матье Леплатре.

Стефан
источник
Можете ли вы уточнить, б / с я не знаком с этими конструкциями SQL: где WITH line ASиспользуется? Я не вижу «линии» в другом месте.
culebrón
2
@ culebrón The WITH Queryобеспечивает использование временных таблиц для больших запросов. Вот некоторая информация: postgresql.org/docs/8.4/static/queries-with.html . lineиспользуется в следующем подзапросе linemeasure. Выбранные данные в этом подзапросе основаны на выборках, сделанных в lineподзапросе. Они основаны друг на друге. Надеюсь, что это помогло!
Стефан
В PostGIS старше 2.0 функция есть st_locate_along_measure.
culebrón