Устройство OSM (железные дороги)

  1. Да. Железная дорога представлена как ломаная линия. Иногда каждый путь прорисован как отдельная линия (там, где их видно, и где у человека было терпение их рисовать). Но не факт, что на прямом участке не будет каких-то промежуточных точек.

  2. каждая точка имеет координаты - широту и долготу. Математически задача будет такой: Как взять нужную ломаную линию, посчитать последовательно расстояния от первой точки до всех остальных.
    Думаю, что необязательно разбивать линию ж/д пути на километры. Координаты места происшествия можно будет посчитать с помощью интерполяции.

Просто у меня есть километраж происшествия:
К примеру есть перегон ТОМИЛИНО - КРАСКОВО, в своей системе я могу вычислить длинну, скажем она 20 километров, а инцидент произошел на 2-ом километре перегона
Мне же необходимо отобразить его правильно на карте, можно ли поподробнее

Самое сложное - найти в осм соответсвующие перегоны. Тут либо ручкми собрать соответсвующие куски железок в отношения по типу route и подписать их. Либо искать перегоны как кратчайший путь по железке между окрестностями станций.

Тоесть после первого этапа у вас будет соответсвие перегон - набор ломаных в осм. Ну а дальше этот набор надо упорядочить чтобы конец одной ломаной соответсвовал началу другой ломаной. Ну а по ним уже считать километраж по данным осм и получать координаты.

Да, ж/д в OSM - ломаные линии, и для прямого перегона между станциями может не быть других точек. Впрочем, для вычисления длины не обязательно иметь много точек.

В простом случае алгоритм будет выглядеть примерно так (дано: 2 станции расстояние от первой до искомой точки):

  • получить полную ломаную линию, содержащую нужные станции
  • начиная от первой станции, двигаться по отрезкам, суммируя их длину (формула для длины отрезка по географическим координатам есть)
  • как долько длина превысила данную длину, мы нашли отрезок, на котором лежит наша точка
  • зная расстояние от первой станции до обоих концов отрезка, тривиально вычисляем точное положение точки на отрезке

На самом деле первый шаг довольно сложен.

Во-первых, в OSM рисуются как абстрактные ж/д линии, так и отдельные пути, и точку станции обычно ставят только на один путь. Итого, не во всех случаях можно найти линию, связывающую две станции.
Во-вторых, станции может связывать несколько линий. К примеру, тут: http://www.openstreetmap.ru/#layer=M&zoom=14&lat=56.38421&lon=38.69444
Тут между станциями Александров и Александров-2 есть по факту 2 пути, длинами 3881м и 4246м. Нужно как-то выбирать правильную.
В третьих, вопрос насколько подсчёт расстояния по карте соответствует тому что пишут на табличках. Всё-таки длина дуги окружности > длины хорды, а у нас второе, и на длинных перегонах может накопиться заметная погрешность.

Всё это так или иначе решается, и т.к. меня эта задача внезапно заинтересовала, могу попробовать с этим помочь.

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

Можно свести задачу к локальному перегону, так скажем более конкретизировать ее:
Есть перегон известна его общая длинна в км, перегон состоит из рандомного количества точек

Мы можем определить координаты нашего происшествия, зная на каком километре перегона он произошел, просто применив интраполяцию, т.е узнав какой функцией определяется кривая, соединяющая две станции
Передав километр в эту функцию получим координаты данного километра, все верно?

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

Как быть в этом случае? Я думал что станция на всех путях отмечена

На счет этого варианта, у нас явно надо указать Главный путь, т.е будет считаться километраж только по объектам с указанным номером пути

погрешность не складывается, т.к каждый раз задача решается как новая

На счет длины могу попробовать вытащить, какие нибудь еще сложности могут возникнуть? Точность определения инцидента на карте не требуется вплоть до метра, погрешность в 100 метров на перегоне допустима

Тут нет главного пути. Тут есть путь “туда” и путь “обратно”. То есть выбирать по-хорошему надо в зависимости от того, с какой стороны считаем.

Можно в OSM отмечать точки stop_position на остальных путях, либо автоматически находить их из пересечения перпендикуляра к пути в точки станции с остальными путями, это несложно.

В OSM, боюсь, таких данных нет. Касательно приведённого примера, кстати, у меня возникла идея что эти пути используются в разных направлениях. У нас есть возможность проставлять используемое направление для путей, но, опять таки, проставлено это далеко не везде, и без совместимого с OSM источника информации проставлено в ближайшее время не будет.

Я имел в виду погрешность на одном перегоне. Скажем, если нужная точка где-то на середине перегона, накопим всю погрешность за половину перегона.

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

Вроде навскидку больше сложностей в голову не приходит. Главное - определение нужного пути.

На самом деле в некоторых местах сама ж/д нарисована с большей погрешностью, даже не учитывая угловатости. Но если будут данные по длинам, возможно такие случаи будет проще найти и исправить.

Иногда её вообще не на путях ставят.

Ну это точно надо исправлять, и это делается достаточно тривиально.

Это не ошибка, не надо её исправлять.
На путях можно ставить public_transport=stop_position.

топикстартеру, еще почитайте про linear referencing, многие гис умеют это из коробки и это именно для ваших задач

Точно, только s/можно/нужно/.

Offtopic:
AMDmi3, это перл?

Такой синтаксис регулярок применяется чуть менее чем везде. Как минимум perl, sed.

Все дороги имеют главный путь, и в моей системе все “инциденты” расположены по отношению по главному пути
К примеру существует Инцидент - произошел на перегоне на 10 км , вот этот 10 км будет относительно главного пути - главный путь включает в себя множество станций и перегонов

Направление путей определить можно , как и главные пути, только придется это делать вручную)
На счет погрешностей, насколько они могут быть сильны, т.е мне впринципе нужна очень достоверная карта, потому как РЖД врят ли возьмет проект, который не имеет за собой чего-то нереального)

Еще вопрос, относящийся к движку карты
Например я масштабирую карту до самого детального уровня, мне строятся все объекты (nodes, ways), всем отрезкам я проставляю длину и задаю километры, когда я меняю масштаб все эти данные что я посчитал теряются , верно? т.е сам движок OSM пересчитывает и выдает новые объекты, теряя старые, т.е при каждой смене масштаба карты, мне придется все заного рассчитывать?
И есть ли возможность оффлайн использования данной карты, т.к доступа в интернет у пользователей точно не будет…=(

Всё зависит от того, есть ли у вас эти данные, и можете ли вы их предоставить на условиях, совместимых с лицензией и Contributor Terms OSM. Если да, то их можно добавить напрямую в OSM. Если нет, вам придётся у себя делать постобработку OSM данных чтобы сопоставить их со своими. Учитывая то, что OSM постоянно изменяется, это может потребовать постоянной ручной работы.

Объективных данных у меня, увы, нет, потому что не с чем сравнивать. В целом - OSM рисуют разные люди с разными представлениями о достаточной точности; в разных местах доступны космические снимки разного разрешения и не везде доступны GPS треки, необходимые для точной привязки снимков. Тем не менее, по моим прикидкам погрешность редко где составляет более +/- 20 метров от траектории полотна (“угловатые повороты”) и не более 20-40 метров глобального смещения. Думается, для ваших задач это приемлимо ( глобальное смещение, например, вообще не влияет на рассчёт расстояний). Иногда, конечно, попадаются косяки типа таких:

http://www.openstreetmap.ru/#lat=62.293084&lon=34.51552&zoom=16&layer=BY
http://www.openstreetmap.ru/#lat=62.37125&lon=34.47533&zoom=16&layer=BY
http://www.openstreetmap.ru/#lat=62.409327&lon=34.43814&zoom=16&layer=BY

но это единичные и быстро исправляемые случаи. Также несложно сделать валидатор, контролирующий плавность изгибов линии ж/д чтобы исправить все такие косяки, и уменьшить локальные погрешности вцелом.

О каком именно вы движке и что вы имеете в виду под проставлением длин и километров?

Есть. Все данные (или часть, например - только Россию) в любой момент можно скачать целиком и поднять локальный рендер, либо скачать/отрисовать растр на нужном уровне детализации (но не очень высоких, иначе объём будет очень большим).

Имею ввиду данные по карте:

к примеру на нижнем уровне у меня формируются отрезки, я рассчитаю данные для них - например проставлю каждому отрезку длину и мат. функц-ию формирующую данный отрезок, запишу в данные way(отрезков, соединяющих точки) дополнительные параметры: протяженность, функцию. Т.е один раз запущу скрипт, он просчитает по всем путям данные параметры, но если я сменю масштаб, там же будут уже другие объекты? Или я что-то не понимаю?
Т.е мне необходимо загрузить данные по жд путям с каждого масштаба, пересчитать их и отображать на любых масштабах различные массивы обработанных данных?

Не очень понятно как действует движок OSM при масштабировании, т.е он перерисовывает все объекты, они же где то хранятся - т.е их разное кол-во для разных масштабов или сам движок по другой формуле раскидывает данные по карте? Может глупый вопрос, но я что-то не догоняю)