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

매 초마다 값 (타임 스탬프 및 포인트)을 반환하는 쿼리를 찾고 있습니다. 점이 직선으로 연결되어 있다고 가정해도됩니다.

특히 외부 스크립트를 작성하지 않고 데이터베이스 내부 에서이 작업을 수행하는 방법을 찾고 있습니다.


PL / Python 함수를 작성해야한다고 생각합니다.
Pablo

1
다음은 도움이 될 postgis의 스 니펫입니다. bostongis.com/postgis_translate.snippet
Pablo

@Pablo : 그렇습니다. 질문을 조정하겠습니다.
underdark

답변:


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

/ 니클라스


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.