{"id":19301308,"url":"https://github.com/gleor/cpp-transport-catalogue","last_synced_at":"2026-05-18T07:04:39.831Z","repository":{"id":222733958,"uuid":"678133997","full_name":"Gleor/cpp-transport-catalogue","owner":"Gleor","description":"Финальный проект: транспортный справочник","archived":false,"fork":false,"pushed_at":"2024-02-19T11:12:35.000Z","size":93,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-24T01:39:48.829Z","etag":null,"topics":["cpp","graph","json","oop","protobuf","svg"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Gleor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-13T19:43:23.000Z","updated_at":"2024-02-19T11:06:13.000Z","dependencies_parsed_at":"2024-02-15T23:25:42.299Z","dependency_job_id":"09b728b7-6736-430e-964a-cd110a427f5f","html_url":"https://github.com/Gleor/cpp-transport-catalogue","commit_stats":null,"previous_names":["gleor/cpp-transport-catalogue"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Gleor/cpp-transport-catalogue","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gleor%2Fcpp-transport-catalogue","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gleor%2Fcpp-transport-catalogue/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gleor%2Fcpp-transport-catalogue/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gleor%2Fcpp-transport-catalogue/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Gleor","download_url":"https://codeload.github.com/Gleor/cpp-transport-catalogue/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Gleor%2Fcpp-transport-catalogue/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33168910,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T05:43:36.989Z","status":"ssl_error","status_checked_at":"2026-05-18T05:43:19.133Z","response_time":71,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","graph","json","oop","protobuf","svg"],"created_at":"2024-11-09T23:17:30.023Z","updated_at":"2026-05-18T07:04:39.791Z","avatar_url":"https://github.com/Gleor.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# **Transport Catalogue**\n\n## **Описание**\n\nTransport Catalogue - проект, который представляет собой транспортный справочник и обладает следующими функциями:\n\n* Хранит и предоставляет информацию о заданных остановках и маршрутах\n* Выводит карту с остановками и маршрутами в формате SVG\n* Прокладывает кратчайший маршрут между заданными остановками\n\nПриём запросов и выдача ответов осуществляется в формате JSON. Классы форматов JSON и SVG были разработаны самостоятельно\nТак как транспортный справочник является обновляемой базой данных, то взаимодействие с ним разделено на две стадии - создание этой самой базы и получение ответов на запросы. В проекте реализована бинарная сериализация и десериализация данных с помощью Google Protobuf\n\n## **Сборка проекта**\nНеобходимо скачать и установить [Google Protobuf](https://github.com/protocolbuffers/protobuf).\nВ местоположении проекта нужно создать папку, где будет собираться проект, например, build.\nВ новой папке собираем Transport Catalogue с помощью следующих команд в консоли bash:\n```\ncmake . -DCMAKE_PREFIX_PATH=\"тут нужно указать путь до protoc.exe\"\ncmake --build .\n```\n## **Работа с проектом**\nВзаимодействие с проектом разделено на две стадии. Такой подход необходим для решения проблемы с производительностью: построение графов для просчёта маршрутов - это длительный процесс, поэтому он осуществляется только на этапе создания базы. При обработке запросов происходит работа с уже готовым графом, и заново вычисления производить не нужно. Сериализация с использованием Google Protobuf помогает оптимизировать две задачи - хранение большой базы данных и передача по сети\n\nДля того, чтобы создать базу транспортного справочника, нужно поместить в папку с transport_catalogue.exe файл расширения JSON с названием make_base, в котором содержатся запросы base_requests. Затем запустить программу с параметром make_base:\n\n```\ntransport_catalogue.exe make_base\n```\nПосле создания базы можно приступать к работе с ней. Для этого необходимо аналогично make_base.json создать файл process_requests.json, после чего запустить программу с параметром process_requests. Ответы на запросы запишутся в файл result.json.\n\n```\ntransport_catalogue.exe process_requests\n```\nСериализация и десериализация данных происходит автоматически.\n\n### **Формат входных данных**\n\nВходные данные поступают программе из потока ввода в формате JSON-объекта, который имеет на верхнем уровне следующую структуру:\n\n```\n{\n  \"base_requests\": [ ... ],\n  \"render_settings\": { ... },\n  \"routing_settings\": { ... },\n  \"serialization_settings\": { ... },\n  \"stat_requests\": [ ... ]\n}\n```\n\nЭто словарь, содержащий ключи:\n`base_requests` — массив с описанием автобусных маршрутов и остановок.\n`stat_requests` — массив с запросами к транспортному справочнику.\n`render_settings` — словарь для отрисовки изображения.\n`routing_settings` — словарь, содержащий в себе настройки для скорости автобусов и времени ожидания на остановке.\n`serialization_settings` — настройки сериализации.\n\n### **Заполнение базы транспортного справочника**\n\n**Сериализация базы данных**\n\nВ ключе file указывается название файла, в который будет сериализована база.\n\n```\n\"serialization_settings\": {\n    \"file\": \"transport_catalogue.db\"\n}\n```\n\n**Пример описания остановки:**\n\n```\n{\n  \"type\": \"Stop\",\n  \"name\": \"Электросети\",\n  \"latitude\": 43.598701,\n  \"longitude\": 39.730623,\n  \"road_distances\": {\n    \"Улица Докучаева\": 3000,\n    \"Улица Лизы Чайкиной\": 4300\n  }\n}\n```\n\nОписание остановки — словарь с ключами:\n`type` — строка, равная \"Stop\", означает, что словарь описывает остановку;\n`name` — название остановки;\n`latitude` и `longitude` - широта и долгота остановки;\n`road_distances` — словарь, задающий расстояние до соседних остановок. Ключ — название остановки, значение — целое число в метрах.\n\n**Пример описания автобусного маршрута:**\n\n```\n{\n  \"type\": \"Bus\",\n  \"name\": \"14\",\n  \"stops\": [\n    \"Улица Лизы Чайкиной\",\n    \"Электросети\",\n    \"Улица Докучаева\",\n    \"Улица Лизы Чайкиной\"\n  ],\n  \"is_roundtrip\": true\n}\n```\n\nОписание автобусного маршрута — словарь с ключами:\n`type` — строка\"Bus\", означающая, что объект описывает автобусный маршрут;\n`name` — название маршрута;\n`stops` — массив с названиями остановок, через которые проходит автобусный маршрут. У кольцевого маршрута название последней остановки дублирует название первой. Например: [\"stop1\", \"stop2\", \"stop3\", \"stop1\"];\n`is_roundtrip` — значение типа `bool` Указывает, кольцевой маршрут или нет.\n\n**Структура словаря render_settings:**\n\n```\n{\n  \"width\": 1200.0,\n  \"height\": 1200.0,\n\n  \"padding\": 50.0,\n\n  \"line_width\": 14.0,\n  \"stop_radius\": 5.0,\n\n  \"bus_label_font_size\": 20,\n  \"bus_label_offset\": [7.0, 15.0],\n\n  \"stop_label_font_size\": 20,\n  \"stop_label_offset\": [7.0, -3.0],\n\n  \"underlayer_color\": [255, 255, 255, 0.85],\n  \"underlayer_width\": 3.0,\n\n  \"color_palette\": [\n    \"green\",\n    [255, 160, 0],\n    \"red\"\n  ]\n}\n```\n\n`width` и `height` — ключи, которые задают ширину и высоту в пикселях. Вещественное число в диапазоне от 0 до 100000.\n\n`padding` — отступ краёв карты от границ SVG-документа. Вещественное число не меньше 0 и меньше min(width, height)/2.\n\n`line_width` — толщина линий, которыми рисуются автобусные маршруты. Вещественное число в диапазоне от 0 до 100000.\n\n`stop_radius` — радиус окружностей, которыми обозначаются остановки. Вещественное число в диапазоне от 0 до 100000.\n\n`bus_label_font_size` — размер текста, которым написаны названия автобусных маршрутов. Целое число в диапазоне от 0 до 100000.\n\n`bus_label_offset` — смещение надписи с названием маршрута относительно координат конечной остановки на карте. Массив из двух элементов типа double. \n\nЗадаёт значения свойств dx и dy SVG-элемента text. Элементы массива — числа в диапазоне от –100000 до 100000.\n\n`stop_label_font_size` — размер текста, которым отображаются названия остановок. Целое число в диапазоне от 0 до 100000.\n\n`stop_label_offset` — смещение названия остановки относительно её координат на карте. Массив из двух элементов типа double. Задаёт значения свойств dx и dy SVG-элемента text. Числа в диапазоне от –100000 до 100000.\n\n`underlayer_color` — цвет подложки под названиями остановок и маршрутов.\n\n`underlayer_width` — толщина подложки под названиями остановок и маршрутов. Задаёт значение атрибута stroke-width элемента \u003ctext\u003e. Вещественное число в диапазоне от 0 до 100000. color_palette — цветовая палитра. Непустой массив.\n\nЦвет можно указать:\n\n* в виде строки, например, `\"red\"` или `\"black\"`;\n* в массиве из трёх целых чисел диапазона `[0, 255]`. Они определяют r, g и b компоненты цвета в формате `svg::Rgb`. Цвет `[255, 16, 12]` нужно вывести как `rgb(255, 16, 12)`;\n* в массиве из четырёх элементов: три целых числа в диапазоне от `[0, 255]` и одно вещественное число в диапазоне от `[0.0, 1.0]`. Они задают составляющие red, green, blue и opacity цвета формата svg::Rgba. Цвет, заданный как `[255, 200, 23, 0.85]`, должен быть выведен как `rgba(255, 200, 23, 0.85)`.\n\n**Структура словаря routing_settings**\n\n```\n\"routing_settings\": {\n      \"bus_wait_time\": 6,\n      \"bus_velocity\": 40\n}\n```\n\n`bus_wait_time` — время ожидания автобуса на остановке, в минутах. Считайте, что когда бы человек ни пришёл на остановку и какой бы ни была эта остановка, он будет ждать любой автобус в точности указанное количество минут. Значение — целое число от 1 до 1000.\n\n`bus_velocity` — скорость автобуса, в км/ч. Считайте, что скорость любого автобуса постоянна и в точности равна указанному числу. Время стоянки на остановках не учитывается, время разгона и торможения тоже. Значение — вещественное число от 1 до 1000.\nДанная конфигурация задаёт время ожидания, равным 6 минутам, и скорость автобусов, равной 40 километрам в час.\n\n### **Запросы к базе транспортного справочника**\n\n**Запрос на получение информации об автобусном маршруте:**\n\n```\n{\n  \"id\": 12345678,\n  \"type\": \"Bus\",\n  \"name\": \"14\"\n}\n```\n\nКлюч name задаёт название маршрута, для которого приложение должно вывести статистическую информацию.\nВ ответ на этот запрос выдается в виде словаря:\n\n```\n{\n  \"curvature\": 2.18604,\n  \"request_id\": 12345678,\n  \"route_length\": 9300,\n  \"stop_count\": 4,\n  \"unique_stop_count\": 3\n}\n```\n\nВ словаре содержатся ключи: curvature — число типа double, задающее извилистость маршрута. Извилистость равна отношению длины дорожного расстояния маршрута к длине географического расстояния;\n`request_id` — целое число, равное id соответствующего запроса Bus;\n\n`route_length` — целое число, равное длине маршрута в метрах;\n\n`stop_count` — количество остановок на маршруте;\n\n`unique_stop_count` — количество уникальных остановок на маршруте.\nНа кольцевом маршруте, заданном остановками A, B, C, A, количество остановок равно четырём, а количество уникальных остановок равно трём.\nНа некольцевом маршруте, заданном остановками A, B и C, количество остановок равно пяти (A, B, C, B, A), а уникальных — равно трём.\n\nЗапрос на получение информации об автобусной остановке:\n\n```\n{\n  \"id\": 12345,\n  \"type\": \"Stop\",\n  \"name\": \"Улица Докучаева\"\n}\n```\n\nКлюч name задаёт название остановки.\nОтвет на запрос:\n\n```\n{\n  \"buses\": [\n      \"14\", \"22к\"\n  ],\n  \"request_id\": 12345\n}\n```\n\nЗапрос на получение изображения:\n\n```\n{\n  \"type\": \"Map\",\n  \"id\": 11111\n}\n```\n\nОтвет на запрос:\n\n```\n{\n  \"map\": \"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" ?\u003e\\n\u003csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\"\u003e...\\n\u003c/svg\u003e\",\n  \"request_id\": 11111\n}\n```\n\nКлюч map — строка с изображением карты в формате SVG image\n\nЗапрос на построение маршрута между двумя остановками\nПомимо стандартных свойств id и type, запрос содержит ещё два:\n\n`from` — остановка, где нужно начать маршрут.\n\n`to` — остановка, где нужно закончить маршрут.\n\nОба значения — названия существующих в базе остановок. Однако они, возможно, не принадлежат ни одному автобусному маршруту.\n\n```\n{\n      \"type\": \"Route\",\n      \"from\": \"Biryulyovo Zapadnoye\",\n      \"to\": \"Universam\",\n      \"id\": 4\n}\n```\n\nОтвет на запрос:\n\n```\n{\n          \"items\": [\n              {\n                  \"stop_name\": \"Biryulyovo Zapadnoye\",\n                  \"time\": 6,\n                  \"type\": \"Wait\"\n              },\n              {\n                  \"bus\": \"297\",\n                  \"span_count\": 2,\n                  \"time\": 5.235,\n                  \"type\": \"Bus\"\n              },\n              {\n                  \"stop_name\": \"Universam\",\n                  \"time\": 6,\n                  \"type\": \"Wait\"\n              },\n              {\n                  \"bus\": \"635\",\n                  \"span_count\": 1,\n                  \"time\": 6.975,\n                  \"type\": \"Bus\"\n              }\n          ],\n          \"request_id\": 5,\n          \"total_time\": 24.21\n      }\n```\n\n\u003cdetails\u003e\n  \n\u003csummary\u003e Пример файла make_base.json: \u003c/summary\u003e\n\n```\n  {\n      \"serialization_settings\": {\n          \"file\": \"transport_catalogue.db\"\n      },\n      \"routing_settings\": {\n          \"bus_wait_time\": 2,\n          \"bus_velocity\": 30\n      },\n      \"render_settings\": {\n          \"width\": 1200,\n          \"height\": 500,\n          \"padding\": 50,\n          \"stop_radius\": 5,\n          \"line_width\": 14,\n          \"bus_label_font_size\": 20,\n          \"bus_label_offset\": [\n              7,\n              15\n          ],\n          \"stop_label_font_size\": 18,\n          \"stop_label_offset\": [\n              7,\n              -3\n          ],\n          \"underlayer_color\": [\n              255,\n              255,\n              255,\n              0.85\n          ],\n          \"underlayer_width\": 3,\n          \"color_palette\": [\n              \"green\",\n              [\n                  255,\n                  160,\n                  0\n              ],\n              \"red\"\n          ]\n      },\n      \"base_requests\": [\n          {\n              \"type\": \"Bus\",\n              \"name\": \"14\",\n              \"stops\": [\n                  \"Улица Лизы Чайкиной\",\n                  \"Электросети\",\n                  \"Ривьерский мост\",\n                  \"Гостиница Сочи\",\n                  \"Кубанская улица\",\n                  \"По требованию\",\n                  \"Улица Докучаева\",\n                  \"Улица Лизы Чайкиной\"\n              ],\n              \"is_roundtrip\": true\n          },\n          {\n              \"type\": \"Bus\",\n              \"name\": \"24\",\n              \"stops\": [\n                  \"Улица Докучаева\",\n                  \"Параллельная улица\",\n                  \"Электросети\",\n                  \"Санаторий Родина\"\n              ],\n              \"is_roundtrip\": false\n          },\n          {\n              \"type\": \"Bus\",\n              \"name\": \"114\",\n              \"stops\": [\n                  \"Морской вокзал\",\n                  \"Ривьерский мост\"\n              ],\n              \"is_roundtrip\": false\n          },\n          {\n              \"type\": \"Stop\",\n              \"name\": \"Улица Лизы Чайкиной\",\n              \"latitude\": 43.590317,\n              \"longitude\": 39.746833,\n              \"road_distances\": {\n                  \"Электросети\": 4300,\n                  \"Улица Докучаева\": 2000\n              }\n          },\n          {\n              \"type\": \"Stop\",\n              \"name\": \"Морской вокзал\",\n              \"latitude\": 43.581969,\n              \"longitude\": 39.719848,\n              \"road_distances\": {\n                  \"Ривьерский мост\": 850\n              }\n          },\n          {\n              \"type\": \"Stop\",\n              \"name\": \"Электросети\",\n              \"latitude\": 43.598701,\n              \"longitude\": 39.730623,\n              \"road_distances\": {\n                  \"Санаторий Родина\": 4500,\n                  \"Параллельная улица\": 1200,\n                  \"Ривьерский мост\": 1900\n              }\n          },\n          {\n              \"type\": \"Stop\",\n              \"name\": \"Ривьерский мост\",\n              \"latitude\": 43.587795,\n              \"longitude\": 39.716901,\n              \"road_distances\": {\n                  \"Морской вокзал\": 850,\n                  \"Гостиница Сочи\": 1740\n              }\n          },\n          {\n              \"type\": \"Stop\",\n              \"name\": \"Гостиница Сочи\",\n              \"latitude\": 43.578079,\n              \"longitude\": 39.728068,\n              \"road_distances\": {\n                  \"Кубанская улица\": 320\n              }\n          },\n          {\n              \"type\": \"Stop\",\n              \"name\": \"Кубанская улица\",\n              \"latitude\": 43.578509,\n              \"longitude\": 39.730959,\n              \"road_distances\": {\n                  \"По требованию\": 370\n              }\n          },\n          {\n              \"type\": \"Stop\",\n              \"name\": \"По требованию\",\n              \"latitude\": 43.579285,\n              \"longitude\": 39.733742,\n              \"road_distances\": {\n                  \"Улица Докучаева\": 600\n              }\n          },\n          {\n              \"type\": \"Stop\",\n              \"name\": \"Улица Докучаева\",\n              \"latitude\": 43.585586,\n              \"longitude\": 39.733879,\n              \"road_distances\": {\n                  \"Параллельная улица\": 1100\n              }\n          },\n          {\n              \"type\": \"Stop\",\n              \"name\": \"Параллельная улица\",\n              \"latitude\": 43.590041,\n              \"longitude\": 39.732886,\n              \"road_distances\": {}\n          },\n          {\n              \"type\": \"Stop\",\n              \"name\": \"Санаторий Родина\",\n              \"latitude\": 43.601202,\n              \"longitude\": 39.715498,\n              \"road_distances\": {}\n          }\n      ]\n  }\n  ```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n\u003csummary\u003e Пример файла process_requests.json: \u003c/summary\u003e\n\n```\n  {\n      \"serialization_settings\": {\n          \"file\": \"transport_catalogue.db\"\n      },\n      \"stat_requests\": [\n          {\n              \"id\": 218563507,\n              \"type\": \"Bus\",\n              \"name\": \"14\"\n          },\n          {\n              \"id\": 508658276,\n              \"type\": \"Stop\",\n              \"name\": \"Электросети\"\n          },\n          {\n              \"id\": 1964680131,\n              \"type\": \"Route\",\n              \"from\": \"Морской вокзал\",\n              \"to\": \"Параллельная улица\"\n          },\n          {\n              \"id\": 1359372752,\n              \"type\": \"Map\"\n          }\n      ]\n  }\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n\u003csummary\u003e Пример файла result.json: \u003c/summary\u003e\n\n```\n[{\n  \"curvature\": 1.60481,\n  \"request_id\": 218563507,\n  \"route_length\": 11230,\n  \"stop_count\": 8,\n  \"unique_stop_count\": 7\n}, {\n  \"buses\": [\"14\", \"24\"],\n  \"request_id\": 508658276\n}, {\n  \"items\": [{\n    \"stop_name\": \"Морской вокзал\",\n    \"time\": 2,\n    \"type\": \"Wait\"\n  }, {\n    \"bus\": \"114\",\n    \"span_count\": 1,\n    \"time\": 1.7,\n    \"type\": \"Bus\"\n  }, {\n    \"stop_name\": \"Ривьерский мост\",\n    \"time\": 2,\n    \"type\": \"Wait\"\n  }, {\n    \"bus\": \"14\",\n    \"span_count\": 4,\n    \"time\": 6.06,\n    \"type\": \"Bus\"\n  }, {\n    \"stop_name\": \"Улица Докучаева\",\n    \"time\": 2,\n    \"type\": \"Wait\"\n  }, {\n    \"bus\": \"24\",\n    \"span_count\": 1,\n    \"time\": 2.2,\n    \"type\": \"Bus\"\n  }],\n  \"request_id\": 1964680131,\n  \"total_time\": 15.96\n}, {\n  \"map\": \"\u003c?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" ?\u003e\\n\u003csvg xmlns=\\\"http://www.w3.org/2000/svg\\\" version=\\\"1.1\\\"\u003e\\n  \u003cpolyline points=\\\"125.25,382.708 74.2702,281.925 125.25,382.708\\\" fill=\\\"none\\\" stroke=\\\"green\\\" stroke-width=\\\"14\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/\u003e\\n  \u003cpolyline points=\\\"592.058,238.297 311.644,93.2643 74.2702,281.925 267.446,450 317.457,442.562 365.599,429.138 367.969,320.138 592.058,238.297\\\" fill=\\\"none\\\" stroke=\\\"rgb(255,160,0)\\\" stroke-width=\\\"14\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/\u003e\\n  \u003cpolyline points=\\\"367.969,320.138 350.791,243.072 311.644,93.2643 50,50 311.644,93.2643 350.791,243.072 367.969,320.138\\\" fill=\\\"none\\\" stroke=\\\"red\\\" stroke-width=\\\"14\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"/\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"125.25\\\" y=\\\"382.708\\\" dx=\\\"7\\\" dy=\\\"15\\\" font-size=\\\"20\\\" font-family=\\\"Verdana\\\" font-weight=\\\"bold\\\"\u003e114\u003c/text\u003e\\n  \u003ctext fill=\\\"green\\\" x=\\\"125.25\\\" y=\\\"382.708\\\" dx=\\\"7\\\" dy=\\\"15\\\" font-size=\\\"20\\\" font-family=\\\"Verdana\\\" font-weight=\\\"bold\\\"\u003e114\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"74.2702\\\" y=\\\"281.925\\\" dx=\\\"7\\\" dy=\\\"15\\\" font-size=\\\"20\\\" font-family=\\\"Verdana\\\" font-weight=\\\"bold\\\"\u003e114\u003c/text\u003e\\n  \u003ctext fill=\\\"green\\\" x=\\\"74.2702\\\" y=\\\"281.925\\\" dx=\\\"7\\\" dy=\\\"15\\\" font-size=\\\"20\\\" font-family=\\\"Verdana\\\" font-weight=\\\"bold\\\"\u003e114\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"592.058\\\" y=\\\"238.297\\\" dx=\\\"7\\\" dy=\\\"15\\\" font-size=\\\"20\\\" font-family=\\\"Verdana\\\" font-weight=\\\"bold\\\"\u003e14\u003c/text\u003e\\n  \u003ctext fill=\\\"rgb(255,160,0)\\\" x=\\\"592.058\\\" y=\\\"238.297\\\" dx=\\\"7\\\" dy=\\\"15\\\" font-size=\\\"20\\\" font-family=\\\"Verdana\\\" font-weight=\\\"bold\\\"\u003e14\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"367.969\\\" y=\\\"320.138\\\" dx=\\\"7\\\" dy=\\\"15\\\" font-size=\\\"20\\\" font-family=\\\"Verdana\\\" font-weight=\\\"bold\\\"\u003e24\u003c/text\u003e\\n  \u003ctext fill=\\\"red\\\" x=\\\"367.969\\\" y=\\\"320.138\\\" dx=\\\"7\\\" dy=\\\"15\\\" font-size=\\\"20\\\" font-family=\\\"Verdana\\\" font-weight=\\\"bold\\\"\u003e24\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"50\\\" y=\\\"50\\\" dx=\\\"7\\\" dy=\\\"15\\\" font-size=\\\"20\\\" font-family=\\\"Verdana\\\" font-weight=\\\"bold\\\"\u003e24\u003c/text\u003e\\n  \u003ctext fill=\\\"red\\\" x=\\\"50\\\" y=\\\"50\\\" dx=\\\"7\\\" dy=\\\"15\\\" font-size=\\\"20\\\" font-family=\\\"Verdana\\\" font-weight=\\\"bold\\\"\u003e24\u003c/text\u003e\\n  \u003ccircle cx=\\\"267.446\\\" cy=\\\"450\\\" r=\\\"5\\\" fill=\\\"white\\\"/\u003e\\n  \u003ccircle cx=\\\"317.457\\\" cy=\\\"442.562\\\" r=\\\"5\\\" fill=\\\"white\\\"/\u003e\\n  \u003ccircle cx=\\\"125.25\\\" cy=\\\"382.708\\\" r=\\\"5\\\" fill=\\\"white\\\"/\u003e\\n  \u003ccircle cx=\\\"350.791\\\" cy=\\\"243.072\\\" r=\\\"5\\\" fill=\\\"white\\\"/\u003e\\n  \u003ccircle cx=\\\"365.599\\\" cy=\\\"429.138\\\" r=\\\"5\\\" fill=\\\"white\\\"/\u003e\\n  \u003ccircle cx=\\\"74.2702\\\" cy=\\\"281.925\\\" r=\\\"5\\\" fill=\\\"white\\\"/\u003e\\n  \u003ccircle cx=\\\"50\\\" cy=\\\"50\\\" r=\\\"5\\\" fill=\\\"white\\\"/\u003e\\n  \u003ccircle cx=\\\"367.969\\\" cy=\\\"320.138\\\" r=\\\"5\\\" fill=\\\"white\\\"/\u003e\\n  \u003ccircle cx=\\\"592.058\\\" cy=\\\"238.297\\\" r=\\\"5\\\" fill=\\\"white\\\"/\u003e\\n  \u003ccircle cx=\\\"311.644\\\" cy=\\\"93.2643\\\" r=\\\"5\\\" fill=\\\"white\\\"/\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"267.446\\\" y=\\\"450\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eГостиница Сочи\u003c/text\u003e\\n  \u003ctext fill=\\\"black\\\" x=\\\"267.446\\\" y=\\\"450\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eГостиница Сочи\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"317.457\\\" y=\\\"442.562\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eКубанская улица\u003c/text\u003e\\n  \u003ctext fill=\\\"black\\\" x=\\\"317.457\\\" y=\\\"442.562\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eКубанская улица\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"125.25\\\" y=\\\"382.708\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eМорской вокзал\u003c/text\u003e\\n  \u003ctext fill=\\\"black\\\" x=\\\"125.25\\\" y=\\\"382.708\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eМорской вокзал\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"350.791\\\" y=\\\"243.072\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eПараллельная улица\u003c/text\u003e\\n  \u003ctext fill=\\\"black\\\" x=\\\"350.791\\\" y=\\\"243.072\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eПараллельная улица\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"365.599\\\" y=\\\"429.138\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eПо требованию\u003c/text\u003e\\n  \u003ctext fill=\\\"black\\\" x=\\\"365.599\\\" y=\\\"429.138\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eПо требованию\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"74.2702\\\" y=\\\"281.925\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eРивьерский мост\u003c/text\u003e\\n  \u003ctext fill=\\\"black\\\" x=\\\"74.2702\\\" y=\\\"281.925\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eРивьерский мост\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"50\\\" y=\\\"50\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eСанаторий Родина\u003c/text\u003e\\n  \u003ctext fill=\\\"black\\\" x=\\\"50\\\" y=\\\"50\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eСанаторий Родина\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"367.969\\\" y=\\\"320.138\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eУлица Докучаева\u003c/text\u003e\\n  \u003ctext fill=\\\"black\\\" x=\\\"367.969\\\" y=\\\"320.138\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eУлица Докучаева\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"592.058\\\" y=\\\"238.297\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eУлица Лизы Чайкиной\u003c/text\u003e\\n  \u003ctext fill=\\\"black\\\" x=\\\"592.058\\\" y=\\\"238.297\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eУлица Лизы Чайкиной\u003c/text\u003e\\n  \u003ctext fill=\\\"rgba(255,255,255,0.85)\\\" stroke=\\\"rgba(255,255,255,0.85)\\\" stroke-width=\\\"3\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" x=\\\"311.644\\\" y=\\\"93.2643\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eЭлектросети\u003c/text\u003e\\n  \u003ctext fill=\\\"black\\\" x=\\\"311.644\\\" y=\\\"93.2643\\\" dx=\\\"7\\\" dy=\\\"-3\\\" font-size=\\\"18\\\" font-family=\\\"Verdana\\\"\u003eЭлектросети\u003c/text\u003e\\n\u003c/svg\u003e\",\n  \"request_id\": 1359372752\n}]\n```\n\u003c/details\u003e\n\n## **Системные требования**\nC++17 и выше\n\nProtobuf 3\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgleor%2Fcpp-transport-catalogue","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgleor%2Fcpp-transport-catalogue","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgleor%2Fcpp-transport-catalogue/lists"}