Чем прилепить трек к линии?

Есть треки с ЖД, есть линия ЖД с ОСМ. Как треки прилепить к самой линии ЖД, желательно на бесплатном сотфе? Если у кого-то есть платный, могу файлы дать.

gpx слой конвертнуть в осм в josm, жпс-трек превратится в линию. потом обьединить получившийся осм-слой со слоем осм-базы и “объединить” линии, но получится геморойный бардак.
Лучше всего дорисовать по жпс-треку + спутник.фоткам, качественнее получится.

А что под этим подразумевается и для чего это нужно?

Хочу составить график движения по факту, но из-за плавания трека не очень точно получается, то есть расстояние и скорость за счёт бокового смещения растут.

По линиям ОСМ за счёт спрямления кривых и отсутствия набора и спада высоты расстояние будет меньше.

Она достаточно хорошо прорисована, мне хватит. Трек рыскает сильнее.

Файл с треками, файл OSM с рельсами

Идея-то в чём? Чтобы подвинуть точки, но оставить временные метки в точках?

Расстояние померить можно просто измерив линию из ОСМ.

Задача, как мне видится, состоит в том, чтобы спроецировать точки трека на линию.
Для этого нужно сначала найти кратчайшее расстояние от каждой точки до линии и построить его в виде вектора от точки к линии.
Далее - заменить координаты точек на координаты концов векторов.
С задачей поиска расстояний и построения векторов должен справиться v.distance из GRASS. Ну а дальше - один sql-запрос решит задачу окончательно, если данные в базе лежат.

Как мне видится, у ТС задача не теоретическая, а практическая :slight_smile:

И?
Вы хотите сказать, что раз вопрос практический, то всем нужно сразу давать ответы в виде, например, готового кода, даже не уточнив, что автор вопроса имел в виду под “приклеиванием”?
(Вы и сами в обоих сообщениях в этой теме только вскользь описали алгоритм и высказали соображения относительно вклада третьей координаты в истинное расстояние.)

Если вы так считаете, то я - нет: мне предварительное обсуждение алгоритма решения задачи видится не только допустимым, но и полезным для “утрясания представлений” о решаемой задаче (иногда, сюрприз, в процессе этого сама задача оказывается переформулирована или даже снята).

BushmanK, всё правильно. Надо точки трека спроецировать на линию, но в результате нужен трек (то есть с отметками времени и высот).

Если вы сами не работали с GRASS, то оптимальным вариантом будет запостить переформулированный вопрос на гис-лабе, там спецов по этому средству явно больше, чем здесь. Я сам просто не на столько хорошо владею этим инструментом, чтобы все подробно и понятно объяснить.

Смысл решения в следующем: нужно скормить на вход v.distance шейп с дорогами как “to”, а шейп с точками треков (на данном этапе треки, как таковые, не нужны - нужны только их точки, при том можно и без z-координаты) - как “from”. На выходе вы получите набор векторов (кратчайших линий от каждой точки из трека до линии дороги). Каждый вектор - фактически, две пары координат (x,y) : начало - старые координаты точки трека, конец - новые координаты, которые нужно ей присвоить, заменив старые в исходном треке. Далее остается для каждого вектора взять координаты начальной точки, найти их же в треках, заменить их на конечные координаты того же вектора.
И получатся треки, какие бы вышли в режиме lock on road.

Ок, спасибо!

Не за что. Пардон, что не могу грамотно расписать детальнее.

Это слишком простой алгоритм, он будет работать пока линия рельсов одна единственная. Подъезжаем к станции - пути разветвляются и кирдык.

Если нужно чтобы алгоритм не скакал с линии на линию, а рисовал красивый трек вдоль - нужно работать с графом, фильтровать рёбра по направлению движения, соединять точки привязки по возможным соединениям и т.д. и т.п… В общем - классическая задача map matching.

Да, предполагается, что единственный путь, к которому нужно притянуть точки, уже выбран. Если надо учитывать топологию с разветвлениями и прочим - другая история…

Я загрузил по кускам ЖД, выбрал нужное, остальное вычистил и сохранил оставшееся в файл.

Решение. На входе - track (трек, который выравнивается) и way (путь). Но, правда, ещё не добавляет точки из самого пути.


CREATE OR REPLACE FUNCTION rectify_track(track geometry, way geometry)
  RETURNS geometry AS
$BODY$
	with 
		pts as (select generate_series(1, st_numpoints($1)) ptn),
		merged as (select st_pointn(st_shortestline($2, st_pointn($1, ptn)), 1)
			as newpt from pts)
	select st_makeline(newpt) from merged
$BODY$
  LANGUAGE sql VOLATILE
  COST 100;

Работает как для линий, так и для точек.

Импорт gpx в базу PostGIS:

ogr2ogr -append -f PostgreSQL PG:dbname=walks walk.gpx