Mam wiele danych o locie od pilotów szybowców w postaci poprawek GPS w ustalonych odstępach czasu. Chciałbym przeanalizować tor lotu i wykryć początek i koniec „okrążenia” pilota szybowca, gdy znajdzie termikę.
Idealnie, algorytm dałby mi początek i punkt końcowy na linii, definiując jedno „koło”. Punkty te mogą być równe jednej z poprawek GPS i nie muszą być interpolowane.
Mógłbym po prostu przejść ścieżkę lotu, sprawdzić prędkość skrętu i mieć pewne kryteria, aby zdecydować, czy szybowiec krąży, czy nie.
Ponieważ korzystam z PostgreSQL z rozszerzeniem PostGIS, byłem ciekawy, czy istnieje lepsze podejście do tego problemu. Mam już procedurę obliczania kąta dwóch odcinków linii:
CREATE OR REPLACE FUNCTION angle_between(
_p1 GEOMETRY(PointZ,4326),
_p2 GEOMETRY(PointZ,4326),
_p3 GEOMETRY(PointZ,4326)
) RETURNS DECIMAL AS $$
DECLARE
az1 FLOAT;
az3 FLOAT;
BEGIN
az1 = st_azimuth(_p2,_p1);
az3 = st_azimuth(_p2,_p3);
IF az3 > az1 THEN
RETURN (
degrees(az3 - az1)::decimal - 180
);
ELSE
RETURN (
degrees(az3 - az1)::decimal + 180
);
END IF;
END;
$$ LANGUAGE plpgsql;
Powinno być możliwe zapętlenie wszystkich segmentów linii i sprawdzenie, kiedy suma kątów jest większa niż 360 lub mniejsza niż -360 stopni. Następnie mógłbym użyć st_centroid do wykrycia środka koła, jeśli to konieczne.
Czy istnieje lepsze podejście?
Zgodnie z życzeniem przesłałem przykładowy lot .
źródło
Odpowiedzi:
Nie mogłem przestać o tym myśleć ... Byłem w stanie wymyślić procedurę składowaną, aby wykonać liczenie pętli. Przykładowa ścieżka zawiera 109 pętli!
Oto punkty lotu pokazane z czerwonymi centroidami pętli:
Zasadniczo przebiega przez punkty w kolejności, w jakiej zostały one przechwycone, i tworzy linię podczas iteracji przez punkty. Kiedy budowana linia tworzy pętlę (przy użyciu ST_BuildArea), wtedy liczymy pętlę i od tego momentu zaczynamy ponownie budować linię.
Ta funkcja zwraca zestaw rekordów każdej pętli, który zawiera numer pętli, jej geometrię, punkt początkowy / końcowy i jego środek ciężkości (ja też trochę wyczyściłem i stworzyłem lepsze nazwy zmiennych):
Jest to prosta funkcja zwracająca tylko liczbę pętli:
źródło
Zauważyłem, że plik gpx ma znacznik czasu, który można wykorzystać. Być może poniższe podejście może zadziałać.
źródło