如何在PostGIS中内​​插GPS位置


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

@Pablo:是的,很有可能。我会调整我的问题。
昏暗

Answers:


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的代码草案,它只是将点平移给定距离和方位角的基本思想。
要在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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.