Como interpolar posições de GPS no PostGIS

13

Eu tenho uma tabela PostGIS de posições de GPS a cada cinco segundos:

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

Estou procurando uma consulta que retorne valores (carimbo de data e hora) para cada segundo. Não há problema em assumir que os pontos estão conectados por uma linha reta.

Estou procurando especificamente uma maneira de fazer isso dentro do banco de dados e não escrevendo algum script externo.

underdark
fonte
Eu acho que você precisará escrever uma função PL / Python para isso.
1616 Pablo Pablo
1
Aqui está um trecho de postgis em ação que pode ajudar: bostongis.com/postgis_translate.snippet
Pablo
@ Pablo: Sim, provavelmente. Vou ajustar minha pergunta.
Underdark

Respostas:

13

olá

Se sua tabela original é chamada gps_p, seu campo de carimbo de data e hora é chamado ts e os pontos são chamados 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;

O que ele faz é criar linhas entre os pontos e usar st_segmentize para dividir a linha em 5 segmentos.

Se não houver exatamente 5 segundos entre os pontos originais, não funcionará. Em seguida, você pode adicionar um campo de ID com uma sequência e usá-lo para ingressar automaticamente na tabela com id1 + 1 = id2.

HTH

/ Nicklas

Nicklas Avén
fonte
6

aqui está um rascunho de código para pl / python, é apenas a idéia básica de traduzir os pontos por uma determinada distância e azimute.
Para executar funções postgis no pl / python, a única solução que encontrei é usar o plpy.prepare e o plpy.execute (muito chato).

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
fonte
0

Se não me engano ...
O que você precisa fazer é determinar a linha de conexão e, em seguida, fazer uma divisão nela.

Brad Nesom
fonte