Создание линии из точек с помощью PostGIS?

10

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

Данные могут быть выбраны по идентификатору транспортного средства и упорядочены по отметке времени, но как создать строки из результата?

Что мне в основном нужно, так это один отрезок линии от точки 1 до точки 2, завершить линию, а затем снова из точки 2 в точку 3. Конечно, все это рассматривается с учетом идентификатора транспортного средства.

Последний нужен, потому что я хочу рассчитать круизное направление и скорость транспортного средства от одной точки к другой.

Томас Беккер
источник
1
Функция ST_MakeLine () сделает это, как только вы определите временную метку GROUP BY vehicle_id и ORDER BY. См. Postgis.refractions.net/docs/ST_MakeLine.html
Миша
Хорошо, я просто попробовал и сделал следующее заявление: SELECT ais_data.mmsi, ST_MakeLine(ais_data.geom) AS newgeom INTO ais_lines FROM (SELECT * FROM ais_data ORDER BY ais_data.mmsi, ais_data.bs_ts ASC) AS ais_data GROUP BY ais_data.mmsi;это даст мне трек каждого транспортного средства, и это не совсем то, что мне нужно. Как заставить ST_MakeLine () создать линию от точки 1 до точки 2, завершить линию и начать новую от точки 2 до точки 3 ...?
Томас Беккер
Что такое «точка 1», «точка 2», «точка 3»? Как вы их узнаете?
Миха
Я думал узнать их по порядку отметки времени ... ORDER BY ais_data.bs_ts- возможно ли это? Таким образом, точка 1, точка 2 и т. Д. - это, в основном, информация о точке, приведенная в каждой строке как результат оператора Select.
Томас Беккер
На первом этапе вы можете сгенерировать одну строку для каждого транспортного средства, а затем сгенерировать вершину из этой линии, используя подсказки из списка рассылки postgis postgis.17.x6.nabble.com/…
ThomasG77

Ответы:

12

Это можно сделать несколькими способами, используя самостоятельные соединения или коррелированные подзапросы, но использование оконных функций, вероятно, самый простой способ.

Функция lead()возвращает значение, которое впереди в данном разделе, и наш раздел(PARTITION BY <vehicle_id> ORDER BY <timestamp>)

Этот запрос дает нам номер транспортного средства, положение этой точки в разделе (которое равно положению линии, начинающейся с него) и две геометрии, которые будут составлять линию. Конечно, он возвращает NULL geom2 для последней точки, поэтому мы должны проверить это во внешнем запросе.

SELECT mmsi, num, ST_MAKELINE(geom,geom2) FROM (
  SELECT mmsi, row_number() OVER w AS num, geom, lead(geom) OVER w AS geom2
  FROM ais_data WINDOW w AS (PARTITION BY mmsi ORDER BY bs_ts) ) as q
WHERE geom2 IS NOT NULL;
Якуб Кания
источник