Tengo muchos datos de vuelo de los pilotos de planeadores en forma de correcciones GPS en un intervalo fijo. Me gustaría analizar la ruta de vuelo y detectar el inicio y el final del 'círculo' que hará el piloto de planeador cuando encuentre térmicas.
Idealmente, un algoritmo me daría un punto inicial y final en la línea, definiendo un "círculo". Estos puntos podrían ser iguales a uno de los arreglos de gps y no necesitan ser interpolados.
Simplemente podría caminar a lo largo de la ruta de vuelo, verificar la velocidad de giro y tener algunos criterios para decidir si el planeador está dando vueltas o no.
Como estoy usando PostgreSQL con la extensión PostGIS, tenía curiosidad por saber si hay un mejor enfoque para este problema. Ya tengo un procedimiento para calcular el ángulo de dos segmentos de línea:
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;
Debería ser posible recorrer todos los segmentos de línea y verificar, cuando la suma de los ángulos es mayor que 360 o menor que -360 grados. Entonces podría usar st_centroid para detectar el centro del círculo, si es necesario.
¿Hay un mejor enfoque?
Según lo solicitado, cargué un ejemplo de vuelo .
fuente
Respuestas:
No podía dejar de pensar en esto ... pude idear un Procedimiento almacenado para hacer el conteo del bucle. ¡La ruta de ejemplo contiene 109 bucles!
Estos son los puntos de vuelo que se muestran con los centroides de bucle en rojo:
Básicamente, se ejecuta a través de los puntos en el orden en que fueron capturados y construye una línea a medida que itera a través de los puntos. Cuando la línea que estamos construyendo crea un bucle (usando ST_BuildArea), contamos un bucle y comenzamos a construir una línea nuevamente desde ese punto.
Esta función devuelve un conjunto de registros de cada bucle que contiene el número de bucle, su geometría, su punto de inicio / finalización y su centroide (también lo limpié un poco e hice mejores nombres de variables):
Esta es una función simple para devolver solo el recuento de bucles:
fuente
Noté que el archivo gpx tiene una marca de tiempo que podría ser explotada. Quizás el siguiente enfoque podría funcionar.
fuente