Cách nội suy các vị trí GPS trong PostGIS


13

Tôi có một bảng PostGIS về các vị trí GPS trong mỗi năm giây:

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

Tôi đang tìm kiếm một truy vấn sẽ trả về các giá trị (dấu thời gian và điểm) cho mỗi giây. Bạn có thể giả sử rằng các điểm được kết nối bằng một đường thẳng.

Tôi đặc biệt tìm kiếm một cách để làm điều này trong cơ sở dữ liệu chứ không phải bằng cách viết một số tập lệnh bên ngoài.


Tôi nghĩ rằng bạn sẽ cần phải viết một hàm PL / Python cho điều đó.
Pablo

1
Đây là một đoạn trích từ postgis trong hành động có thể giúp đỡ: bostongis.com/postgis_translate.snippet
Pablo

@Pablo: Vâng, rất có thể. Tôi sẽ điều chỉnh câu hỏi của tôi.
underdark

Câu trả lời:


13

ê

Nếu bảng gốc của bạn được gọi là gps_p, trường dấu thời gian của bạn được gọi là ts và các điểm được gọi là 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;

Những gì nó làm là nó xây dựng các đường giữa các điểm và sử dụng st_seributionize để chia dòng thành 5 phân đoạn.

Nếu không chính xác 5 giây giữa các điểm ban đầu của bạn, nó sẽ không hoạt động. Sau đó, bạn có thể chỉ cần thêm một trường id với một chuỗi và sử dụng nó để tự nối bảng với id1 + 1 = id2 thay thế.

HTH

/ Nicklas


6

Đây là một bản thảo mã cho pl / python, đây chỉ là ý tưởng cơ bản của việc dịch các điểm theo một khoảng cách và góc phương vị nhất định.
Để chạy các hàm postgis trong pl / python, giải pháp duy nhất mà tôi tìm thấy là sử dụng plpy.prepare và plpy.execute (rất nhàm chán).

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

Nếu tôi không nhầm ...
Điều bạn cần làm là xác định đường kết nối và sau đó thực hiện phân chia trên nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.