Skip to content

New System Description RU

Denis Rykov edited this page May 1, 2015 · 53 revisions

#Структура данных

##1. Структура исходных данных

1.1. Все исходные данные, кроме схем станций и географии линий метро, хранятся в таблицах dbf и csv.

Описание структуры таблиц dbf и соответствующих слоев .shp:

  • stations - центры станций, слой точек, атрибуты: id, lat, lon, osm_id, name_ru, name_en, id_line
  • platforms - центры платформ, слой точек, атрибуты: id, lat, lon, osm_id, id_station, id_line
  • exits - входы и выходы, слой точек, атрибуты: id, direction, closed, lat, lon, name_ru, name_en, id_st_1, id_st_2, id_st_3
  • points - точки, соединяющие линейные слои, слой точек, атрибуты: id
  • nodes - узлы, полигональный слой, атрибуты: id
  • train_lines - пути движения поездов, слой линий, атрибуты: id, oneway, time, id_line_1, id_line_2, id_line_3
  • passages - пешеходные проходы, слой линий, атрибуты: id, oneway, length
  • doors - двери, слой линий, атрибуты: id, oneway, width
  • turnstiles - турникеты, слой линий, атрибуты: id, oneway, width
  • stairs - лестницы, слой линий, атрибуты: id, oneway, steps, railing
  • rails_stairs - лестницы с рельсами, слой линий, атрибуты: id, oneway, steps, slope, min_width, max_width, railing
  • ramps - пандусы, слой линий, атрибуты: id, oneway, slope, railing, width
  • elevators - лифты, слой линий, атрибуты: id, cab_width, cab_length, outoforder, oneway, width
  • escalators - эскалаторы, слой линий, атрибуты: id, oneway, width
  • wheelchair_platforms - подъемные платформы, слой линий, атрибуты: id, wisth, length, outoforder, oneway

Сейчас эти данные хранятся в таблицах portals.csv, stations.csv и interchanges.csv

В неизменном виде остается таблица lines.csv со структурой: id_line;name_ru;name_en;name_*;color

1.2. Схемы станций хранятся в растровых слоях (формат .png).

Название слоя соответствует номеру станции.

Каждый растровый слой привязывается к локальной системе координат с помощью одноименного файла .pgw

1.3. География линий метро хранится в файле lines.geojson

1.4 Модель хранения данных

Data Model2

type id node_id oneway geom_local min_width max_width length cab_width cab_length closed slope steps railing_count railing_exist
passage PK FK Boolean Geometry NULL NULL Integer NULL NULL Boolean NULL NULL NULL NULL
door PK FK Boolean Geometry 0 Integer NULL NULL NULL Boolean NULL NULL NULL NULL
turnstile PK FK Boolean Geometry 0 Integer NULL NULL NULL Boolean NULL NULL NULL NULL
wheelchair_platform PK FK Boolean Geometry 0 Integer NULL Integer Integer Boolean NULL NULL NULL NULL
ramp PK FK Boolean Geometry 0 Integer NULL NULL NULL Boolean Integer NULL NULL Boolean
escalator PK FK Boolean Geometry 0 Integer NULL NULL NULL Boolean NULL NULL NULL NULL
elevator PK FK Boolean Geometry 0 Integer NULL Integer Integer Boolean NULL NULL NULL NULL
stairs PK FK Boolean Geometry NULL NULL NULL NULL NULL Boolean NULL Integer Integer Boolean
rails_stairs PK FK Boolean Geometry Integer Integer NULL NULL NULL Boolean Integer Integer Integer Boolean

###Вопросы:

  1. на какой стадии точки и элементы станций получают id узла (атрибут id в полигональном слое nodes)?
  2. структура исходных данных не учитывает расписания движения поездов и не учитывает необходимость ожидания поезда при пересадке с одной платформы на другую. Нужно подумать, как в будущем мы будем решать данную проблему (путем использования открытых данных в других форматах или api других систем?).
  3. что будем делать с неработающими платформами/лифтами? Сейчас в слоях elevators и wheelchair platforms есть атрибут “outoforder”. Наличие цифры 1 означает, что элемент инфраструктуры неисправен и проложить маршрут через него нельзя. Необходимо, чтобы эта информация учитывалась либо на этапе построения графа, либо на этапе прокладки маршрута по графу. Следует ли перенести эту информацию в близлежащие точки слоя points?
  4. учитывается ли сейчас информация о закрытии входов-выходов (атрибут closed в слое exits) на этапе построения графа либо на этапе прокладки маршрута по графу?

##2. Построение графа Для разных профилей пользователей строятся разные графы на одних и тех же исходных данных. Это достигается за счет того, что одним и тем же элементам задаются разные веса в зависимости от ограничений разных категорий пользователей.

Описание процесса?

##3. Структура графа

Построенный граф представляет собой таблицу dbf (_gnm_graph.dbf) cо следующей структурой:

  • source (id начальной вершины - точки из слоя exits, platforms, stations или points)
  • target (id конечной вершины - точки из слоя exits, platforms, stations или points)
  • connector (id соединяющего ребра - линии из любого из линейных слоев)
  • cost (вес)
  • inv_cost (?)
  • direction (направление: 0 - возможно в обе стороны, 1 - только от source к target)

Сейчас граф представляет собой таблицу csv (graph.csv) со следующей структурой:

  • id_from (id начальной станции)
  • id_to (id конечной станции)
  • name_from (название начальной станции)
  • name_to (название конечной станции)
  • cost (вес: 3 - для перегонов между станциями разных узлов; 5 - для переходов между станциями одного узла)

#Прокладка маршрута от входа до выхода:

##1. Пользователь выбирает:

  1. начальную станцию (на карте или через дропдаун)
  2. вход (на карте).
  3. конечную станцию (на карте или через дропдаун)
  4. выход (на карте)
  5. профиль пользователя - “без ограничений”, “я на кресле-коляске” или “я с детской коляской” (если профиль не выбран, то по умолчанию используется профиль “без ограничений”)
  6. (опционально) ширину кресла-коляски или детской коляски

##1.1. Отображение доступности/недоступности входов и выходов на карте с учетом заданных пользователем ограничений:

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

Сейчас эти данные по доступности маршрутов внутри выбранной станции берутся из таблицы portals.csv

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

  2. Аналогичный скрипт запускается в момент, когда пользователем выбрана конечная станция И установлен профиль, отличный от профиля "Без ограничений".

  3. Результаты прокладки маршрутов на этой стадии НЕ УЧИТЫВАЮТСЯ при последующей прокладке общего маршрута.

##2. В роутинговый движок отправляется запрос со следующей информацией:

  1. id входа
  2. id выхода
  3. номер профиля пользователя (1 - “без ограничений”, 2 - “я на кресле-коляске” или 3 - “я с детской коляской”)

Если пользователь выбрал не выбрал вход и выход, а выбрал только начальную и конечную станцию, то см. следующий юзер-кейс.

##3. Роутинговый движок выбирает граф, соответствующий выбранному профилю пользователя

##4. Макро-роутинг (построение альтернативных маршрутов между узлами):

  1. находит оптимальный маршрут (K1) от заданной точки входа до заданной точки выхода
  2. (опционально) находит второй по оптимальности маршрут (K2), по очереди блокируя все точки центров станций в маршруте K1
  3. (опционально) находит третий по оптимальности маршрут (K3), по очереди блокируя все точки центров станций в маршруте K2. В том случае, если вес маршрута K3 оказывается больше, чем вес маршрута K2a (следующего по оптимальности после маршрута K2, найденного в процессе поиска маршрута K2), то вместо маршрута K3 используется маршрут K2a.

##5. Микро-роутинг (построение альтернативных маршрутов внутри узлов, опционально):

  1. находит все возможные маршруты на участках “точка входа - точка платформы”, “точка платформы - точка выхода”, “точка платформы - точка платформы” (в том случае, если между ними есть хотя бы одна точка) для маршрутов K1, K2, K3.

##6. Роутинговый движок отдает следующую информацию по маршрутам K1, K2, K3:

  • координаты всех точек в локальной системе координат
  • координаты точек платформ в глобальной системе координат (атрибуты lat и lon в слое platforms) (?)
  • координаты точек центров станций в глобальной системе координат (атрибуты lat и lon в слое platforms) (?)
  • osm id точек платформ (атрибут osm_id в слое platforms) (?)
  • osm id точек центров станций (атрибут osm_id в слое stations) (?)
  • id входа (атрибут id в слое exits)
  • id выхода (атрибут id в слое exits)
  • название входа (атрибут name_* в слое exits)
  • название выхода (атрибут name_* в слое exits)
  • id всех станций, входящих в маршрут (атрибут id_station в слое platforms)
  • id всех линий, входящих в маршрут (атрибут id_line в слое platforms)
  • id всех узлов, входящих в маршрут (атрибут id в слое nodes) (?)
  • названия слоев для всех элементов
  • время переезда на поезде (атрибут time в слое train_lines)
  • минимальная ширина (атрибут width в cлоях turnstiles, doors, elevators, escalators, wheelchair_platforms)
  • количество ступеней (атрибут steps в слоях stairs, rails_stairs)
  • количество ступеней с перилами (атрибут railing в слоях stairs, rails_stairs)
  • минимальная ширина рельс (атрибут min_width в слое rails_stairs)
  • максимальная ширина рельс (атрибут max_width в слое rails_stairs)
  • угол наклона (атрибут slope в слоях ramps, rails_stairs)

##7. Пост-процессинговый скрипт обрабатывает полученную информацию следующим образом:

7.1. разбивает маршрут на части: “точка входа - точка платформы”, “точка платформы - точка платформы” (n штук), “точка платформы - точка выхода”

7.2. по частям маршрута “точка платформы - точка платформы”, в которых нет других точек, кроме точек платформ (непешеходным частям маршрута):

  1. (опционально) вычисляет время в минутах, необходимое на переезд между станциями на поезде (берет все значения атрибута time в слое train_lines и делит их на 60)
  2. (опционально) вычисляет общее время в минутах, необходимое на переезд между станциями на поезде (берет сумму всех значений времени по переездам + добавляет время на высадку-посадку пассажиров (1 минута на каждую точку из слоя platform?)

7.3. по остальным (пешеходным) частям маршрута:

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

  2. для вычисления времени, затрачиваемого на пешеходные части маршрутов: ?

  3. для отображения информации о доступности маршрута:

  • подсчитывает количество элементов, относящихся к слою elevators
  • подсчитывает количество элементов, относящихся к слою escalators
  • подсчитывает количество элементов, относящихся к слою ramps
  • подсчитывает количество элементов, относящихся к слою wheelchair_platforms
  • вычисляет минимальную ширину прохода (берет все отличающиеся от 0 значения атрибута width в cлоях turnstiles, doors, elevators, escalators, wheelchair_platforms, ramps и находит минимальное значение)
  • сравнивает вычисленное значение минимальной ширины прохода с шириной коляски, заданной пользователем (если задано)
  • вычисляет общее количество ступеней на маршруте (берет все значения атрибута steps в слоях stairs и rails_stairs и находит их сумму)
  • вычисляет, сколько ступеней экономят рельсы (берет все значения атрибута steps в слое rails_stairs и находит их сумму)
  • вычисляет, сколько ступеней остается пройти пешком (берет все значения атрибута steps в слое stairs и находит их сумму)
  • вычисляет, сколько ступеней на маршруте не обеспечены поручнями (берет сумму steps в слоях stairs и rails_stairs и сумму railing в тех же слоях, и находит разницу между этими значениями)
  • вычисляет минимальную ширину рельс (берет все отличающиеся от 0 значения атрибута min_width в слое rails_stairs и находит максимальное значение)
  • вычисляет максимальную ширину рельс (берет все отличающиеся от 0 значения атрибута max_width в слое rails_stairs и находит минимальное значение)
  • вычисляет максимальный угол наклона (берет все значения атрибута slope в слоях ramps, rails_stairs и находит максимальное значение

###Вопросы:

  1. нужен ли какой-то пост-процессинг информации для отображения линии маршрута на карте города?

##8. Пользователю показывается следующая информация:

8.1. На карте города:

  1. Линия непешеходной части маршрута от центра начальной станции до центра конечной станции
  2. Информация о доступности конкретных входов-выходов с учетом выбранного профиля и установленных ограничений (путем использования других иконок входов-выходов).

8.2. В текстовом блоке:

  1. Переключатель между маршрутами K1, K2, K3 (опционально)
  2. Названия входа и выхода
  3. Перечень станций, входящих в маршрут
  4. Цвет линий, к которым относятся станции, входящие в маршрут
  5. Время на переезд между станциями (?)
  6. Время на пешеходные части маршрута (?)
  7. Общее время на маршрут (?)
  8. Переключатель между пешеходными маршрутами внутри станций (опционально)
  9. Виджеты со схемами узлов, на которых есть пешеходные части маршрутов, отображающие линию проложенного пешеходного маршрута
  10. Параметры доступности пешеходных частей маршрута (элементы, недоступные для пользователей с учетом выбранного профиля и заданных ограничений, подсвечиваются цветом; части маршрутов, в которых есть недоступные элементы, подсвечиваются цветом):
  • минимальная ширина прохода (только для профилей 2 и 3)
  • количество лифтов на маршруте (только для профилей 2 и 3)
  • количество подъемных платформ на маршруте (только для профиля 2)
  • количество эскалаторов на маршруте
  • количество пандусов на маршруте (только для профилей 2 и 3)
  • общее количество ступеней на маршруте (только для профиля 1)
  • количество ступеней без поручней (только для профиля 2)
  • рельсы экономят ступеней (только для профиля 3)
  • остается пройти ступеней (только для профиля 3)
  • минимальная ширина рельс (только для профилей 2 и 3)
  • максимальная ширина рельс (только для профилей 2 и 3)
  • максимальный угол наклона (только для профилей 2 и 3)

#Прокладка маршрута от станции до станции:

Аналогично предыдущему разделу, за исключением следующих пунктов:

##1. Пользователь выбирает:

  1. начальную станцию (на карте или через дропдаун)
  2. конечную станцию (на карте или через дропдаун)
  3. профиль пользователя - “без ограничений”, “я на кресле-коляске” или “я с детской коляской” (если профиль не выбран, то по умолчанию используется профиль “без ограничений”)
  4. (опционально) ширину кресла-коляски или детской коляски

##2. В роутинговый движок отправляется запрос со следующей информацией:

  1. id начальной станции
  2. id конечной станции
  3. номер профиля пользователя (1 - “без ограничений”, 2 - “я на кресле-коляске” или 3 - “я с детской коляской”)

##3. Роутинговый движок выбирает граф, соответствующий выбранному профилю пользователя: без изменений

##4. Макро-роутинг (построение альтернативных маршрутов между узлами): без изменений, за исключением того, что маршрут К1 строится между центрами станций.

##5. Микро-роутинг (построение альтернативных маршрутов внутри узлов, опционально): нет

##6. Роутинговый движок отдает следующую информацию по маршрутам K1, K2, K3: без изменений, за исключением данных по точкам входа-выхода (координаты, названия).

##7. Пост-процессинговый скрипт обрабатывает полученную информацию следующим образом:

7.1. разбивает маршрут на части: “точка начальной станции - точка платформы”, “точка платформы - точка платформы” (n штук), “точка платформы - точка конечной станции”

далее - без изменений

##8. Пользователю показывается следующая информация: без изменений, за исключением названий входа и выхода

#Изменение отдельного входа/выхода на проложенном маршруте (без изменения начальной и конечной станций)

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

#Изменение профиля пользователя на проложенном маршруте

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

#Изменение установленных ограничений (ширины коляски) на проложенном маршруте

При изменении установленных ограничений (без смены профиля пользователя) перестройка маршрута с нуля не происходит.

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