Як інтерполювати GPS-позиції в PostGIS


13

У мене є PostGIS таблиця GPS-позицій кожні п’ять секунд:

2011-01-01 00:00:05, POINT(x1,y1)
2011-01-01 00:00:10, POINT(x2,y2)
2011-01-01 00:00:15, POINT(x3,y3)
...

Я шукаю запит, який буде повертати значення (часову позначку та крапку) на кожну секунду. Добре вважати, що точки з'єднані прямою лінією.

Я спеціально шукаю спосіб зробити це всередині бази даних, а не писати якийсь зовнішній сценарій.


Я думаю, що для цього вам потрібно буде написати функцію PL / Python.
Пабло

1
Ось фрагмент від postgis в дії, який може допомогти: bostongis.com/postgis_translate.snippet
Пабло

@Pablo: Так, швидше за все. Я підправлю своє запитання.
нижня частина

Відповіді:


13

привіт

Якщо ваша початкова таблиця називається gps_p, поле часової позначки називається ts, а точки називаються th_geom:

SELECT (geom).geom,  ts1 + (((geom).path[1]-1) ||' seconds')::interval FROM 
    (SELECT ts1, ST_DumpPoints(ST_Segmentize(geom, ST_Length(geom)/5)) as geom FROM 
        (SELECT ts1, ST_LineFromMultipoint(ST_Union(geom1, geom2)) as geom FROM
            (SELECT p1.ts as ts1, p2.ts as ts2, p1.the_geom as geom1, p2.the_geom as geom2 
                FROM gps_p p1 INNER JOIN gps_p p2 on p1.ts + '00:00:05'::interval = p2.ts
            ) a
        )b
    ) c
WHERE (geom).path[1] <= 5;

Що він робить, це те, що він будує лінії між точками і використовує st_segmentize для поділу лінії на 5 сегментів.

Якщо між вашими початковими точками не буде рівно 5 секунд, це не спрацює. Тоді ви можете просто додати поле id з послідовністю та використовувати це для самостійного приєднання таблиці замість id1 + 1 = id2.

HTH

/ Ніклас


6

ось проект коду для pl / python, це лише основна ідея перекладу точок на задану відстань та азимут.
Для запуску функцій postgis в pl / python єдиним знайденим нами рішенням є використання plpy.prepare та plpy.execute (дуже нудно).

total_distance=St_distance(P1,P2)
azimuth=st_azimuth(p1,p2)
partial_distance=total_distance / 5

for i in range(4):
  distance = (i+1)*partial_distance
  x_increment=distance*math.cos(math.degrees(azimuth))
  y_increment=distance*math.sin(math.degrees(azimuth))
  ST_translate(P1, x_increment, y_increment)

0

Якщо я не помиляюся ...
Що вам потрібно зробити, це визначити з'єднувальну лінію, а потім зробити поділ на ній.

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