Как интерполировать GPS-позиции в PostGIS


13

У меня есть таблица GPS-координат PostGIS для каждых пяти секунд:

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
Пабло,

@ Пабло: да, скорее всего. Я поправлю свой вопрос.
Подземье

Ответы:


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.

НТН

/ Никлас


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.