У меня есть таблица PostGIS с данными о положении многих транспортных средств, и я хочу создать линии из этих точек.
Данные могут быть выбраны по идентификатору транспортного средства и упорядочены по отметке времени, но как создать строки из результата?
Что мне в основном нужно, так это один отрезок линии от точки 1 до точки 2, завершить линию, а затем снова из точки 2 в точку 3. Конечно, все это рассматривается с учетом идентификатора транспортного средства.
Последний нужен, потому что я хочу рассчитать круизное направление и скорость транспортного средства от одной точки к другой.
postgis
point
line
geometry-conversion
Томас Беккер
источник
источник
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 ...?ORDER BY ais_data.bs_ts
- возможно ли это? Таким образом, точка 1, точка 2 и т. Д. - это, в основном, информация о точке, приведенная в каждой строке как результат оператора Select.Ответы:
Это можно сделать несколькими способами, используя самостоятельные соединения или коррелированные подзапросы, но использование оконных функций, вероятно, самый простой способ.
Функция
lead()
возвращает значение, которое впереди в данном разделе, и наш раздел(PARTITION BY <vehicle_id> ORDER BY <timestamp>)
Этот запрос дает нам номер транспортного средства, положение этой точки в разделе (которое равно положению линии, начинающейся с него) и две геометрии, которые будут составлять линию. Конечно, он возвращает NULL geom2 для последней точки, поэтому мы должны проверить это во внешнем запросе.
источник