Skip to content
simgislab edited this page Oct 31, 2014 · 20 revisions

Архитектура проекта

Нужна диаграмма показывающая вверху (или внизу) прямоугольник - данные, от него стрелки, одна - через процессинг в мобильное приложение, вторая - через процессинг - в веб. Далее схема мобильного и схема веб. Наверное все отдельные.

Веб-сайт

Реализован на Wordpress. Имеет своё управление языками независимое от управления языками веб-приложения (используется плагин WPML).

Интерфейс (фронтенд?) веб-гис-приложения встраивается в страницу веб-сайта посредством добавления конструкций вида:

[metro4all_search name="Kazan" city="kzn" language="en" center="55.7898, 49.1295" route_css_class="city-5" from="From" to="To" zoom_to="Zoom to" choose_entr="Choose entrance on the map" choose_exit="Choose exit on the map" limitations="Limitations" profile_man="I am walking" profile_wheelchair="I am on a wheelchair" profile_trolley="I am with a stroller" route="Route"]

В конструкции указывается нужный язык, город, центр карты (ЧТО ЕЩЕ ИЗ ЭТОГО ОБРАБАТЫВАЕТСЯ?). Эта конструкция передается в (КУДА и КАК?) и результат встраивается соответствующую страницу веб-сайта.

Как в передаются параметры url? Это обратывает веб-сайт или бэкенд веб-гис-приложения. Чья ответственность?

Веб-гис-приложение - фронтенд

Реализовано на JavaScript. Использует вспомогательные библиотеки такие как jQuery и leaflet. В структуре исходного кода размещено по адресу https://github.com/nextgis/metro4all/tree/master/web/static/m4a

Представляет из себя набор модулей:

  • m4a.loader - отвечает за инициализацию других модулей и заполнение переменных-ссылок на DOM-элементы для оптимизиции доступа к ним;
  • m4a.popup.js - создает попап и связанные с ним события, предназначенный для отображения схем метро;
  • m4a.profiles.js - содержит функциональность, необходимую для построения элементами управления, предназначенными для выбора профиля пользователя; также содержит перечень индикаторов, отображаемый для каждого профиля, функции ограничений для каждого показателя в разрезе выбранного профиля, функции валидирования станции по определенным выше ограничениям;
  • m4a.routes - предназначен для отрисовки блока вывода результатов построения маршрута; содержит функции, отрисовывающие каждый индикатор с учетом его валидности; также отвечает за отрисовку маршрута на карте.
  • m4a.stations - отвечает за выбор станций и выходов на карте, привязывает события кликов к выходам / входам станций.

Контролы:

Карта

Реализована на Leaflet.

Функции:

  • Показывает подложку OpenStreetMap (Mapnik)
  • Показывает линии метро (lines.geojson) - линии раскрашиваются по параметру color, содержащему hex-код цвета.
  • Показывает станции метро (центральные точки станций, stations.csv)
  • Показывает входы/выходы со станций в двух состояниях (portals.csv): стандартное - иконка входа или выхода, восклицательное - иконка с воскл.знаком, показывается если выбранный профиль конфликтует с одним из параметров из portals.csv (например ширина коляски больше чем min_width).
  • Выбор исходной станции - нажатие на станцию выводит диалог выбора является ли эта станция исходной или конечной, после выбора заполняется контрол выбора исходной или конечной станции.
  • Выбор конечной станции - аналогично (см. описание контрола)
  • Показывает маршрут на карте - после выбора начальной и конечной станции автоматически запускается процедура машрутизации (см. описание контрола).

####Выбор исходной/конечной станции Поисковая строка при вводе части названия фильтруется список станций с подстрокой.

####Выбор профиля

####Маршрут

Веб-гис-приложение - бэкенд

Серверный компонент реалиован с использованием высокоуровневого языка программирования Python. Также в процессе реализации использовался веб-микрофреймворк bottle. Код компонента расположен в файле https://github.com/nextgis/metro4all/blob/master/web/backend.py

Компонент содержит оконечные точки доступа к сервисам для получения данных. Основной потребитель - фронтенд веб-ГИС-приложения.

При инициализации серверной части путем запуска файла backend.py стартует веб-приложение на 8088 порту по умолчанию. Для корректного отображения шаблонов необходимо заменить строку, содержащую абсолютный путь к ним.

Основные функции:

Маршрутизация

Используется пакет networkx (код).

Для инициализации графа используются stations.csv и graph.csv.

Станции откуда и куда используются для построения кратчайшего маршрута:

nx.shortest_path_length(GRAPH[city], station_from, station_to)

Далее к длине кратчайшего маршрута добавляется умозрительная дельта (5) и в этой окрестности строятся все возможные маршруты длиной менее этой суммы:

nx.all_simple_paths(GRAPH[city], station_from, station_to, minlength+delta)

Результат сортируется по длине, отбираются 3 кратчайших маршрута.

Пример запроса: http://metro4all.org/ajax/ru/msk/routes/search?station_from=34&station_to=120

Пример ответа (фрагмент):

{
    "result": [
        {
            "portals": {
                "portal_to": null,
                "portal_from": null
            },
            "route": [
                {
                    "station_type": "regular",
                    "barriers": null,
                    "station_name": "Маяковская",
                    "schema": "45.png",
                    "station_line": {
                        "color": "#44b85c",
                        "name": "Замоскворецкая",
                        "id": 2
                    },
                    "coordinates": [
                        55.7701163251,
                        37.595785151
                    ],
                    "id": 34
                },

Полный ответ

Извлечение информации о пересадках

Пересадки извлекаются автоматически из построенного маршрута.

В случае наличия пересадки в секция route ответа добавляется параметр interchange (полный пример см. выше):

...
                {
                    "station_type": "interchange",
                    "barriers": {
                        "lift_minus_step": "0",
                        "min_step_ramp": 21,
                        "escalator": 1,
                        "min_step": 21,
                        "max_width": 95,
                        "min_rail_width": null,
                        "lift": false,
                        "max_rail_width": null,
                        "max_angle": null
                    },

...

Извлечение информации о порталах

Если указаны ID порталов извлекается информация и о параметрах маршрута связанных с портала. В этом случае в ответе вместо:

...
            "portals": {
                "portal_to": null,
                "portal_from": null
            },
...

возвращается заполенная информация по барьерам.

Пример запроса: http://metro4all.org/ajax/ru/msk/routes/search?station_from=34&portal_from=17360&station_to=120&portal_to=15190

Пример ответа (фрагмент):

{
    "result": [
        {
            "portals": {
                "portal_to": {
                    "barriers": {
                        "lift_minus_step": "0",
                        "min_step_ramp": 0,
                        "escalator": 1,
                        "min_step": 0,
                        "max_width": 73,
                        "min_rail_width": null,
                        "lift": false,
                        "max_rail_width": null,
                        "max_angle": null
                    }
                },
                "portal_from": {
                    "barriers": {
                        "lift_minus_step": "0",
                        "min_step_ramp": 1,
                        "escalator": 2,
                        "min_step": 37,
                        "max_width": 75,
                        "min_rail_width": 41,
                        "lift": false,
                        "max_rail_width": 88,
                        "max_angle": 20
                    }
                }
            },
            "route": [
                {
...

Полный ответ с входом-выходом

Мобильное приложение

Данные

Основные наборы данных используемые приложением:

  • расположение станций (stations)
  • расположение выходов (portals-exits)
  • параметры доступности по маршрутам (portals-params)
  • перечень линий (lines)
  • расположение линий (lines-geo)
  • схемы