Tạo dòng từ các điểm bằng PostGIS?


10

Tôi có một bảng PostGIS với dữ liệu vị trí của nhiều phương tiện và muốn tạo các đường từ những điểm này.

Dữ liệu có thể được chọn theo id xe và được sắp xếp theo dấu thời gian nhưng làm thế nào để tạo dòng từ kết quả?

Những gì tôi về cơ bản cần là một đoạn đường từ điểm 1 đến điểm 2, hoàn thiện đường kẻ và sau đó lại từ điểm 2 đến điểm 3. Tất nhiên tất cả những điều đó đang được xem xét về id xe.

Cái thứ hai là cần thiết bởi vì tôi muốn tính toán hướng hành trình và tốc độ của chiếc xe từ điểm này đến điểm tiếp theo.


1
Hàm ST_MakeLine () sẽ thực hiện việc này, khi bạn đã có NHÓM THEO xe_id và lệnh ĐẶT HÀNG theo dấu thời gian. Xem: postgis.refraction.net/docs/ST_MakeLine.html
Micha

Được rồi, tôi chỉ đơn giản là đã thử và đưa ra tuyên bố sau: SELECT ais_data.mmsi, ST_MakeLine(ais_data.geom) AS newgeom INTO ais_lines FROM (SELECT * FROM ais_data ORDER BY ais_data.mmsi, ais_data.bs_ts ASC) AS ais_data GROUP BY ais_data.mmsi;Điều đó sẽ cho tôi theo dõi mọi chiếc xe, và không chính xác những gì tôi cần. Làm cách nào để yêu cầu ST_MakeLine () tạo một dòng từ điểm 1 đến điểm 2, hoàn thiện dòng và bắt đầu một dòng mới từ điểm 2 đến điểm 3 ...?
Thomas Becker

"Điểm 1", "điểm 2", "điểm 3" là gì? Làm thế nào để bạn nhận ra chúng?
Micha

Tôi nghĩ sẽ nhận ra chúng thông qua thứ tự dấu thời gian ... ORDER BY ais_data.bs_ts- có khả thi không? Vì vậy, điểm 1, điểm 2 trở đi về cơ bản là thông tin điểm được đưa ra trong mỗi dòng là kết quả của câu lệnh Chọn.
Thomas Becker

Bạn có thể chỉ trong một bước đầu tiên tạo ra một dòng cho mỗi chiếc xe và sau khi tạo đỉnh từ dòng này sử dụng lời khuyên từ mailing list PostGIS postgis.17.x6.nabble.com/...
ThomasG77

Câu trả lời:


12

Nó có thể được thực hiện theo một số cách, sử dụng tự tham gia hoặc truy vấn con tương quan nhưng sử dụng các chức năng của cửa sổ có lẽ là cách dễ nhất.

Hàm lead()trả về một giá trị đi trước trong phân vùng đã cho và phân vùng của chúng tôi là(PARTITION BY <vehicle_id> ORDER BY <timestamp>)

Truy vấn này cung cấp cho chúng tôi số xe, vị trí của điểm đó trong phân vùng (bằng với vị trí của dòng bắt đầu với nó) và hai hình học sẽ tạo ra dòng. Tất nhiên, nó trả về NULL geom2 cho điểm cuối cùng vì vậy chúng ta cần kiểm tra xem trong truy vấn bên ngoài.

SELECT mmsi, num, ST_MAKELINE(geom,geom2) FROM (
  SELECT mmsi, row_number() OVER w AS num, geom, lead(geom) OVER w AS geom2
  FROM ais_data WINDOW w AS (PARTITION BY mmsi ORDER BY bs_ts) ) as q
WHERE geom2 IS NOT NULL;
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.