Добавил:
ИВТ (советую зайти в "Несортированное")rnПИН МАГА Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Баранов_В_С_Пояснительная_записка.docx
Скачиваний:
37
Добавлен:
03.07.2025
Размер:
9.83 Mб
Скачать

2.3. Ручной ввод координат и параметров полета

Реализованный функционал позволяет пользователю вручную задавать координаты и настраивать параметры полета БПЛА через веб-интерфейс. Это обеспечивает гибкость при планировании маршрутов и интеграции с аппаратурой.

1. Механизм ввода координат

Способы задания точек:

Текстовые поля:

Широта и долгота вводятся в формате 56.936596, 65.796525 (десятичные градусы).

Пример валидации на серверной части:

if not (isinstance(start_point, list) and len(start_point) == 2:

return jsonify({"error": "Invalid start_point format"}), 400

если неверно введена начальная точка (isinstance(start_point, list) - проверяет являются ли введенные данные списком, а len(start_point) == 2 – проверяет, что в списке только 2 элемента), то пользователю будет выведена ошибка.

Интерактивная карта:

Пользователь кликает на карте (Yandex Maps), чтобы установить маркеры.

Координаты автоматически передаются в форму через JavaScript:

// Фрагмент из пользовательского интерфейса

map.events.add('click', function (e) {

const coords = e.get('coords');

document.getElementById('latitude').value = coords[0].toFixed(5);

document.getElementById('longitude').value = coords[1].toFixed(5);

});

В данном коде происходит обработка кликов по карте. Сначала передается широта, а потом долгота

2. Параметры полета

Настраиваемые параметры:

Скорость (м/с): Ограничение: > 0 (проверка в коде):

if speed <= 0:

return jsonify({"error": "Speed must be positive"}), 400

Высота (м): Ограничение: 10–500 м (для безопасности полета).

пользовательский интерфейс (HTML):

<input type="number" id="speed" step="0.1" min="1" max="50" required>

<input type="number" id="altitude" min="10" max="500" required>

4. Обработка ошибок

Сценарии:

Некорректный формат координат (например, 91.12345 для широты):

# Проверка диапазонов на серверной части.

if not (-90 <= lat <= 90) or not (-180 <= lon <= 180):

return jsonify({"error": "Coordinates out of bounds"}), 400

Нечисловые значения параметров:

if isinstance(speed, str):

return jsonify({"error": "Speed must be a number"}), 400

Визуализация ошибок: В пользовательском интерфейсе выводятся уведомления через alert()  (рис. 2.3.1).

Рисунок 2.3.1 Пример работы обработчика ошибок

2.4. Генерация kmz-файлов

Функционал генерации KMZ-файлов реализован для экспорта маршрутов БПЛА в GIS-системы (Google Earth, QGIS). Формат KMZ представляет собой ZIP-архив, содержащий KML-файл с геоданными, что обеспечивает совместимость с большинством картографических платформ.

Блок-схема алгоритма генерации KMZ-файла можно увидеть в приложении 2

Алгоритм генерации

Создание KML-структуры:

Используется библиотека xml.etree.ElementTree для формирования XML-документа:

kml = ET.Element("kml", xmlns="http://www.opengis.net/kml/2.2") #создание элемента

document = ET.SubElement(kml, "Document") #создаю контейнер внутри KML

placemark = ET.SubElement(document, "Placemark") # создаю элемент для описания географического объекта

line_string = ET.SubElement(placemark, "LineString") # элемент для задания линейного объекта (путь)

coordinates_element = ET.SubElement(line_string, "coordinates") #указание координат линии

Координаты маршрута преобразуются в строку формата долгота,широта,высота:

coords_text = ' '.join([f"{coord[1]},{coord[0]},0" for coord in coordinates])

coordinates_element.text = coords_text

Сохранение KML: Сгенерированный XML-документ сохраняется во временный файл route.kml:

kml_tree.write(kml_file_path)

Упаковка в KMZ: Файл route.kml архивируется в ZIP-архив с расширением .kmz с использованием библиотеки zipfile:

with zipfile.ZipFile(kmz_file_path, 'w', zipfile.ZIP_DEFLATED) as kmz:

kmz.write(kml_file_path, 'doc.kml')

Временный KML-файл удаляется после создания архива.

Пример KML-структуры

<kml xmlns="http://www.opengis.net/kml/2.2">

<Document>

<Placemark>

<name>Маршрут</name>

<LineString>

<coordinates>

37.61730,55.75583,0 30.33510,59.93428,0

</coordinates>

</LineString>

</Placemark>

</Document>

</kml>

Обработка ошибок

Отсутствие координат: Если маршрут не задан, возвращается HTTP-ошибка 400:

if not coordinates:

return jsonify({"error": "Нет данных для маршрута"}), 400

Проблемы с файловой системой: Ошибки записи/чтения файлов логируются и обрабатываются через try-except:

except Exception as e:

logging.error(f"Ошибка при создании KMZ: {str(e)}")

return jsonify({"error": "Ошибка при создании KMZ"}), 500

Интеграция с интерфейсом

Скачивание файла: Ссылка на KMZ возвращается в JSON-ответе и отображается в интерфейсе:

{"kmz_url": "/static/route.kmz"}

Файл скачивается с веб-интерфейса (рис.2.4.1)

Рисунок 2.4.1 Скачанный файл маршрута

Визуализация: Пример KMZ-файла, открытого в Google Earth, демонстрирует маршрут с заданными точками (рис. 2.4.2).

Рисунок 2.4.2 Пример KMZ-файла, открытого в Google Earth