PostGIS'te GPS Konumlarını İnterpolasyon


13

Her beş saniyede bir GPS konumlarının PostGIS tablosu var:

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

Her saniye için değerleri (zaman damgası ve nokta) döndürecek bir sorgu arıyorum. Noktaların düz bir çizgi ile bağlandığını varsayalım.

Özellikle bazı dış komut dosyası yazarak değil, veritabanı içinde bunu yapmak için bir yol arıyorum.


Bunun için bir PL / Python işlevi yazmanız gerektiğini düşünüyorum.
Pablo

1
İşte size yardımcı olabilecek postgis'ten bir pasaj: bostongis.com/postgis_translate.snippet
Pablo

@Pablo: Evet, büyük olasılıkla. Sorumu ayarlayacağım.
underdark

Yanıtlar:


13

merhaba

Orijinal tablonuza gps_p adı verilirse, zaman damgası alanınız ts olarak adlandırılır ve puanlar th_geom olarak adlandırılır:

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;

Yaptığı şey, noktalar arasında çizgiler oluşturması ve çizgiyi 5 parçaya bölmek için st_segmentize kullanmasıdır.

Orijinal noktalarınız arasında tam olarak 5 saniye değilse, çalışmaz. Daha sonra bir dizi içeren bir id alanı ekleyebilir ve bunu id1 + 1 = id2 ile tabloya otomatik olarak katılmak için kullanabilirsiniz.

HTH

/ Nicklas


6

İşte pl / python için bir kod taslağı, noktaları verilen bir mesafe ve azimutla çevirmenin sadece temel fikri.
Postgis işlevlerini pl / python'da çalıştırmak için bulduğum tek çözüm plpy.prepare ve plpy.execute (çok sıkıcı) kullanmaktır.

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

Yanılmıyorsam ...
Yapmanız gereken bağlantı hattını belirlemek ve ardından bir bölme yapmaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.