PostGISでGPS位置を補間する方法


13

5秒ごとの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)
...

1秒ごとに値(タイムスタンプとポイント)を返すクエリを探しています。ポイントが直線で接続されていると仮定しても構いません。

私は、外部スクリプトを書くことではなく、データベース内でこれを行う方法を具体的に探しています。


そのためにはPL / Python関数を書く必要があると思います。
パブロ

1
役立つ可能性があるpostgisの
パブロ

@パブロ:はい、ほとんどの場合。質問を調整します。
暗闇

回答:


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

/ Nicklas


6

これはpl / pythonのコードドラフトです。これは、指定された距離と方位角でポイントを変換するための基本的な考え方にすぎません。
pl / pythonでpostgis関数を実行するための唯一の解決策は、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

私が間違っていない場合...
あなたがする必要があるのは、接続線を決定し、それを分割することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.