ЛР 08. Выбираем место для офиса по геоданным

Восемь условных сотрудников и способы их передвижения

Работа выполняется на учебном стенде.

Цель работы

Научиться читать и использовать данные в форматах CSV, JSON и GeoJSON на практическом примере. Вы загрузите список сотрудников и кандидатов в офисы, запросите зоны доступности, увидите их пересечение на карте и выберете подходящие адреса.

Задача

Команда выбирает место для офиса в Чебоксарах. Есть восемь условных сотрудников и пять адресов-кандидатов. Для каждого сотрудника дорога до офиса должна занимать не более 30 минут с учётом указанного в таблице способа передвижения. Нужно определить, какие адреса подходят всей команде.

Сотрудники и их имена придуманы для учебного примера. Расчёт времени и контуры доступности основаны на упрощённой модели; карта показывает результат этой модели, а не обещание фактического времени поездки.

Работа выполняется индивидуально в браузере. Устанавливать программы, писать код или сдавать отдельный файл не нужно. Запросы отправляются через Swagger UI на странице стенда, а результат каждого шага появляется на карте.

Как устроен GeoJSON

GeoJSON — это формат JSON для географических объектов. В нём отдельно записываются геометрия объекта и его свойства. Например, точка офиса может выглядеть так:

{
  "type": "Feature",
  "properties": {
    "id": "A",
    "address": "Примерная улица, 1"
  },
  "geometry": {
    "type": "Point",
    "coordinates": [47.20, 56.15]
  }
}

properties хранит описательные поля, а geometry — тип и координаты геометрии. У Point это одна пара координат; у Polygon, который сервер возвращает для зоны доступности, координаты задают контур. Несколько объектов часто объединяются в FeatureCollection — именно так представлены офисы.

В массиве GeoJSON координаты идут в порядке долгота, широта. В JSON-теле запроса на построение зоны они передаются отдельными полями latitude и longitude, поэтому при заполнении запроса важно не перепутать значения.

Перед началом

  1. Откройте страницу локального стенда, которую покажет преподаватель.
  2. Зарегистрируйтесь, указав свои фамилию, имя и группу. Нажмите Получить токен. Токен подключается автоматически; сохраните его на время занятия, чтобы при необходимости восстановить сессию.
  3. Не передавайте токен другим людям и не указывайте в форме чужие или другие персональные данные. Сессия и запросы записываются под заявленными вами фамилией, именем и группой.

Слева находится карта и счётчик обработанных сотрудников. Справа — список операций API и их ответов. Для отправки каждого запроса нажмите Try it out, заполните данные и нажмите Execute.

Ход работы

1. Загрузите сотрудников из CSV

Выполните GET /employees.csv. Проверьте, что сервер вернул код 200 и таблицу из восьми записей. В ней есть поля:

После загрузки на карте появятся аватарки сотрудников. Значок внутри аватарки показывает способ передвижения; зелёная галочка появится после построения зоны для этого сотрудника. Первый этап будет отмечен в списке запросов.

2. Загрузите офисы из GeoJSON

Выполните GET /offices.geojson. Сервер вернёт FeatureCollection с пятью объектами Feature. Посмотрите их properties: там находятся код и адрес офиса. В geometry у каждого офиса указана точка Point.

В массиве координат GeoJSON порядок такой: долгота, широта. На карте появятся пять офисов с кодами. Сохраните коды: они понадобятся при отправке решения.

Сотрудники и кандидаты в офисы после загрузки CSV и GeoJSON

3. Постройте зоны доступности сотрудников

Для каждого сотрудника из CSV выполните POST /isochrones. В запросе укажите его широту, долготу и способ передвижения. Предел времени во всех запросах — 30 минут.

Например, тело запроса для Анны:

{
  "latitude": 56.1458246,
  "longitude": 47.2664731,
  "mode": "walk",
  "minutes": 30
}

Здесь координаты передаются отдельными именованными полями JSON. Не перепутайте их с порядком координат в массиве GeoJSON: там сначала идёт долгота, затем широта. Для велосипедистов используйте значение bike, для остальных — walk.

После успешного запроса сервер вернёт GeoJSON-объект Feature с геометрией зоны и добавит сотрудника в счётчик. Карта обновляется после каждого запроса. На снимке показан промежуточный результат для двух сотрудников из восьми: зоны пересеклись, но в пересечение пока попадает несколько офисов. Это только пример того, как меняется карта; по нему ещё нельзя выбирать офис.

Предварительное пересечение после двух запросов из восьми

Продолжайте, пока не отправите запросы по всем восьми строкам CSV. Когда счётчик покажет 8 из 8, заштрихованная область будет итоговым пересечением для всей команды.

4. Выберите подходящие офисы

Сравните точки офисов с итоговой заштрихованной областью. Выберите все офисы, которые подходят каждому сотруднику, и отправьте POST /decision. В тело запроса впишите коды из GeoJSON:

{
  "office_ids": ["код_офиса_1", "код_офиса_2"]
}

Замените примеры кодов на найденные вами. Если выбор принят, статус под картой подсветится зелёным и появится сообщение, что осталось отправить работу. Если ответ содержит accepted: false, внимательно сравните офисы с общей областью, исправьте список и отправьте запрос ещё раз. Повторно строить зоны не нужно.

Подтверждённое решение и следующий шаг

5. Отправьте работу

После подтверждения выбора выполните POST /submit. Проверьте ответ: для зачтённой работы поле result должно содержать passed. На странице появится постоянный зелёный статус о выполнении работы и сохранении результата в системе.

Работа выполнена и зачтена

Критерии выполнения

Работа считается выполненной, когда:

Стенд записывает действия и результат автоматически. Скриншоты и отдельный отчёт от студента не требуются. Будьте готовы коротко объяснить преподавателю, чем CSV отличается от JSON и GeoJSON, и почему порядок координат в теле запроса отличается от порядка координат в GeoJSON.

Если запрос не сработал

Условия расчёта

В этой работе используется зафиксированная учебная модель: пешком — 4,5 км/ч, на велосипеде — 12 км/ч; маршруты построены по данным сети OpenStreetMap. Контуры на карте приближённо показывают достижимую область и её пересечение. Результат нужен для изучения форматов и работы с данными и не является официальной оценкой транспортной доступности.