User:Zverik/Исследование turnlanes

From OpenStreetMap Wiki
Jump to navigation Jump to search

Есть несколько вариантов, как обозначать полосы разгона. На этой странице я готовлю Proposed features/Turn Lanes.

Отношение

Вполне логично и в духе Garmin MPC Docs сделать полосы поворота через отношения Relation:restriction, дополнительно указывая количество полос торможения перед поворотом и разгона после. Разумеется, чтобы не путать навигаторы, нужен новый тип отношения: restriction_lanes, как-то так.

Для затравки — заготовка отношения, склеенная из restriction и turnlanes. Дальше будем оптимизировать.

Key Value WUT
type lane_restriction
lane_restriction only/no access?
except also, the same
lanes:from idx1;idx2 numbers of lanes from outer side. Example: 1;2
lanes:to idx1;idx2 number of lanes from outer side, omit for all

Members are the same as in restriction relation.

подход два

Только для сложных перекрёстков, иначе выводится из lanes:turnright etc. Для связи полос с примыкающими дорогами, без указания, на какие полосы. Возможно, избежать нумерации через direction=left/right? Хотя это же сложные случаи.

Key Value WUT
type lane_restriction mandatory, obviously
lane numbers numbers of lanes from outer side. Example: 1;2
restriction / except / day_on / etc see restriction relation

Members the same as in restriction relation. The idea is that restrictions are the same (marked with the same arrows), but different for each lane. It's imperative to use "only_straight_on" for through lanes.

Примеры

Отношения нужны только в редких случаях — и часто для того, чтобы определить «прямое» направление (см. начало раздела про роутинг). Почти всегда можно обойтись направлениями на тегах. Вот когда нельзя:

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

Пример с дорогой tertiary, которую пересекает дорога tertiary и ещё ответвление unclassified. Только прямое направление, чтобы было понятно, куда ведут полосы съездов.

Теги на отрезках

Очень хорош и визуален украинский пропозал: просто писать как на знаках, слева направо. Плюс, он позволяет разделить повороты на плавные и резкие. Но выглядит слишком по-программистски, и нужно упрощать, вплоть до уровня lanes:forward:turnright.

Если линия обозначает дорогу с двусторонним движением, то обязательны forward/backward, иначе ошибка.

Достаточно делить на right и left, потому что в целом то, что нужно — это вычислить straight. Конечно, можно указать и всё подряд, хотя это a bit overkill:

  • lanes
  • lanes:forward:turnright
  • lanes:forward:straight
  • lanes:forward:turnleft
  • lanes:forward:turnback
  • lanes:backward:turnright
  • lanes:backward:straight
  • lanes:backward:turnleft
  • lanes:backward:turnback

Madness! С другой стороны, сколько это отношений?

NB: lanes:psv:forward=* Также, полосы разгона — не полосы поворота.

Получается: для двусторонней дороги нужно добавлять суффикс :forward/:backward. Возможные значения для полос:

  • straight (through?)
  • turnleft
  • turnright
  • turnback (?)
  • merge
  • psv/hgv/etc — очевидно, пропозал поглощает lanes:psv=*.

И система умолчаний: lanes - lanes:forward = lanes:backward etc. Но если сумма больше значения lanes, то это специальный случай — хотя и не всегда однозначный. Например:

L S SR.jpg

  • lanes=3
  • lanes:turnleft=1
  • lanes:straight=2
  • lanes:turnright=1

По списку полос неоднозначно, sl;s;r или l;s;sr.

directions

Также, lanes:directions для указания «движения по полосам» со следующими значениями через точку с запятой от обочины к центру:

  • l=left
  • r=right
  • s=straight (t=through?)
  • u=uturn
  • m=merge
  • c=cycleway
  • h=hgv
  • p=psv
  • t=tram
  • ?=parking
  • ?=slight-left, slight-right — не нужны, т.к. это не свойства полос

Пример для вышеприведённого знака: lanes:directions=l;s;sr

Нужно дополнить lanes:reversible для реверсивных полос.

Порядок по умолчанию: sl[t];s;s;s;...;s;s;sr[;h][;p][;m]. Then, optional (marked with different tags): parking;cycleway. If there is a turnlane, 's' default is removed: for lanes:turnleft=1 it would look like: l;s;s;...;s;sr. Of course, if there is no crossroads in the direction of a way (or part of the way), then sl/sr become just 's'.

Бгг, никакого «от обочины к центру». Буква l должна быть слева строки, r — справа (чтобы не ломать мозг), поэтому слева направо относительно водителя: от центра к обочине в странах с правосторонним движением, от обочины к центру — с левосторонним. Но для номеров полос порядок должен быть однозначный.

directions 2

Люди пеняют на сокращения, но без сокращений нужно вводить запятые, и это ад получается:

lanes:directions=turnleft;through;through,turnright;turnright,psv

Но! У нас же есть отношение restriction со всеми стрелками :)

lanes:directions=only_left_turn;only_straight_on;no_left_turn;....?

Косяк с psv и прочими, увы. Если начнут продавливать вопрос сокращений, копать нужно в эту сторону.

Пример

NE2 made a pretty picture of a road with a lot of turn lanes. Let's try to apply this tagging scheme, considering that the road is drawn with a single way broken at red lines, direction of each segment is from top to bottom:

Silly lane count.jpg
lanes=5
lanes:forward=2
lanes:turnleft:backward=1

lanes=4
lanes:forward=2

lanes=5
lanes:forward=3
lanes:turnleft:forward=1

lanes=6
lanes:forward=4
lanes:turnleft:forward=2

lanes=7
lanes:forward=2
lanes:turnleft:backward=2
lanes:turnright:backward=1

lanes=6
lanes:forward=2
lanes:turnleft:backward=1
lanes:turnright:backward=1

lanes=4
lanes:forward=2

lanes=5
lanes:forward=3
lanes:turnleft:forward=1

Not so hard, actually. The defaults that were in use in this example:

  • lanes:backward = lanes - lanes:forward
  • lanes:through = lanes - lanes:turnleft - lanes:turnright

If there were a lane that's both turnleft and throught, we'd have to specify lanes:through.

Трамвайные рельсы

lanes:tram? По некоторым можно ехать, по некоторым — нет (например, в зоне действия знака «движение по полосам»). Вот такой пример: t;sl;s vs tl;s;s. Как его обозначить через теги lanes? Обозначать ли вообще (пример может быть легко переделан, если игнорировать трамвайные пути — как двух- и трёхполосная дорога)?

railway=tram

Что является полосой: не велополосы и не парковочные полосы.

Подписать примеры

User:Eckhart and User:Hai-Etlik made beautiful examples of different lane groups: Relations/Proposed/Lane#Use cases. Их все нужно подписать, как они обозначаются.

Также:

Michigan Left.svg

Пять отрезков, две односторонних дороги:

lanes=2

lanes=3
lanes:turnright=1

lanes=4
lanes:turnright=1
(lanes:turnleft=1 can be mistaken for left turn or confuse router without relations)

lanes=3
lanes:turnleft=1

lanes=2

Неразрешённые вопросы

  • поворот налево и разворот — одно и то же?
не всегда, поэтому лучше сделать отдельный :turnback (эквивалентный turnleft/turnright).
  • разгонные полосы
сделаны как merge и m.
  • полосы для общественного транспорта (уширение для подъезда к остановке)
насчёт уширения непонятно, но lanes:psv было и осталось.
  • реверсивные полосы
отдельное предложение lanes:reversible
  • сделать список как сейчас обозначаются разные полосы — может, часть отнести туда, а не в turnlanes
todo: сопоставить полученный пропозал и предыдущие
  • access?
нет. Усложняет схему тегирования, отношение было решено скопировать из restriction, а там except.
  • полосы вида cycleway, footway и т.п.
решили, что это не полосы: не входят в lanes. Кроме того, уже есть собственные теги.

Remaining Questions

  1. straight or through? Lanes that go straight are called through-lanes, but 's' does not collide with t=tram lines, and 4 of 7 lane types beginning with 't' — not good.
  2. cycling lanes are not considered lanes, but how to map this street (it was s;s;c;r):
    Howtocycling.jpg
  3. lane numbering for relations: left to right, as in lanes:directions, or outside to inside?
  4. do we need a tag for tram lanes? There can be several options with those lanes: t, ts, tl etc. Are they drivable by default? In Russia they aren't, but are tl at crossings.
  5. Is it right to make lanes:* mandatory and lanes:directions optional? The latter contains more information than the former.

Как по этому роутить

Исходные данные — вей, по которому едем.

Сортировка направлений

Первая и главная задача — определить, какая из линий после перекрёстка является направлением through/straight. Это не всегда возможно из топологии: например, для Y-образного перекрёстка с turnlanes с двух сторон (второй развязывается после перекрёстка), либо для «пяти углов».

Главный способ — найти отношение type=[lane_]restriction с restriction=only_straight_on. Это и будет главный путь.

Запасной способ — для turnleft отсечь первую дорогу налево, для turnright — направо. Если осталась одна линия — она и есть искомая. Если осталось несколько линий — выбрать ту, класс которой совпадает или выше класса исходной дороги. Если таких несколько, выбрать продолжение с минимальным углом отклонения от курса.

После определения линии-продолжения все остальные примыкающие линии делятся на «слева» и «справа».

Упорядочивание полос

Если задан тег lanes:directions, то задача уже решена. Иначе требуется составить его из набора тегов lanes:*.

  1. Изначально строим массив «s;s;...;s» по числу полос в теге lanes.
  2. Если от ближайшего перекрёстка есть поворот налево, добавляем l в левую полосу. Аналогично с поворотом направо.
  3. Для каждого lanes:turnback и lanes:turnleft заменяем значение полосы слева на u, затем на l. Аналогично с lanes:turnright.
  4. Если сумма всех lanes:* больше lanes, дописывать по букве s то слева, то справа от центра (оставшейся пачки s).

Номер полосы для вея назначения

Построить от вея назначения маршрут до ближайшего перекрёстка к вею, по которому едем. Если он является членом отношения lane_restriction с ролью to, взять номера полос из него. Иначе определить, в какой он стороне, и взять из списка направлений соответствующие полосы.

Куда приедем по заданной полосе

Если вей, по которому едем, входит в отношения lane_restriction с ролью from, проверить, нет ли в части из них значения тега lane с номером выбранной полосы. Если есть — взять линии дорог из таких отношений. Иначе построить порядок полос и вернуть все линии, удовлетворяющие направлениям для выбранной полосы.

Чем заменить lanes:directions

Никому, даже мне, не нравится «технологичность» этого тега. Можно ли придумать альтернативу, решающую те же проблемы? Для этого составим список вопросов, решаемых тегом:

  • неоднозначность полос для движения прямо: l,s,sr или ls,s,r
  • примыкания и специальные полосы в противоположной стороне: p,s,s и m,s

Один из способов решения — явное указание номеров полос. Минусы:

  • новый тег либо конфликтует с принципом «в lanes:* — количество полос, либо выбивается из схемы;
  • при изменении количества полос придётся следить за цифрами в других тегах.

Скорее всего, нужно обрабатывать именно граничные полосы, а не весь набор. Например, lanes:directions:left=m (условно).

Результат (спасибо Scondo за инициирование brain storm): Proposed features/Turn Lanes#Lane Positions.

Обзоры предыдущих пропозалов

Отношение, которое с плагином

Relations/Proposed/turn lanes предлагает два отношения: turnlanes:lengths для указания поворотных полос у конца линии и turnlanes:turns для указания, с каких полос на какую дорогу можно поворачивать. Осторожно, оно уже популяризовано и используется.

Плюсы:

  • уже есть достаточно удобный (простой ли?) редактор;
  • упрощение: задаются только полосы, с которых поворачивать.

Минусы:

  • разделение полос на обычные и extra;
  • необходимость считать длины дополнительных полос;
  • разделение чисел через запятую, а не точку с запятой;
  • редактор только для JOSM, а отношений много;
  • если ограничений по полосам нет, отношения всё равно надо делать;
  • если начать думать про все возможные комбинации, голова пухнет.

Сравнение:

  • вместо отношения длин полос сделаны нормальные теги;
  • убрано разделение на обычные и extra;
  • вместо access — except, но запреты делаются через механизмы restriction;
  • новая схема лучше вписывается в существующие практики;
  • для новой схемы нет плагина — но он и не требуется.

Украинский пропозал

Proposed features/lane directions предлагает разбивать линию дороги перед перекрёстком и ставить на участок теги соответственно знакам «движение по полосам».

Плюсы:

  • очень легко визуализируется;
  • имея фотографию, легко ввести данные в любом редакторе.

Минусы:

  • «программистская» схема перечисления направлений, много пунктуации;
  • неопределённость автора с порядком нумерации полос;
  • из знаков не всегда просто определить связь отрезков дороги;
  • для двунаправленных участков дороги не работает;
  • слишком большая библиотека направлений, можно запутаться и ошибиться.

Сравнение:

  • убрана нумерация полос (зачем она?);
  • все типы обозначаются одним символом, от чего запятая больше не нужна;
  • убраны мягкие и резкие повороты, остались только обычные (добавить — непонятно, как).

lane:x:direction

Proposed features/lane:x:direction вводит префикс lane:номер(а): (например, lane:3: или lane:1-2:) для, преимущественно, указания направления, куда через много километров приведёт эта полоса в соответствии со знаками. Также возможны другие применения, вроде lane:x:maxspeed.

Плюсы:

  • позволяет присваивать разные атрибуты отдельным полосам.

Минусы:

  • дублирует отношение destination_sign и в целом редко применимо;
  • не указывает схему движения по полосам, только намекает на неё;
  • не определяет порядок нумерации полос;
  • бесполезно в случае, когда на местности полосам не присвоены направления.

Сравнение:

  • направления для полос не указываются, это возложено на роутер и отношение Relation:destination_sign.

Очень крутое дробление

User:Ömmes/Wayparts — самый сложный из способов разбить дорогу на полосы.

Плюсы:

  • не зависит от направления линии;
  • позволяет рисовать знаки движения по полосам;
  • позволяет указывать направления полос, как lane:x:direction;
  • позволяет указывать тип полосы, вплоть до «газона»;
  • есть способ задать теги разным полосам одним мегаотношением;
  • можно не разбивать линии, достаточно опорных точек;
  • в принципе, так рисуется вообще всё.

Минусы:

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

Очень крутая схема — но излишне академична, даже примеры (особенно с отношениями в роли to) просто ломают мозг.

Предложение Mi81 на форуме ПроГорода

Вот оно: добавить вариант restriction=by_lanes для отношения restriction; вместо роли to добавить все возможные направления с номерами полос через точку с запятой в названиях ролей.

Плюсы:

  • встраивается в схему отношения запрета поворота;
  • при этом не требует отдельного отношения на каждую полосу или группу полос;
  • связывает линии дорог.

Минусы:

  • параметрические роли — очень плохо;
  • нет роли to: может считаться ошибкой для отношения restriction.

Сравнение:

  • вместо одного отношения нужно создавать по отношению на каждую группу полос, а возможно — и по несколько на направления;
  • зато нет параметрических ролей;
  • в остальном — тоже основано на отношении restriction.

Предложение vvk000, laneinfo

Вот здесь, на основе формата ПроГорода и очень похоже на украинский пропозал.

Плюсы:

  • простота задания по фотографии знака «движение по полосам» (см. плюсы украинского пропозала);
  • не отношение;
  • всегда соответствет знакам.

Минусы:

  • расплывчато описание порядка нумерации полос;
  • неочевидно назначение :begin и :end;
  • не связаны линии откуда и куда.

Сравнение:

  • полосы справа налево;
  • убраны мягкие повороты;
  • добавлены новые типы полос.

Внезапно, предложение от Scondo

Вот тут. Отмечать параметры каждой полосы (кроме, например, through):

lanes=6
lanes:forward=3
lanes:forward:1=turnleft
lanes:backward:1-3=turnleft

Минусы:

  • перечисления в названии тегов (ну и вообще параметрические теги);
  • не рифмуется с lanes: там количество, а здесь перечисление, причём дважды.

Сравнение:

  • просто и очевидно, как я сам до такого не додумался;
  • решается вопрос с неоднозначностью: здесь всё однозначно;
  • используются номера полос, что рифмуется с отношением lane_restriction.

Также (разобрать)

Scondo: «Их бы вообще все три совместить Направление от украинцев, только без сокращений, теги писать как lane:x: и кроме direction впихнуть туда еще role (carriageway|sidewalk|separator|cycleway|bus_lane и т.д.), width, surface, maxspeed и прочее (как во втором на релейшне). Смысл в том, чтобы не городить по двадцать пять релейшнов на дорогу, оставив максимальную гибкость достаточную для описания дороги в целом, практически с полной отрисовкой.»

gryphon: «Реверсивные полосы!»

Осталось

Разобрать предложения в белорусском треде и от прогорода. Посмотреть, не сказали ли чего умного в tagging@. highway=lane.

Следим за распространением

lanes:turnleft
lanes:through
lanes:turnright
lanes:merge
lanes:turnleft:forward
lanes:psv:location
lanes:directions
type=lane_restriction

Первые линии по этому пропозалу: way 41235579, way 5209829

11 октября линий с тегами по пропозалу было две. 12 октября — более сотни. Когда превысит тысячу, можно объявлять дату начала голосования, скажем, через неделю.