-
Notifications
You must be signed in to change notification settings - Fork 13
New System Description RU
#Структура данных
##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 Модель хранения данных
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 |
###Вопросы:
- на какой стадии точки и элементы станций получают id узла (атрибут id в полигональном слое nodes)?
- структура исходных данных не учитывает расписания движения поездов и не учитывает необходимость ожидания поезда при пересадке с одной платформы на другую. Нужно подумать, как в будущем мы будем решать данную проблему (путем использования открытых данных в других форматах или api других систем?).
- что будем делать с неработающими платформами/лифтами? Сейчас в слоях elevators и wheelchair platforms есть атрибут “outoforder”. Наличие цифры 1 означает, что элемент инфраструктуры неисправен и проложить маршрут через него нельзя. Необходимо, чтобы эта информация учитывалась либо на этапе построения графа, либо на этапе прокладки маршрута по графу. Следует ли перенести эту информацию в близлежащие точки слоя points?
- учитывается ли сейчас информация о закрытии входов-выходов (атрибут 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.1. Отображение доступности/недоступности входов и выходов на карте с учетом заданных пользователем ограничений:
- В тот момент, когда пользователь выбирает начальную станцию И устанавливает профиль, отличный от профиля "Без ограничений", начинает работать скрипт(?), который запускает алгоритм прокладки кратчайших маршрутов от всех точек входов, связанных с этой станцией, до точки станции. Также скрипт производит пост-процессинг данных по проложенным маршрутам. Итогом работы скрипта должна стать генерация таблицы с параметрами доступности проложенных маршрутов (минимальная ширина прохода, количество эскалаторов, количество ступеней, максимальный уклон, и т.п. - список параметров формируется отдельно для каждого профиля).
Сейчас эти данные по доступности маршрутов внутри выбранной станции берутся из таблицы portals.csv
-
В том случае, если параметры доступности маршрута в сгенерированной таблице не соответствуют параметрам, заданным пользователем, иконка входа должна изменить свой внешний вид (восклицательный знак).
-
Аналогичный скрипт запускается в момент, когда пользователем выбрана конечная станция И установлен профиль, отличный от профиля "Без ограничений".
-
Результаты прокладки маршрутов на этой стадии НЕ УЧИТЫВАЮТСЯ при последующей прокладке общего маршрута.
##2. В роутинговый движок отправляется запрос со следующей информацией:
- id входа
- id выхода
- номер профиля пользователя (1 - “без ограничений”, 2 - “я на кресле-коляске” или 3 - “я с детской коляской”)
Если пользователь выбрал не выбрал вход и выход, а выбрал только начальную и конечную станцию, то см. следующий юзер-кейс.
##3. Роутинговый движок выбирает граф, соответствующий выбранному профилю пользователя
##4. Макро-роутинг (построение альтернативных маршрутов между узлами):
- находит оптимальный маршрут (K1) от заданной точки входа до заданной точки выхода
- (опционально) находит второй по оптимальности маршрут (K2), по очереди блокируя все точки центров станций в маршруте K1
- (опционально) находит третий по оптимальности маршрут (K3), по очереди блокируя все точки центров станций в маршруте K2. В том случае, если вес маршрута K3 оказывается больше, чем вес маршрута K2a (следующего по оптимальности после маршрута K2, найденного в процессе поиска маршрута K2), то вместо маршрута K3 используется маршрут K2a.
##5. Микро-роутинг (построение альтернативных маршрутов внутри узлов, опционально):
- находит все возможные маршруты на участках “точка входа - точка платформы”, “точка платформы - точка выхода”, “точка платформы - точка платформы” (в том случае, если между ними есть хотя бы одна точка) для маршрутов 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. по частям маршрута “точка платформы - точка платформы”, в которых нет других точек, кроме точек платформ (непешеходным частям маршрута):
- (опционально) вычисляет время в минутах, необходимое на переезд между станциями на поезде (берет все значения атрибута time в слое train_lines и делит их на 60)
- (опционально) вычисляет общее время в минутах, необходимое на переезд между станциями на поезде (берет сумму всех значений времени по переездам + добавляет время на высадку-посадку пассажиров (1 минута на каждую точку из слоя platform?)
7.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 и находит максимальное значение
###Вопросы:
- нужен ли какой-то пост-процессинг информации для отображения линии маршрута на карте города?
##8. Пользователю показывается следующая информация:
8.1. На карте города:
- Линия непешеходной части маршрута от центра начальной станции до центра конечной станции
- Информация о доступности конкретных входов-выходов с учетом выбранного профиля и установленных ограничений (путем использования других иконок входов-выходов).
8.2. В текстовом блоке:
- Переключатель между маршрутами K1, K2, K3 (опционально)
- Названия входа и выхода
- Перечень станций, входящих в маршрут
- Цвет линий, к которым относятся станции, входящие в маршрут
- Время на переезд между станциями (?)
- Время на пешеходные части маршрута (?)
- Общее время на маршрут (?)
- Переключатель между пешеходными маршрутами внутри станций (опционально)
- Виджеты со схемами узлов, на которых есть пешеходные части маршрутов, отображающие линию проложенного пешеходного маршрута
- Параметры доступности пешеходных частей маршрута (элементы, недоступные для пользователей с учетом выбранного профиля и заданных ограничений, подсвечиваются цветом; части маршрутов, в которых есть недоступные элементы, подсвечиваются цветом):
- минимальная ширина прохода (только для профилей 2 и 3)
- количество лифтов на маршруте (только для профилей 2 и 3)
- количество подъемных платформ на маршруте (только для профиля 2)
- количество эскалаторов на маршруте
- количество пандусов на маршруте (только для профилей 2 и 3)
- общее количество ступеней на маршруте (только для профиля 1)
- количество ступеней без поручней (только для профиля 2)
- рельсы экономят ступеней (только для профиля 3)
- остается пройти ступеней (только для профиля 3)
- минимальная ширина рельс (только для профилей 2 и 3)
- максимальная ширина рельс (только для профилей 2 и 3)
- максимальный угол наклона (только для профилей 2 и 3)
#Прокладка маршрута от станции до станции:
Аналогично предыдущему разделу, за исключением следующих пунктов:
##1. Пользователь выбирает:
- начальную станцию (на карте или через дропдаун)
- конечную станцию (на карте или через дропдаун)
- профиль пользователя - “без ограничений”, “я на кресле-коляске” или “я с детской коляской” (если профиль не выбран, то по умолчанию используется профиль “без ограничений”)
- (опционально) ширину кресла-коляски или детской коляски
##2. В роутинговый движок отправляется запрос со следующей информацией:
- id начальной станции
- id конечной станции
- номер профиля пользователя (1 - “без ограничений”, 2 - “я на кресле-коляске” или 3 - “я с детской коляской”)
##3. Роутинговый движок выбирает граф, соответствующий выбранному профилю пользователя: без изменений
##4. Макро-роутинг (построение альтернативных маршрутов между узлами): без изменений, за исключением того, что маршрут К1 строится между центрами станций.
##5. Микро-роутинг (построение альтернативных маршрутов внутри узлов, опционально): нет
##6. Роутинговый движок отдает следующую информацию по маршрутам K1, K2, K3: без изменений, за исключением данных по точкам входа-выхода (координаты, названия).
##7. Пост-процессинговый скрипт обрабатывает полученную информацию следующим образом:
7.1. разбивает маршрут на части: “точка начальной станции - точка платформы”, “точка платформы - точка платформы” (n штук), “точка платформы - точка конечной станции”
далее - без изменений
##8. Пользователю показывается следующая информация: без изменений, за исключением названий входа и выхода
#Изменение отдельного входа/выхода на проложенном маршруте (без изменения начальной и конечной станций)
При изменении начальной или конечной точки маршрута (независимо от того, относятся ли они к тем же станциям или нет) маршрут перестраивается полностью с нуля, начиная с пункта 2. В роутинговый движок отправляется запрос со следующей информацией...
#Изменение профиля пользователя на проложенном маршруте
При изменении профиля пользователя маршрут перестраивается полностью с нуля, начиная с пункта 2. В роутинговый движок отправляется запрос со следующей информацией...
#Изменение установленных ограничений (ширины коляски) на проложенном маршруте
При изменении установленных ограничений (без смены профиля пользователя) перестройка маршрута с нуля не происходит.
Вместо этого постпроцессинговый скрипт снова сравнивает вычисленное значение минимальной ширины прохода - теперь уже с новой шириной коляски.