Tworzysz linię z punktów za pomocą PostGIS?

10

Mam tabelę PostGIS z danymi pozycji wielu pojazdów i chcę tworzyć linie z tych punktów.

Dane można wybrać według identyfikatora pojazdu i uporządkować według datownika, ale jak utworzyć linie z wyniku?

W zasadzie potrzebuję jednego odcinka linii od punktu 1 do punktu 2, sfinalizuj linię, a następnie ponownie od punktu 2 do punktu 3. Oczywiście wszystko to, biorąc pod uwagę identyfikator pojazdu.

Ten drugi jest potrzebny, ponieważ chcę obliczyć kierunek przelotu i prędkość pojazdu od jednego punktu do drugiego.

Thomas Becker
źródło
1
Funkcja ST_MakeLine () to zrobi, gdy wypracujesz identyfikator GROUP_ Vehicle_id i znacznik czasu ORDER BY. Zobacz: postgis.refractions.net/docs/ST_MakeLine.html
Micha
Dobra, po prostu spróbowałem i wydałem następujące oświadczenie: 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;To da mi ślad każdego pojazdu i nie jest dokładnie tym, czego potrzebuję. Jak powiedzieć ST_MakeLine (), aby utworzyła linię od punktu 1 do punktu 2, sfinalizowała linię i zaczęła nową od punktu 2 do punktu 3 ...?
Thomas Becker,
Co to są „punkt 1”, „punkt 2”, „punkt 3”? Jak je rozpoznajesz?
Micha,
Pomyślałem, żeby je rozpoznać po uporządkowaniu znacznika czasu ... ORDER BY ais_data.bs_ts- czy to możliwe? Zatem punkt 1, punkt 2 i tak dalej to w zasadzie informacje o punktach podane w każdym wierszu jako wynik instrukcji Select.
Thomas Becker,
Możesz w pierwszym kroku wygenerować jedną linię na pojazd, a po wygenerowaniu wierzchołka z tej linii, korzystając ze wskazówek z listy mailingowej postgis postgis.17.x6.nabble.com/…
ThomasG77

Odpowiedzi:

12

Można to zrobić na kilka sposobów, korzystając z autozłączeń lub skorelowanych podkwerend, ale użycie funkcji okna jest prawdopodobnie najłatwiejszym sposobem.

Funkcja lead()zwraca wartość wyprzedzającą dla danej partycji, a nasza partycja to(PARTITION BY <vehicle_id> ORDER BY <timestamp>)

To zapytanie podaje nam numer pojazdu, pozycję tego punktu w przegrodzie (która jest równa pozycji linii zaczynającej się od niego) oraz dwie geometrie, które utworzą linię. Oczywiście zwraca NULL geom2 dla ostatniego punktu, więc musimy to sprawdzić w zewnętrznym zapytaniu.

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;
Jakub Kania
źródło