Ich habe viele Flugdaten von Segelflugpiloten in Form von GPS-Fixes in einem festgelegten Intervall. Ich möchte die Flugbahn analysieren und den Beginn und das Ende des "Kreisens" erkennen, das der Segelflugpilot machen wird, wenn er Thermik findet.
Im Idealfall würde mir ein Algorithmus einen Start- und einen Endpunkt auf der Linie geben und einen "Kreis" definieren. Diese Punkte können einem der GPS-Fixes entsprechen und müssen nicht interpoliert werden.
Ich könnte einfach den Flugweg entlang gehen, die Wendegeschwindigkeit überprüfen und anhand einiger Kriterien entscheiden, ob der Schirm kreisen soll oder nicht.
Da ich PostgreSQL mit PostGIS-Erweiterung verwende, war ich neugierig, ob es einen besseren Ansatz für dieses Problem gibt. Ich habe bereits ein Verfahren zur Berechnung des Winkels zweier Liniensegmente:
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;
Es sollte möglich sein, alle Liniensegmente zu durchlaufen und zu überprüfen, ob die Summe der Winkel größer als 360 oder kleiner als -360 Grad ist. Dann könnte ich st_centroid verwenden, um bei Bedarf den Mittelpunkt des Kreises zu ermitteln.
Gibt es einen besseren Ansatz?
Wie gewünscht habe ich einen Beispielflug hochgeladen .
quelle
Antworten:
Ich konnte nicht aufhören darüber nachzudenken ... Ich konnte mir eine gespeicherte Prozedur ausdenken, um die Schleife zu zählen. Der Beispielpfad enthält 109 Schleifen!
Hier sind die Flugpunkte mit den Schleifenschwerpunkten in Rot dargestellt:
Grundsätzlich werden die Punkte in der Reihenfolge durchlaufen, in der sie erfasst wurden, und es wird eine Linie erstellt, während die Punkte durchlaufen werden. Wenn die gerade erstellte Linie eine Schleife erstellt (mit ST_BuildArea), zählen wir eine Schleife und beginnen von diesem Punkt aus erneut mit dem Erstellen einer Linie.
Diese Funktion gibt eine Datensatzmenge jeder Schleife zurück, die die Schleifennummer, ihre Geometrie, ihren Start- / Endpunkt und ihren Schwerpunkt enthält (ich habe sie auch ein wenig aufgeräumt und bessere Variablennamen erstellt):
Dies ist eine einfache Funktion, um nur die Schleifenzahl zurückzugeben:
quelle
Mir ist aufgefallen, dass die GPX-Datei einen Zeitstempel hat, der ausgenutzt werden könnte. Vielleicht könnte der folgende Ansatz funktionieren.
quelle