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.
postgis
point
line
geometry-conversion
Thomas Becker
źródło
źródło
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 ...?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.Odpowiedzi:
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.
źródło