Bagaimana menginterpolasi Posisi GPS di PostGIS

13

Saya memiliki tabel PostGIS untuk posisi GPS setiap lima detik:

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)
...

Saya mencari kueri yang akan mengembalikan nilai (cap waktu dan titik) untuk setiap detik. Tidak apa-apa untuk mengasumsikan bahwa poin dihubungkan oleh garis lurus.

Saya secara khusus mencari cara untuk melakukan ini di dalam database dan bukan dengan menulis beberapa skrip eksternal.

underdark
sumber
Saya pikir Anda perlu menulis fungsi PL / Python untuk itu.
Pablo
1
Berikut ini cuplikan dari postgis yang sedang beraksi yang dapat membantu: bostongis.com/postgis_translate.snippet
Pablo
@Pablo: Ya, kemungkinan besar. Saya akan menyesuaikan pertanyaan saya.
underdark

Jawaban:

13

hallo

Jika tabel asli Anda disebut gps_p, bidang stempel waktu Anda disebut ts dan titik-titiknya disebut 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;

Apa yang dilakukannya adalah bahwa ia membangun garis di antara titik-titik dan menggunakan st_segmentize untuk membagi garis dalam 5 segmen.

Jika tidak tepat 5 detik antara titik awal Anda, itu tidak akan berfungsi. Kemudian Anda bisa menambahkan bidang id dengan urutan dan menggunakannya untuk bergabung dengan tabel dengan id1 + 1 = id2 sebagai gantinya.

HTH

/ Nicklas

Nicklas Avén
sumber
6

di sini adalah konsep kode untuk pl / python, itu hanya ide dasar untuk menerjemahkan poin dengan jarak dan azimuth yang diberikan.
Untuk menjalankan fungsi postgis dalam pl / python satu-satunya solusi yang saya temukan adalah dengan menggunakan plpy.prepare dan plpy.execute (sangat membosankan).

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)
Pablo
sumber
0

Jika saya tidak salah ...
Apa yang perlu Anda lakukan adalah menentukan jalur penghubung dan kemudian melakukan pembagian.

Brad Nesom
sumber