Я только начал работать с пространственными базами данных и хочу написать запрос SQL (PostGIS) для автоматического обобщения необработанных GPS-треков (с фиксированной частотой отслеживания). Первое, на чем я работаю, - это запрос, который идентифицирует точки остановки в форме запроса, такого как «x точек на расстоянии y метров», чтобы заменить массивные облака точек репрезентативными точками. Я уже понял, чтобы привязать точки на определенном расстоянии и сосчитать привязанные. На рисунке ниже можно увидеть примерный трек (маленькие черные точки) и центры привязанных точек в виде цветных кружков (размер = количество привязанных точек).
CREATE table simplified AS
SELECT count(raw.geom)::integer AS count, st_centroid(st_collect(raw.geom)) AS center
FROM raw
GROUP BY st_snaptogrid(raw.geom, 500, 0.5)
ORDER BY count(raw.geom) DESC;
Я был бы столь же доволен этим решением, но есть проблема времени: представив дорожку в виде дорожки полного дня в городе, человек может вернуться в места, которые уже посещал ранее. В моем примере темно-синий круг представляет дом человека, который он посетил дважды, но мой запрос, конечно, игнорирует это.
В этом случае сложный запрос должен собирать только точки с непрерывными временными метками (или идентификаторами), так что он будет производить две репрезентативные точки здесь. Моей первой идеей была модификация моего запроса к 3d-версии (время как третье измерение), но, похоже, она не работает.
У кого-нибудь есть советы для меня? Я надеюсь, что мой вопрос понятен.
Спасибо за идею линии. Я понял, как сделать и упростить линейную линию, как вы можете видеть на скриншоте ниже (точки - это исходные точки). Что мне еще нужно, так это определить места отдыха (> x точек в радиусе <x метров), в идеале как одну точку с временем прибытия и уходом ... какие-нибудь другие идеи?
Ответы:
Если вам действительно нужны все точки для визуализации, тогда вы можете создать линию, и st_simplify (которая является реализацией Дугласа Пеккера) сделает эту работу довольно хорошо.
В некоторых случаях вам даже не нужно сохранять все точки, поэтому вы можете выполнить фильтрацию перед сохранением данных точек, например, когда объект не перемещается, не сохраняйте его. Вы можете применить DouglasPeucker или другой базовый фильтр, прежде чем добавлять точки в БД. Также некоторые провайдеры GPS (например, Android Location API) могут автоматически выполнять начальную фильтрацию по времени и минимальному расстоянию. В некоторых случаях вы сохраняете дубликаты данных: предварительный фильтр для быстрой визуализации и полный журнал для архива. Обычное хранение довольно дешево в наши дни.
источник
Тем временем я нашел решение своей проблемы:
Сначала я определил «тип расстояния» для каждой точки. Если точка ближе, чем на x метров к следующей точке, она определяется как «стоп», в противном случае как «движение». Затем я запустил оконную функцию следующим образом:
Полученная таблица выглядит следующим образом:
Простой следующий шаг группирует точки остановки, идентифицирует центр тяжести этих групп точек и принимает минимальные и максимальные временные метки в качестве времени прибытия и отъезда.
источник