Основной областью применения ОС «Нейтрино» являются встраиваемые системы для обработки данных и управления оборудованием в реальном времени без участия оператора. Однако Нейтрино обладает и развитыми графическими возможностями, что позволяет строить на ее основе разнообразные бортовые индикаторы, мобильные устройства и многодисплейные АРМы операторов. В подобных устройствах зачастую необходимо решать задачи, связанные с обработкой и визуализацией цифровой картографической информации (ЦКИ), такие как навигация, анализ и моделирование обстановки или схожие с ними задачи.
Традиционно наши заказчики самостоятельно решали задачи обработки ЦКИ в среде Нейтрино, разрабатывали собственные библиотеки и строили на их основе специализированные ГИС. Такой подход имеет свои преимущества, поскольку он позволяет гибко учитывать специфику требований к конечной системе или комплексу в части работы с ЦКИ и, кроме того, наработанные при этом компетенции и результаты интеллектуальной деятельности остаются «внутри» предприятия. Тем не менее не все предприятия обладают необходимыми ресурсами и компетенциями, а задачи решать нужно и сроки часто «поджимают». Кроме того, возникают и чисто технические вопросы, например, как повысить производительность визуализации ЦКИ и в целом эффективно задействовать аппаратные возможности вычислительных платформ.
Таким образом, на рынке появилась потребность в программном решении для работы с ЦКИ в «Нейтрино», которое бы обладало следующими качествами:
поддержка основных используемых промышленностью векторных и растровых форматов ЦКИ;
оптимизированная работа на вычислительных платформах с различными процессорными архитектурами, в том числе отечественными;
гибкая и простая интеграция с приложениями функционального ПО.
В 2016 году наша компания занялась работами в области электронной картографии, в результате которых был разработан специализированный пакет (фреймворк) для ОС «Нейтрино», получивший название Программный комплекс поддержки работы с цифровой картографической информацией «ПК ЦКИ». Картографический пакет ПК ЦКИ нашел применение, как в морской корабельной тематике, так и в наземных комплексах. К настоящему времени ПК ЦКИ является зрелым хорошо задокументированным продуктом, включенным в реестр российского ПО.
Картографический пакет работает под управлением защищенных ОС реального времени «Нейтрино» и «Нейтрино-Э» на широком спектре аппаратных платформ, в том числе российских, с процессорными архитектурами:
x86
ARM
PowerPC
Эльбрус
MIPS
Основные возможности картографического пакета:
Обеспечение решения задач анализа и моделирования оперативной обстановки, в том числе с построением рельефной модели местности.
Визуализация геопространственной информации с учётом имеющихся механизмов аппаратного ускоерния и особенностей применяемых вычислительных средств.
Оптимизация управления вычислительными ресурсами с учетом специфики различных процессорных архитектур.
В этой статье мы расскажем об архитектуре, возможностях и принципах использования нашего картографического пакета и проинформируем о планах его развития.
Архитектура
Основа картографического пакета - сервис, именуемый ядром, который взаимодействует с картами в файловой системе, отслеживает их, по необходимости конвертирует их во внутренний формат GCM, выдаёт карты пользователям в разделяемую область памяти (РОП). Типовой сценарий запуска картографического сервиса таков:
После успешного запуска сервиса, пользовательские приложения могут установить соединение с ним и выполнять требуемые задачи при помощи API, предоставляемого библиотеками картографического сервиса.
Пример кода для установления соединения с ядром (обработка кодов возврата опущена):
#include <gis/gishelper.h>
# Уникальный идентификатор приложения
int user_id = 777;
gis_core_connection_t connection;
gis_core_request_parameters_t map;
# Инициализируем объект соединения с картографическим ядром
gis_core_link_init( &connection );
# Устанавливаем соединение с ядром
gis_core_link_connect( &connection, user_id );
# Подключаем разделяемую область памяти к данному процессу
gis_core_databuffer_attach( &connection );
# Заполняем разделяемую область памяти
gis_core_databuffer_data_request( &connection, &map, true );
Форматы карт
Картографический пакет осуществляет работу как с векторными, так и с растровыми данными. На данный момент, поддерживаются следующие векторные форматы:
SXF (Storage and eXchange Format) – открытый формат хранения топографических карт. Для отображения SXF требуется цифровой классификатор в формате RSC.
S-57 - морские навигационные карты формата IHO S-57 ENC (ISO/EIC 8211), также возможно распространение карт, закодированных по стандарту IHO S-63, и визуализация информации в соответствии с рекомендациями формата IHO S-52.
Shapefile – формат для для хранения объектов, описываемых геометрией и сопутствующими атрибутами. Как правило, карта состоит из множества файлов – по одному файлу на каждый тип объекта. Для отображения Shapefile используется описатель слоёв в формате XML, именуемый SLD.
Растровые форматы могут быть поддержаны в том объёме, в каком осуществлена их поддержка в небезывестной в среде картографических технологий библиотеке GDAL. Однако, ввиду непопулярности у заказчиков многих растровых форматов, наш программный комплекс выполняет сборку библиотеки GDAL в особой, “легковесной” конфигурации, что позволяет сократить объём памяти на целевой машине и исключить возникновение багов от самой библиотеки GDAL в неожиданных сценариях, например, при работе с каким- то редким устаревшим форматом карт. Резюмируя вышесказанное, отметим поддерживаемые растровые форматы:
Данные в этих форматах могут иметь различный характер. Это может быть как одноканальный растр, который используется как матрица высот, так и трёхканальный RGB-растр, содержащий в себе данные аэрофотосъёмки.
Привязка геоданных может быть как зашита в сам файл карты, так и поставляться в отдельном текстовом файле географической привязки (world-файле).
Имеется поддержка уменьшенных копий растров для оптимизации рендеринга. На картинке ниже видно, как меняется размер уменьшенной копии в зависимости от текущего масштаба отображения. Изображение слева размером 2500х2500 пикселей, а изображение справа размером уже 79х79 пикселей, то есть информации содержится почти в 1000 раз меньше!
Подведём итог вышесказанному в виде наглядной диаграммы:
Возможности
При запуске картографического сервиса или синхронизации данных с локальным хранилищем, карты из исходного формата конвертируются во внутренний формат GCM. Конвертируются как векторные, так и растровые карты – формат универсален. Взаимодействие пользовательских приложений с какими-либо данными о картах осуществляется через внутренний формат GCM с помощью предоставляемого API. Например, можно получить координаты левого верхнего угла карты, получить блок растровых данных или объект векторной карты с атрибутами.
Визуализация происходит при помощи собственного движка визуализации Surface Manager, который выполняет рендеринг объектов на предоставляемой графической подсистемой поверхности при помощи средств рисования Qt. Движок также выполняет задачи фильтрации объектов, генерализации, проецирования.
Для визуализации карт необходимо создать в пользовательском приложении создать объект контекста движка. При желании, можно создать несколько экземпляров таких объектов, каждый из которых будет оперировать с разными картами из разделяемой области памяти. Каждый такой экземпляр оперирует тремя слоями: для растровых карт, для векторных карт и для пользовательских объектов. При необходимости, порядок слоёв можно изменять, какие-то слои можно отключать, а также можно управлять форматами карт, которые должны отображаться на данном слое. Например, на поверхности растровых карт оставить только карты формата GeoTIFF. Типовой порядок поверхностей представлен на картинке ниже и подразумевает визуализацию всех форматов карт.
Слой под номером 3 – слой пользовательских объектов. На него можно добавлять объекты для внесения оперативных сведений об окружающей обстановке. Поддерживаются простейшие примитивы, координаты точек которых можно привзяать к каким-либо географическим ориентирам. Существует возможность настройки параметров генерализации, параметров заливки. При необходимости, слой можно отключать и включать обратно. Ниже представлен пример кода, реализующий добавление выделительной красной линии вокруг некоторого интересующего нас объекта (обработка кодов возврата опущена). В пользовательских приложениях можно обернуть подобные вызовы в красивую оболочку с интерфейсом, который придётся по вкусу.
void add_selection_line( gis_render_sm_context_t *sm_ctx,
gis_object_t *object )
{
uint32_t color = 0xF0FF0000;
uint32_t pen_width = 3;
QVector<double_point_t> points;
userobject_t selection_line;
/*Заполнение вектора points точками объекта object */
...
selection_line = gis_render_sm_userdata_add_polyline( sm_ctx,
points.data(),
object->point_count,
color,
pen_width,
0 );
gis_render_sm_redraw_userobject( sm_ctx, true );
}
Получение информации об объекте векторной карты (обработка кодов возврата опущена):
void display_object_info( gis_data_engine_context_t *data_engine_ctx,
object_point_t point_click )
{
gis_object_t object;
gis_borders_t region;
std::vector<ClassifierInfo> classifiers;
std::vector<gis_core_class_code_t> class_list;
// Получаем у контекста движка рендеринга информацию об активных классификаторах и слоях
gis_object_init( &object );
gis_data_engine_get_classifier_list( data_engine_ctx, classifiers );
gis_data_engine_get_class_list( data_engine_ctx, classifiers, class_list );
// Указываем интересующую нас область (в градусах), в которой искать ближайший объект
// Можно указать границы экрана, также переведенные в градусы
region_of_interest.degrees.west = 20.4;
region_of_interest.degrees.east = 20.6;
region_of_interest.degrees.south = 45.6;
region_of_interest.degrees.north = 45.8;
// Составляем список объектов внутри интересующей нас области
// Затем ищем ближайший объект к месту клика мышкой и сохраняем его информацию
GisObjectList object_list( ®ion, class_list);
int idx = object_list.find_nearest_object( point_click );
object_list.get_object( idx, &object );
// Используем информацию об объекте интересующим нас образом
printf( "Found object - type: %d, acronym: %s, points: %d",
object.type,
object.class_acronym,
object.point_count );
gis_object_free( &object );
}
Демонстрационные приложения
Картографический фреймворк поставляется не только в виде бинарных компонентов и прилагающейся к ним документацией, но и вместе с исходными текстами демонстрационных приложений, которые содержат наглядный пример того, как пользоваться предоставляемым API для выполнения собственных задач.
Монитор
Позволяет просмотреть список загруженных в разделяемую область памяти карт, ознакомиться с основной информацией о каждой карте, а также взаимодействовать с картографическим ядром – например, обновить список карт или классификаторов. Осуществляет централизованное управление картографическим сервисом, контроль наполнения локального хранилища, синхронизация и учёт изменений в нем, настройка фильтров конвертера, формирование рабочих наборов картографической информации, визуализация содержимого локального хранилища с учетом характеристик объектов, запуск программ визуализации картографической информации.
Средство просмотра
Непосредственно визуализатор картографической информации. Может быть открыт самостоятельно, а может быть открыт из приложения "Монитор" посредством двойного щелчка по имени карты или красной области в окне общего просмотра.
В приложении “Средство просмотра” реализовано множество возможностей предоставляемого API:
И многое другое, со всем спектром предоставляемого API можно ознакомиться в документации, речь о которой пойдет ниже.
Документация
Документация к продукту в формате HTML доступна онлайн по этой ссылке. Попасть на эту страницу также можно и с сайта нашей организации ООО «СВД ВС», перейдя в раздел Помощь. Эта же документация поставляется в виде автономного плагина Eclipse, то есть представляет собой набор HTML-страниц для локального использования на инструментальной машине.
Также документация к продукту поставляется еще и в виде PDF документа. Прочитать о нашем инструменте генерации документации можно в этой статье.
Вдобавок, в комплекте поставляется документация в формате, поддерживаемом средой разработки Qt Creator. Это позволяет писать код и читать документацию, не переключаясь между IDE и браузером.
В рабочий процесс команды разработчиков внедрена система CI/CD, позволяющая нам непрерывно следить за состоянием продукта, ускорять процессы сборки и развертывания проекта, а также автоматизировать процессы тестирования и генерации документации. Например, после каждой сборки проекта мы получаем отчёт о покрытии публичного API страницами документации.
Перспективы развития
Продукт на постоянной основе развивается и совершенствуется. На ближайшее будущее нашей командой запланированы следующие нововведения и улучшения:
Расширение списка поддерживаемых аппаратных платформ (AArch64 и др.)
Внедрение навигационного API (построение графа дорог и путей, построение маршрутов по графу)
Поддержка GPS/ГЛОНАСС
Визуализация матриц высот в 3D
Возможность получать срезы матриц высот
Обновление пользовательского интерфейса демонстрационных приложений по части удобства использования на портативных устройствах (Mobile UI)
и множество прочих, нацеленных на расширение сфер применимости продукта.
Спасибо за уделённое время и внимание!