Конвертер OSM -> MP

Может может. Правда в точке два разворотных запрета. А сбоит только один.
Но надо перепроверить.

Перепроверился. Действительно сбоит это отношение:


А это не сбоит:

Запреты одинаковые, в одной точке. Разница только в направлениях.
Больше разницы не вижу. А значит и искать аналогичные ошибки “по признаку” не возможно. Ну или я не вижу как. А искать каждую ошибку сужением области уонтроля, каторга.

Заменил сбойный “запрет на разворот” “разрешением только прямо”:


Ошибок ещё больше:

Для полноты эксперимента проделал туже операцию с:

что запрет разворота, что движение только прямо - ошибок нет!
А вот здесь:

что запред разворота - ошибки, что движение только прямо - ещё больше ошибок?!

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

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

Всем добрый день!
Случайно натолкнулся на проблему следующего характера:

Спойлер
; WayID = 1137893376:0
; highway = primary
; lanes = 3
; maxspeed = 40
; oneway = yes
[POLYLINE]
Data0=(67.567529,33.353087),(67.5672374,33.3536716),(67.5669906,33.3541706),(67.5669522,33.3542483),(67.5668785,33.3544031)
RoadID=86
DirIndicator=1
RouteParams=2,3,1,0,0,0,0,0,0,0,0,0
Type=0x04
Label=Жемчужная улица
CityName=Апатиты
CountryName=Россия
LegalSpeed=40
RegionName=Мурманская область муниципальный округ Апатиты
StreetDesc=Жемчужная улица
TrafficLanes=2,0,0,1,0,0
TurnLanes=reverse|left|through
Nod0=0,502,0
Nod1=1,353,0
Nod2=3,82,0
Nod3=4,334,0
[END]

Если присмотреться то наверное удивит значение TrafficLanes=2,0,0,1,0,0:
по теории первая цифра - количество полос в прямом направлении,
четвёртая цифра - количество полос в обратном направлении
Всё бы ничего если бы не:
oneway = yes
RouteParams=2,3,1,0,0,0,0,0,0,0,0,0

Не знаю как конвертер формирует эти значения, однако очень похоже за это деяние отвечает запись в settings-navitel.yml:

Спойлер
  TrafficLanes: !!perl/code |-
    {
      my $tags = shift()->{tag};
      my $lt = extract_number($tags->{'lanes'}) // q{};
      my $lf = extract_number($tags->{'lanes:forward'}) // q{};
      my $lb = extract_number($tags->{'lanes:backward'}) // q{};

      if ( $lt ) {
          $lf = length $lb ? $lt-$lb : int($lt/2+0.5)  if !length $lf;
          $lb = length $lf ? $lt-$lf : int($lt/2)      if !length $lb;
      }

      return undef  if !length $lf || !length $lb || $lt<0 || $lb<0;
      return "$lf,0,0,$lb,0,0";
    }

Вопрос - это проблема? Или так и должно быть? Если проблема то может это только у меня? Если не только у меня может есть решение по исправлению этого недочета?
Спасибо!

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

Нет! Это проявляется всякий раз когда полос более чем одна.

Очевидно, функция TrafficLanes игнорирует тег oneway=yes и считает дорогу двухсторонней. Почему так, без более глубокого изучения кода или подсказки разработчика не обойтись. Может, для односторонних дорог предусмотрена другая функция.

Как проблема проявляется? Навигатор ведёт против одностороннего движения?

Спасибо. Какого то явного негативного влияния не заметил. О ведении против одностороннего движения речи не идёт.
Здесь написал в надежде что Алексей (разработчик) найдет немного времени и либо даст ответ по сути, или может даже подправит код.
В теме так же есть активисты которые отметились успешной коррекцией кода. Возможно их заинтересует эта тема. Полагаю это общая проблема пользователей osm2mp. Хотя - отдельные конфиги почему-то не содержат этого кода. Так в Гарминовских конфигах не нашёл этот код.
Сам код мне кажется я привёл в первом сообщении. Пробовал его удалить из Навителовской сборки, особо ничего не меняется. Разве что отображение направлений движения по полосам. Но тестов не достаточно.
С другой стороны если никто на протяжении лет не обратил на это внимание… Ну вы понимаете, и не озвучить тему не смог!

Похоже прочитал часть кода и он не учитывает oneway.

      my $lt = extract_number($tags->{'lanes'}) // q{};
      my $lf = extract_number($tags->{'lanes:forward'}) // q{};
      my $lb = extract_number($tags->{'lanes:backward'}) // q{};

Здесь вроде так - lt из lanes; lf из lanes:forward; lb из lanes:backward

      if ( $lt ) {
          $lf = length $lb ? $lt-$lb : int($lt/2+0.5)  if !length $lf;
          $lb = length $lf ? $lt-$lf : int($lt/2)  if !length $lb;
      }

Здесь lf= lt-lb, или если нет и lb, то lf=lt/2 + коррекция до целого числа
Если у нас 3 lanes, а lf и lb нет, то 3 (lt) делим на 2 плюс коррекция 0,5 = 2 (lf)
Тогда появляется lf и lb будет считаться из lt-lf= 1 (lb)
А то что здесь надо все полосы отдать на lf (по условию oneway) код не описывает!

      return undef  if !length $lf || !length $lb || $lt<0 || $lb<0;
      return "$lf,0,0,$lb,0,0";

Здесь пока не пойму, но концовка описывает вывод - TrafficLanes.