Як я можу перетворити полілінії на точки кожні n метрів у PostGIS?


14

Питання майже те саме, що і це , але мені потрібно використовувати PostGIS.

У мене є ряд поліліній, і я хочу їх перетворити на точки на кожні n метрів уздовж цих ліній.

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


Відповіді:


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 цієї геометрії та створити з неї крапку.

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

EDIT

Справедливості я хочу додати цю інформацію: Ідея та запит у цій відповіді витягнуті з запиту, який я використовую для створення ліній драпірування з DEM в PostGIS. Відмінна реалізація цього пояснюється в цій статті Матьє Леплатре.


Чи можете ви уточнити, б / с я не знайомий з цими конструкціями SQL: де WITH line ASвикористовується? Я не бачу "лінії" в іншому місці.
culebrón

2
@ culebrón WITH QueryЗабезпечує використання тимчасових таблиць для великих запитів. Ось деякі відомості: postgresql.org/docs/8.4/static/queries-with.html . lineвикористовується в наступному підзапиті linemeasure. Вибрані дані в цьому підзапиті базуються на виборах, зроблених у lineпідзапиті. Вони будуються один на одному. Сподіваюся, що допомогло!
Стефан

У PostGIS старше 2.0 функція є st_locate_along_measure.
culebrón
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.