J'ai beaucoup de données de vol de pilotes de planeurs sous forme de corrections GPS dans un intervalle fixe. Je voudrais analyser la trajectoire de vol et détecter le début et la fin des «cercles» que le pilote de planeur fera lorsqu'il trouvera des thermiques.
Idéalement, un algorithme me donnerait un point de départ et un point d'arrivée sur la ligne, définissant un "cercle". Ces points peuvent être égaux à l'un des correctifs GPS et n'ont pas besoin d'être interpolés.
Je pouvais simplement marcher le long de la trajectoire de vol, vérifier le taux de virage et avoir des critères pour décider si le planeur tourne ou non.
Comme j'utilise PostgreSQL avec l'extension PostGIS, j'étais curieux de savoir s'il existe une meilleure approche de ce problème. J'ai déjà une procédure pour calculer l'angle de deux segments de ligne:
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;
Il devrait être possible de boucler sur tous les segments de ligne et de vérifier, lorsque la somme des angles est supérieure à 360 ou inférieure à -360 degrés. Ensuite, je pourrais utiliser st_centroid pour détecter le centre du cercle, si nécessaire.
Est-ce qu'il y a une meilleure approche?
Comme demandé, j'ai téléchargé un exemple de vol .
Réponses:
Je ne pouvais pas m'arrêter d'y penser ... J'ai pu trouver une procédure stockée pour faire le comptage de boucle. Le chemin d'exemple contient 109 boucles!
Voici les points de vol indiqués avec les centroïdes de boucle en rouge:
Fondamentalement, il parcourt les points dans l'ordre où ils ont été capturés et construit une ligne à mesure qu'il parcourt les points. Lorsque la ligne que nous construisons crée une boucle (à l'aide de ST_BuildArea), nous comptons une boucle et recommençons à construire une ligne à partir de ce point.
Cette fonction retourne un jeu d'enregistrements de chaque boucle qui contient le numéro de boucle, sa géométrie, son point de début / fin et son centroïde (je l'ai également nettoyé un peu et fait de meilleurs noms de variables):
Il s'agit d'une fonction simple pour renvoyer uniquement le nombre de boucles:
la source
J'ai remarqué que le fichier gpx a un horodatage qui pourrait être exploité. Peut-être que l'approche ci-dessous pourrait fonctionner.
la source