User:Zverik/Исследование turnlanes
Есть несколько вариантов, как обозначать полосы разгона. На этой странице я готовлю 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, то это специальный случай — хотя и не всегда однозначный. Например:
- 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:
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? Обозначать ли вообще (пример может быть легко переделан, если игнорировать трамвайные пути — как двух- и трёхполосная дорога)?
Что является полосой: не велополосы и не парковочные полосы.
Подписать примеры
User:Eckhart and User:Hai-Etlik made beautiful examples of different lane groups: Relations/Proposed/Lane#Use cases. Их все нужно подписать, как они обозначаются.
Также:
Пять отрезков, две односторонних дороги:
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
- 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.
- cycling lanes are not considered lanes, but how to map this street (it was s;s;c;r):
- lane numbering for relations: left to right, as in lanes:directions, or outside to inside?
- 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.
- 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:*.
- Изначально строим массив «s;s;...;s» по числу полос в теге lanes.
- Если от ближайшего перекрёстка есть поворот налево, добавляем l в левую полосу. Аналогично с поворотом направо.
- Для каждого lanes:turnback и lanes:turnleft заменяем значение полосы слева на u, затем на l. Аналогично с lanes:turnright.
- Если сумма всех 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 |
Первые линии по этому пропозалу: 41235579 41235579, 5209829 5209829
11 октября линий с тегами по пропозалу было две. 12 октября — более сотни. Когда превысит тысячу, можно объявлять дату начала голосования, скажем, через неделю.