Визуализация остановок и маршрутов через SVG-файл
- Поиск кратчайшего пути между остановками
- Построение схематической карты
- Получение информации по заданному маршруту/остановке
- Сериализация базы справочника через Google Protobuf
Принимает на вход данные в формате JSON
Структура входного JSON-файла:
{
"base_requests": [ ... ],
"render_settings": { ... },
"routing_settings": { ... },
"serialization_settings": { ... },
"stat_requests": [ ... ]
}
Ключи
base_requests— массив, описывающий маршруты и остановкиrender_settings— словарь, задающий параметры изображенияrouting_settings— словарь, задающий параметры движения автобусовserialization_settings— словарь, задающий сериализованную базу данныхstat_requests— массив запросов к транспортному справочнику
{
"type": "Stop",
"name": "Моя остановка",
"latitude": 67.001205,
"longitude": 64.407514,
"road_distances": {
"Дом бабушки": 3000,
"Дом друга": 4300
}
}
Ключи
type— "Stop" (остановка)name— "Моя остановка" (название остановки)latitude— широтаlongitude— долготаroad_distances— словарь, задающий расстояние до соседних остановок. Ключ — название остановки, значение — целое число в метрах
{
"type": "Bus",
"name": "10",
"stops": [
"Моя остановка",
"Дом бабушки",
"Дом друга"
],
"is_circle": true
}
Ключи
type— "Bus" (маршрут)name— "10" (название маршрута)stops— массив остановокis_circle— признак кольцевого маршрута (значение типа bool) У кольцевого маршрута название последней остановки дублирует название первой
{
"width": 1200.0,
"height": 1200.0,
"padding": 50.0,
"line_width": 14.0,
"stop_radius": 5.0,
"bus_label_font_size": 20,
"bus_label_offset": [7.0, 15.0],
"stop_label_font_size": 20,
"stop_label_offset": [7.0, -3.0],
"underlayer_color": [255, 255, 255, 0.85],
"underlayer_width": 3.0,
"color_palette": [
"green",
[255, 160, 0],
"red"
]
}
Ключи
width,height— ключи, задающие ширину и высоту изображения в пикселях (вещественные числа [0, 100000])padding— отступ краёв карты от границ SVG-документа (вещественное число [0, min(width, height)/2))line_width— толщина линий, которыми рисуются автобусные маршруты (вещественное число [0, 100000])stop_radius— радиус окружностей, которыми обозначаются остановки (вещественное число [0, 100000])bus_label_font_size— размер текста, которым написаны названия автобусных маршрутов (целое число [0, 100000])bus_label_offset— смещение надписи с названием маршрута относительно координат конечной остановки на карте (вещественные числа [-100000, 100000])stop_label_font_size— размер текста, которым отображаются названия остановок (целое число [0, 100000])stop_label_offset— смещение названия остановки относительно её координат на карте (вещественные числа [-100000, 100000])underlayer_color— цвет подложки под названиями остановок и маршрутовunderlayer_width— толщина подложки под названиями остановок и маршрутов. Задаёт значение атрибута stroke-width элемента (вещественное число [0, 100000])color_palette— цветовая палитра (непустой массив)
Цвет можно указать одним из способов:
- строка
- массив из трёх целых чисел [0, 255] — r, g и b компоненты цвета в формате svg::Rgb
- массив из трёх целыъ чисел [0, 255] и одного вещественного числа [0.0, 1.0] — r, g и b компоненты и opacity в формате svg::Rgba
"routing_settings": {
"bus_wait_time": 4,
"bus_velocity": 60
}
Ключи
bus_wait_time— время ожидания автобуса на остановке [1, 1000] (минуты)bus_velocity— средняя скорость автобуса на маршруте без учёта времени стоянки, разгона и торможения [1, 1000] (км/ч)
"serialization_settings": {
"file": "transport_catalogue.db"
}
Ключи
file— файл для считывания сериализованной базы данных
{
"id": 1,
"type": "Bus",
"name": "10"
}
Ключи
id— уникальный номер запроса типа typetype— "Bus" (маршрут)name— название маршрута, для которого нужно вывести информацию
Ответ
{
"curvature": 2.18604,
"request_id": 1,
"route_length": 9300,
"stop_count": 4,
"unique_stop_count": 3
}
Ключи
curvature— извилистость маршрута (отношение длины дорожного расстояния маршрута к длине географического расстояния)request_id— id соответствующего запросаroute_length— длине маршрута (метры)stop_count— общее количество остановок на маршрутеunique_stop_count— количество уникальных остановок на маршруте
{
"id": 2,
"type": "Stop",
"name": "Моя остановка"
}
Ключи
id— уникальный номер запроса типа typetype— "Stop" (остановка)name— название остановки, для которой нужно вывести информацию
Ответ
{
"buses": [
"10", "10А"
],
"request_id": 2
}
Ключи
buses— маршруты автобусов, проходящих через заданную остановкуrequest_id— id соответствующего запроса
{
"type": "Map",
"id": 3
}
Ключи
type— "Map" (изображение)id— уникальный номер запроса типа type
Ответ
{
"map": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">...\n</svg>",
"request_id": 3
}
Ключи
map— изображение маршрутов в формате SVGrequest_id— id соответствующего запроса
{
"type": "Route",
"from": "Моя остановка",
"to": "Дом бабушки",
"id": 4
}
Ключи
type— "Route" (маршрут между двумя остановками)id— уникальный номер запроса типа typefrom— начальная точка маршрутаto— конечная точка маршрута
Ответ
{
"items": [
{
"stop_name": "Моя остановка",
"time": 6,
"type": "Wait"
},
{
"bus": "10",
"span_count": 1,
"time": 5.235,
"type": "Bus"
}
],
"request_id": 4,
"total_time": 11.235
}
Ключи
time— время ожидания автобусаspan_count— количество остановок, которое нужно проехать на данном автобусаtotal_time— общее время в пути
C++17, Protobuf, CMake
- Установить Protobuf
- Скомпилировать proto-файл:
<path_to_protobuf>\bin\proto --cpp_out . transport_catalogue.proto
- Собрать проект с помощью CMake:
cmake . -DCMAKE_PREFIX_PATH=<path_to_protobuf>/package
cmake --build .
В папки include и lib можно добавить зависимости проекта — Additional Include Directories и Additional Dependencies
- Реализация возможности добавления и наложения слоёв (например, спутниковый снимок)
- Создание трека для навигаторов Garmin (GPX)
- Создание трека из маршрутных точек для дронов