У меня есть много полетных данных от пилотов планеров в виде исправлений GPS с фиксированным интервалом. Я хотел бы проанализировать траекторию полета и определить начало и конец «кругового движения», которое совершит пилот планера, когда он обнаружит термики.
В идеале алгоритм должен дать мне начальную и конечную точку на линии, определяя один «круг». Эти точки могут быть равны одному из исправлений GPS и не должны быть интерполированы.
Я просто мог пройтись по траектории полета, проверить скорость поворота и иметь некоторые критерии, чтобы решить, кружит ли планер или нет.
Поскольку я использую PostgreSQL с расширением PostGIS, мне было любопытно, есть ли лучший подход к этой проблеме. У меня уже есть процедура для расчета угла двух отрезков:
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;
Должна быть возможность зацикливаться на всех отрезках и проверять, когда сумма углов больше 360 или меньше -360 градусов. Тогда я мог бы использовать st_centroid, чтобы обнаружить центр круга, если это необходимо.
Есть ли лучший подход?
По запросу я загрузил пример полета .
источник
Ответы:
Я не мог перестать думать об этом ... Я смог придумать хранимую процедуру для подсчета циклов. Пример пути содержит 109 циклов!
Вот точки полета, показанные с центроидами петли красным:
По сути, он проходит через точки в том порядке, в котором они были захвачены, и строит линию, проходя через точки. Когда линия, которую мы строим, создает цикл (используя ST_BuildArea), тогда мы считаем цикл и снова начинаем строить линию с этой точки.
Эта функция возвращает набор записей каждого цикла, который содержит номер цикла, его геометрию, его начальную / конечную точку и его центроид (я также немного его очистил и сделал более подходящие имена переменных):
Это простая функция, которая возвращает только количество циклов:
источник
Я заметил, что у файла gpx есть метка времени, которую можно использовать. Возможно, следующий подход мог бы работать.
источник