Створення рядка з точок за допомогою PostGIS?


10

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

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

Що мені в основному потрібно, це один відрізок лінії від точки 1 до точки 2, завершити лінію, а потім знову з точки 2 до точки 3. Звичайно, все, що враховується ідентифікатором транспортного засобу.

Останній потрібен тому, що я хочу обчислити круїзний напрямок і швидкість транспортного засобу від однієї точки до іншої.


1
Функція ST_MakeLine () зробить це, як тільки ви відпрацюєте часові позначки GROUP BY vehicle_id та ORDER BY. Дивіться: postgis.refractions.net/docs/ST_MakeLine.html
Micha

Добре, я просто спробував це і видав таку заяву: 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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.