Eu tenho muitos dados de vôo de pilotos de planador na forma de correções de GPS em um intervalo fixo. Gostaria de analisar a trajetória de vôo e detectar o início e o final do 'círculo' que o piloto de planador fará quando encontrar as térmicas.
Idealmente, um algoritmo me daria um ponto inicial e final na linha, definindo um "círculo". Esses pontos podem ser iguais a uma das correções de GPS e não precisam ser interpolados.
Eu simplesmente poderia caminhar ao longo da trajetória de vôo, verificar a taxa de curva e ter alguns critérios para decidir se o planador está circulando ou não.
Como estou usando o PostgreSQL com extensão PostGIS, fiquei curioso para saber se existe uma abordagem melhor para esse problema. Eu já tenho um procedimento para calcular o ângulo de dois segmentos de linha:
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;
Deve ser possível fazer um loop em todos os segmentos de linha e verificar se a soma dos ângulos é maior que 360 ou menor que -360 graus. Então eu poderia usar o st_centroid para detectar o centro do círculo, se necessário.
Existe uma abordagem melhor?
Conforme solicitado, enviei um exemplo de voo .
fonte
Respostas:
Eu não conseguia parar de pensar nisso ... Consegui criar um Procedimento Armazenado para fazer a contagem do loop. O caminho do exemplo contém 109 loops!
Aqui estão os pontos de vôo mostrados com os centróides do loop em vermelho:
Basicamente, ele percorre os pontos na ordem em que foram capturados e constrói uma linha conforme itera pelos pontos. Quando a linha que estamos construindo cria um loop (usando ST_BuildArea), contamos um loop e começamos a construir uma linha novamente a partir desse ponto.
Essa função retorna um conjunto de registros de cada loop que contém o número do loop, sua geometria, seu ponto inicial / final e seu centróide (eu também o limpei um pouco e criei melhores nomes de variáveis):
Esta é uma função simples para retornar apenas a contagem de loop:
fonte
Notei que o arquivo gpx tem carimbo de data e hora que pode ser explorado. Talvez a abordagem abaixo possa funcionar.
fonte