Миграция с geonames для трейнспоттеров.

Привет :slight_smile:

Мы занимаемся проектом для жд фанатов, где юзеры заливают свои фотки, и тегируют место съемки. Дальше, мы работаем со списокм объектов - например показываем станции и депо, с фотками, которые привязаны к этим объектам. В случае, кода ж.д. объект не найден, мы тегируем фотку городом или деревней, где был снят поезд. Так как на начальном этапе стояла задача быстро поднять проект, мы использовали самое быстрое решение, которое могли поднять своими руками - взяли базу geonames. Все прекрасно работает, кроме очевидного минуса - отличия в активности и детализации geonames и osm, в пользу последнего.

Проект зажил, и мы стали думать, как нам добиться более подробных геолокаций. Долго читали и облизывались на подробную классификацию ж.д. объектов в osm, и наконец решили - пора мигрировать на osm. В связи с чем возникли вопросы, которые мы хотим задать вам :slight_smile:

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

В общих чертах, мы видим решение нашей задачи примерно таким образом:

Импортируем только нужные нам ноды, и убиваем все relations и ways. Нужные нам - это почти все ноды с тэгом railway, а так же с тэгом place. Получаем как минимум ту же функциональность что имеем сейчас с geonames, но зато на порядок больше объектов. Но тут же возникают вопросы:

  1. Как лучше решить задачу с принадлежностью ноды, например к стране? Например, при заполнении фотки, при вводе названия мы дергаем автокомплитер, и чтобы лимитировать лавину запросов в базу, мы дергаем его только по той стране, в которой была сделана фотка. Второй пример - человек заходит в раздел “Австрия” и хочет получить все фотки из австрийских депо.

Дело в том, что в geonames каждый объект автоматом имеет принадлежность к админ баундари. Там невозможны объекты, которые не имеют принадлежности к какому-то региону. Когда человек с сайта geonames добавляет объект в базу, geonames автоматом понимает по координатам, где находится объект, и к какому рагиону нужно привязать объект. Как быть в случае с osm нодами, которые имеют только координаты? Не прогонять же каждый апдейт через отдельный pgsql, чтобы при выгрузке теэгировать принадлежность? Есть какое нибудь простое решение, если мы не хотим заморачиваться с полигонами для проверки принадлежности?

  1. Как быть, например, со станциями, которые заведены как way, а не как node? Если я правильно понял, политика редактирования osm поощряет сложные станции всегда добавлять как way, а не как node. Можно конечно тупо сконверировать через osmfilter с опицей --all-to-nodes, но в некоторых случаях мы получим визуально фотки не на станции, а буквально на здании станции. Как решать эту проблему? Кроме того, не возникнет ли проблем с накатываенем обновлений, если в changeset’ах мы будем конвертировать way в ноды - будут ли совпадать id новых инкрементированных нод? Например, как я вижу nominantim все объекты адресует в единое облако id, называя их places, значит есть же какой-то человеческий алгоритм преобразования. Или мы неправильно поняли политику, и если станция отображается полигоном, то рядом все равно ставится node?

Спасибо за ваши советы, и хочу сразу предотвратить вопросы - а почему вы хотите попроще а не посложнее: проект бесплатный, и у нас нет достаточных ресурсов чтобы поднимать полновесное решение, поэтому и ищем легкие пути. Задач и так стоит очень много, очень много сил уходит на развитие базы подвижного состава, и мы не можем закопаться и умереть на гео функционале. Не забрасывайте нас шапками, если у нас получится мигрировать на osm, мы приведем с нашего сайта иностранных пенисонеров, которые с радостью помогут с развитем osm в их регионах :slight_smile:

Сделать разовую выгрузку границ стран. В момент импорта точек из осм проверять, в какую из них оно попадает.

А чем это плохо? Где должны находится фотки?

А как это лучше реализовать? Каким образом выгрузить границы стран, если они не прямоугольные? :slight_smile:

Можно вот этой штуковиной. https://github.com/kiselev-dv/gazetteer

Она немного больше делает но можно ограничить чтоб посчитала только place и только жд пои.
Напишите мне на скайп или в почту.

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

Так:

  • railway=station, railway=halt. Чаще всего точки, должны ставиться либо на пути (в случае одного пути либо когда несколько путей нарисованы одной линией) либо где-то между в районе платформ, хотя по факту их часто ставят на здание вокзала. Судя по taginfo есть и площадные станции, возможно где-то одновременно присутствуют и точка и площадь.
  • building=train_station. Здание вокзала. Разночтений вроде не наблюдается, но присутствует как по причине физического отсутствия, так и по причине неотмапленности далеко не всегда.
  • railway=platform / public_transport=platform + train=yes - платформа (по старой/новой схеме). При наличии спутника проставлены довольно часто.
  • public_transport=stop_position + train=yes - точка остановки поезда (середина). Обычно ставятся если точка railway=station стоит не на путях, наличие проверяется тут: http://amdmi3.ru/files/rail_routing/
  • отношение public_transport=stop_area, которое объединяет платформы, точки остановки и прочие объекты станции.

Итого, в зависимости от того что нужно, можно начать с точки railway=station/halt, затем уточнять её положение при наличии подходящих объектов: если нужно здание вокзала - то ближайший building=train_station, если нужно что-то в районе платформ, то взять ближайшие платформы и посчитать их примерный центр k-means’ом или другим способом.

Если бы не площадные станции, можно было бы ограничиться railway=station|halt, и исправлением данных в плане перемещения точек со зданий вокзалов туда где они должны быть, однако с площадными станциями, я боюсь, ничего не сделать - осмысленную точку из них не получить, добавить точку значит получить две станции, а переделать контур в точку может вызвать недовольство авторов.

AMDmi3, если это ж/д-фанаты, им неинтересны только границы платформ, им интересны станции полностью, от входного до входного :wink:
В такой ситуации мапинг станции полигоном от входного до входного и от одного крайнего бокового пути до другого, как в делают в Викимапии - самое лучшее.

В первом посте ясно написано что нужна точка.

“Самого лучшего” когда стоит вопрос терять одни данные или другие нет и быть не может - как и многие другие типы объектов (начиная с place о которых тут недавно оживлённо дикутировали) для станций нужна как точка, так и граница, и из одного другое получить никак нельзя. Кроме того, с границей есть куча нюансов - почти никто из пользователей не будет задумываться ни о каких светофорах, путях и инфраструктуре принадлежащих и не принадлежащих станции и нарисует границу по контуру платформ. А в викимапии как раз рисуют либо по контуру платформ, либо просто абы как.

Вот вам кажется что абы как, а на самом деле в Викимапии, по крайней мере в Украинев пределах крупных узлов, очень даже правильно отображены границы станций, например - http://wikimapia.org/#lang=en&lat=50.440561&lon=30.481052&z=14&m=b&show=/5131250/Kyiv-Pasazhyrsky-Railway-Station
На счет пользователей ОСМ, которым побоку светофоры - http://www.openrailwaymap.org/?lang=en&lat=51.2058347938288&lon=6.670031547546386&zoom=14&style=signals :slight_smile:

О, классный ресурс, возьму на заметку, т.к. тащусь по ЖД.

Я о правиле говорю, а не об исключениях. Да и в этом примере ничего выдающегося не вижу - не похоже что начало и конец станции осознанно привязаны к чему-то типа светофоров, сам контур неточный, здания вокзалов в станцию почему-то не входят. Никакой осмысленной точки из этой загогулины не получить, нужны в любом случае либо платформы (которые отмечены не все), либо здания вокзала. В OSM из такого плана есть landuse=railway о котором я забыл упомянуть - границ станции вдоль путей из него не получить, но сами пути “от крайнего до крайнего” и инфраструктуру он включает.

Ещё раз: я говорю о правиле, а не исключениях. Это даже не Россия.

Друзья, спасибо за активность, я попробую немного конкретизировать ситуацию.

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

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

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

  2. Если локомотив находится за пределами ж.д. объекта, то мы тегируем ближайшим населенным пунктом, или населенным пунктом, внутри которого следует состав.

Соответственно, нам не нужна глубока детализация, идеальным вариантов была бы точка, которая бы была родителем для д.ж. объекта (например станция), а не пути или платформы на ней. Хотело бы вынести некоторые дочерние объекты в отдельные (например фотки в депо на станции хочется тегировать отдельно от самой станции).

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

Рассмотрим пример объекта локомотив. Возьмем электровоз ÖBB 1116. Если зайти в его профиль: http://trainspo.com/class/2/ мы видим карту, которая показывает область где он работает - большая детализация тут не нужна. Если распахнуть карту более подробно http://trainspo.com/class/2/map/ то можно видеть конкретные места, где его можно поймать. Опять же - тут нас не интересуют номера путей и семафоры.

Теперь конкретный пример ж.д. объекта. Например ж.д. мост http://trainspo.com/geo/8426348/ Тут нам важен этот объект, чтобы другие фотографы смогли понять, как туда добраться. Или например депо http://trainspo.com/geo/7839154/ - рядом там видны точки сортировочной станции, пассажирской, и рядом как раз неудачный пример точки самого населенного пункта, который наложился на границу станции.

Попробую еще раз резюмировать.

  1. Нам нужно выгрузить точки всех нужных ж.д. объектов - при наличии дочерних, взять родителя, за исключением некоторых (депо, сортировка, и т.д.).
  2. Выгрузить точи населенных пунктов.
  3. Протегировать все выгруженные объекты административной принадлежностью (чтобы не путать одноименные населенные пункты в рамках одной страны).

Именно это и вызывает большинство вопросов. Например как быть с этой сортировочной http://www.openstreetmap.org/way/41177589 ? Есть ли уверенность, если мы все площадные станции переведем в точку (в нашей базе, естественно), не возникнет ли дублей в случае наличия и площадного объекта и точки?

Сейчас не могу найти пример, но когда я разбирался, то натыкался на ситуацию, когда ж.д. станция могла присутствовать как объект railway, или как объекты и railway и building, так и как только building. Как избавлять от дублей, когда есть и railway=station и building=train_station, и они не попадают друг в друга?

Нам очень болезенна путаница в объектах, потому что при заливке фотографии, ей присваивается geo объект в базе, и любые его изменения (например удаление) вызывает необходимость ручного редатирования большого числа фотографий. Поэтому нам надо выбрать правильную стратегию один раз, миграция с geonames и так потребует огромное количество ручных правок.

В аналогичной ситуации с населенными пунктами совмещают точку и границу, если точка внутри границы и обозначает тоже самое (имеет то же имя и тип).
Что-то подобное можно и тут делать

building - это вокзал, станционное здание. А станция - это другое.

Придется импортировать и то и то, чтобы тегировать фото, когда есть только building, вместо того, чтобы не тегировать ничего :frowning:

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

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

Из того что вы написали выше, я понял что вам не нужны train_station вовсе. Отсутствие railway=station|halt при наличии вокзала - ошибка в данных.

Для начала, вам нужна своя база - привязывать фотки к сторонней, будь то geonames или osm, нельзя. Со своей базой из-за изменений в сторонней (удаление объекта или изменение ID) у вас ничего не рассыплется. А вот свою базу уже можно обновлять по OSM, но делать это надо аккуратно, в некоторых случаях вручную, поскольку данные могут изменяться как угодно: например, тэги станции могут быть перенесены на другую точку (обычное явления, например когда точка станции отвязывается от путей), либо точка перенесена в новое место (простой случай где можно просто взять новые координаты, но рассчитывать на него не стоит), либо тэги станции изменены на другую станцию (это может значит как то что станция была переименована так и то что станция была перепутана местами с другой). Учитывая это, в каких-то случаях можно обновлять данные автоматически (например, если вы привязываетесь к точке станции, точка сдвинулась но name не поменялся), в каких-то просить подтверждения, а какие-то ситуации разруливать исключительно руками.

В валидаторе ЕСР есть экспорт в CSV, почему бы им не воспользоваться? Привязывать по ID станции в ЕСР, например (я не настоящий железнодорожник, просто ссылку нашёл).

Нужны же не только станции. И ЕСР, к слову, тоже обновляется, и тоже с изменением id и названий, так что с ним та же история.

Супер, я понял, это уже кое что, значит для начала можно ориентироваться на объекты railway=*, и забить на здания.

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

В любом случае, спасибо за любые мысли, мы не очень опытные геокодеры, и все это очень полезно. На каком-то этапе я вообще думал оставить худо бедно geonames для всех объектов, кроме железнодорожных, которые можно было бы отдельно взять из openstreetmaps и замерджить с объектами geonames. По крайней мере на переходный период. Пока останавливает то, что я так и не нашел достаточно простой способ, как выдернуть все railway ways/nodes, конвернуть ways в nodes, и так, чтобы этот процессинг был достаточно быстрый и скромный.

Дело в том, что мы собираем фотографии по всему миру, и этот валидатор нам не очень подходит. Кроме того, нам нужно собирать и населенные пункты - поезда не всегда фотографируют на станциях :slight_smile: